剪枝计算机,α-β剪枝 - 电脑黑白棋 - 黑白棋天地

news/2024/7/3 1:48:56 标签: 剪枝计算机

α-β剪枝算法

前面介绍的基本搜索算法,在实际应用是是十分费时的,因为它需要考虑所有可能的棋步。有研究表明,在黑白棋的中盘阶段,平均每个局面大约有10步棋可供选择[1]。如果程序前瞻10步(搜索深度为10),就需要考虑大约100亿个局面。假设计算机以每秒1000万个局面的速度进行运算,每下一步棋大约需要运算十几分钟。因此,在有限的时间内,程序无法进行很深的搜索,这就大大制约了程序的棋力。

有没有更高效的搜索方法呢?Edwards、Timothy(1961年)[2]、Brudno(1963年)[3]等人相继在研究中发现,程序搜索过程中有很多局面是完全可以忽略的,并提出了α-β剪枝算法(Alpha-beta Pruning)。我们就仍以图1所示的局面为例,简要说明剪枝算法的原理。

f53b717ea200b57c5cb957cbfa9112a5.png

图1 白先,当前最佳估值为0

假设白棋已经搜索了D6的后续变化,得出这步棋的估值为0。接着开始搜索F4这步棋,白棋下F4后形成图2所示的局面。

0011e31d61c8c2b904090f96ce2f43e4.png

图2 黑先,当前最佳估值为+6

在这一局面中,黑棋相继搜索了C3、D3、E3三步棋,当前最佳估值是E3的+6。作为黑棋方,他是很乐意看到有E3这样的好棋,他也很希望尚未进行搜索的F3和G3能有更好的表现。但问题是,黑棋能遇上E3这样好棋的前提是白棋要先下出F4,下F4的决定权在于白棋方。而对于白棋而言,黑棋的这步E3回应显然对他太不利了。在他看来,F4这步棋的估值最多只有-6,甚至有可能更差。当白棋知道黑棋将有一步好棋E3在等着他时,他是绝对不会去下F4的,因为他完全可以选择下D6,或者等待后续搜索中可能出现的更好棋步。换句话说,黑棋根本没有机会面对图2所示的局面,F3和G3这两步棋的结果已经无关紧要了,黑棋没有必要再继续搜索下去。我们将这种现象称为剪枝(Pruning)。

这看上去是个相当诡异的现象,黑棋从自己的利益出发,努力寻找尽可能好的棋步,但是一旦他的棋步好过头了,对于当前局面的搜索工作就瞬间变成是多余的。黑棋搜索过程中这种微妙的界限就来自于上一层白棋的当前估值下限,考虑到下棋方轮换所带来的影响,白棋当前的估值下限通过取负值后,传递给下一层黑棋作为估值上限。我们将估值下限记为α,将估值上限记为β。我们只要将基本搜索算法稍加修改,就能得到α-β剪枝算法:

int alpha_beta(int alpha, int beta, int depth, int pass = 0){

// 当前最佳分值,预设为负无穷大

int best_value = -INF_VALUE;

// 尝试每个下棋位置

for (int pos=A1; pos<=H8; ++pos) {

// 试着下这步棋,如果棋步合法

if (make_move(pos)) {

int value;

// 如果到达预定的搜索深度,直接给出局面估值

if (depth <= 1) value = -evaluation();

// 否则,对所形成的局面进行递归搜索

else value = -alpha_beta(-beta, -alpha, depth - 1);

// 撤消棋步

undo_move(pos);

// 如果这步棋引发剪枝

if (value >= beta) {

// 立即返回当前最佳结果

return value;

}

// 如果这步棋更好

if (value > best_value) {

// 保存更好的结果

best_value = value;

// 更新估值下限

if (value > alpha) alpha = value;

}

}

}

// 如果没有合法棋步

if (best_value == -INF_VALUE) {

// 如果上一步棋也是跳步,表明对局结束

if (pass) {

// 直接给出精确比分

best_value = get_score();

// 否则这步棋跳步

} else {

make_pass();

// 递归搜索,并标明该跳步

best_value = -alpha_beta(-beta, -alpha, depth, 1);

// 撤消跳步

undo_pass();

}

}

// 返回最佳结果

return best_value;

}

我们引进了估值上、下限参数alpha和beta,它们在递归运算过程中逐层向下传递。上一层搜索的上限和下限在取负值后,分别成为下一层搜索的下限和上限。每当搜索到的估值触及当前搜索层的估值上限beta值时,就引发剪枝。

这里我们注意到,估值下限α值也是由上一层搜索的估值上限取负值而来,其目的是使更下一层的搜索加速引发剪枝。而这样做所带来的“副作用”是,由于在下一层提前剪枝,有可能返回被高估的估值(因为下一层剪枝时被低估了)。但进一步研究表明,如果当前局面存在更好的估值,此高估的估值将被取代;而如果此高估的估值就是当前局面的最佳估值,由于它不会超过估值下限α值(也就是上一层估值上限的负值),它必将在上一层引发剪枝;在这两种情况下,估值是否被高估都将带来相同的结果。当然,这仅仅是原理性的说明,高德纳与Moore(1975年)[4]已经严格证明了α-β剪枝算法的正确性。

从上面的分析可以看出,α-β剪枝算法真正关注的是(α, β)区间内的估值。而对于区间之外的估值,由于会引发剪枝,所得到的估值并不一定是其实际值。因此在搜索的最顶层,为了得到准确的估值,搜索区间应选取最大可能的估值区间,例如:(-64, 64)。而在那些只需知道胜负结果、而无需知道准确比分的场合,可以选取(-1, 1)作为(α, β)区间。

由于存在剪枝情况,程序真正需要搜索的局面数量将大大减少。实践表明,加入α-β剪枝算法后,同样是中盘向前搜索10步的情况,程序平均每步棋只需考虑100万数量级的局面。相对于没有α-β剪枝时的100亿个局面来说,搜索效率明显提高。正是由于这种高效性,当今强大的黑白棋程序(也包括其他的棋类程序),都无不例外地采用α-β剪枝算法及其变形,并在此基础上进行改进、增强。

[1] Louis Victor Allis. Searching for Solutions in Games and Artificial Intelligence. University of Limburg, Maastricht, The Netherlands, 1994, ISBN 90-9007488-0.

[2] Daniel Edwards, Timothy Hart. The Alpha-Beta Heuristic (AIM-030). Massachusetts Institute of Technology, 1961.

[3] T.A. Marsland. Computer Chess Methods. J. Wiley & Sons., 1987, 5:159–171.

[4] Donald E. Knuth, Ronald W. Moore. An Analysis of Alpha-Beta Pruning. Artificial Intelligence, 1975, 6(4): 293-326.


http://www.niftyadmin.cn/n/963427.html

相关文章

PDF.NET不使用DalFactory和IDAL支持多种数据库应用方案

MS的PetShop示例应用程序的“多层架构”被很多.NET开发人员奉为经典的架构&#xff0c;我以前做的项目团队的Leader也是照搬它的&#xff0c;甚至来到现在这个公司后&#xff0c;好几个新来的同事建解决方案也是照搬PetShop的架构&#xff0c;可见PetShop对大家影响之深。 下面…

javascript 装逼风格(部分)

1.用感叹号将非布尔值转化为布尔值&#xff08;感叹号可以把所有的东西都变成布尔值&#xff09; var str "abc"; console.log(!str);2.双波浪号的妙用&#xff0c;将内容转化为数字,或者小数取整&#xff08;双波浪号的取整是直接去掉小数点后的小数&#xff09; v…

64位LabVIEW64可以调用32位的DLL吗

64位LabVIEW64可以调用32位的DLL吗 在用64位的LabVIEW中调用库函数节点时选择一个32位DLL时&#xff0c;得到一个对话框提示&#xff1a; ​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​ 为什么会显示这个错误&#xff1f;可以在64位LabV…

ASP.net 路径问题详解

各位有没有碰到在日常工作中经常在路径设置的时候把 "~/ 、./ 、../ 、 / 、http://www.cnblogs.com/"这些符号搞混搞乱了&#xff1f;偶尔还会因路径的问题郁闷了半天 还以为是程序上出了问题了。以下我是转自--脚本之家 里的一篇技文&#xff0c;略作修改&#xff…

LabVIEW开发汽车惯性导航系统测试

LabVIEW开发汽车惯性导航系统测试 惯性导航单元的测试解决方案由两部分组成&#xff1a; 测试台&#xff1a;它由仪器仪表&#xff0c;测试机架和线束组成。对于仪器仪表&#xff0c;采用双端口电源来为设备和基站供电&#xff0c;而多功能DAQ则使用多路复用器通过RS232接口进…

广东工业大学研究生计算机专业课,走进广东工业大学最热门的专业,考研难度如何?...

本期聚问答让我们走进广东工业大学计算机专业。提及计算机专业&#xff0c;可谓是现今最火热的工科专业。随着互联网行业的高速发展&#xff0c;计算机专业相关人才需求紧缺。相较于其他行业&#xff0c;互联网行业给予毕业生的薪酬待遇更为优渥&#xff0c;甚至超过了金融行业…

LabVIEW开发电机驱动单元通用测试系统

LabVIEW开发电机驱动单元通用测试系统 为各种航空航天公司的电机驱动控制系统开发通用的硬件和软件架构。由于NI PXIe硬件的广泛功能&#xff0c;它支持最大带宽24GB/s的总带&#xff0c;而软件可以适应各种测量和自动化功能。因此被视为为需要单一测试的通用解决方案。 解决…

TableviewCell在编辑模式下的多选按钮自定义

在编辑模式下&#xff0c;如果我们启用多选模式&#xff0c;系统则会为我们配上原生的选择按钮。但这往往是不符合UI要求的&#xff0c;如此我们便需要对按钮进行自定义。 不过很可惜&#xff0c;这个按钮属性不是暴露在外的&#xff0c;那我们需要用比较暴力的方法——将它循环…