α-β剪枝算法

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

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

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

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

图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.

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

  1. 更改计算机睡眠时间无法打开,win7怎么设置电脑睡眠时间 win7电脑睡眠后黑屏打不开...

    当我们打开电脑后长时间没有点击,那么电脑便会进入自动睡眠模式,我们只需要点击鼠标或者移动鼠标即可唤醒屏幕,有时候我们只是去倒杯水的功夫电脑就黑屏了,这是因为你没有设置睡眠时间,系统默认的时间是很短的, ...

  2. 计算机休眠后黑屏打不开,[电脑待机以后黑屏打不开怎么办]电脑睡眠后黑屏打不开...

    电脑中午午休时间放置电脑,一般电脑动动鼠标或按按键盘,显示屏就能再度亮起,但有时发现以上方法无效,而且通过开机键也没有作用,只得拔掉电源重新开启.那么要如何解决电脑离开后黑屏再也打不开的怀况呢?下面是 ...

  3. 计算机休眠后黑屏打不开,电脑待机后黑屏打不开怎么办

    我们一般在没有使用电脑的时候,都会设置电脑待机,但是当再次唤醒的时候却发现打不开电脑了,下面由学习啦小编为你整理了电脑待机后黑屏打不开怎么办的解决方法,希望对你有帮助! 电脑待机后黑屏打不开解决方法如 ...

  4. 计算机经常黑屏,电脑显示器频繁黑屏怎么处理

    关于电脑显示器频繁黑屏的问题,你们了解该怎么处理吗?下面就由小编来给你们说说电脑显示器频繁黑屏的原因及处理方法吧,希望可以帮到你们哦! 电脑显示器频繁黑屏的处理方法一 1.电源功率不足 外部电源功率不 ...

  5. 系统重装后会重启计算机吗,重装系统后电脑重启就黑屏怎么样解决

    重装系统成功固然让人喜悦,但是成功的前提也是每一次失败的积累,之前小编就遇到过重装系统后电脑重启就黑屏的情况,遇到这种情况我们具体该怎么解决呢?下面就由学习啦小编跟大家分享一下解决方法吧,欢迎大家来阅 ...

  6. 计算机开机后黑屏鼠标显示桌面图标,win10系统电脑启动开机黑屏不显示只有鼠标图标的处理办法...

    win10系统使用久了,好多网友反馈说win10系统电脑启动开机黑屏不显示只有鼠标图标的问题,非常不方便.有什么办法可以永久解决win10系统电脑启动开机黑屏不显示只有鼠标图标的问题,面对win10系 ...

  7. 计算机开机后黑屏鼠标显示桌面图标,电脑开机后黑屏怎么解决只显示鼠标

    品牌型号:联想GeekPro 2020 系统:win10 1909 64位企业版 部分用户可能电脑型号不一样,但系统版本一致都适合该方法. 电脑开机后黑屏怎么解决只显示鼠标?下面就与大家分享电脑开机后 ...

  8. 计算机开机后黑屏鼠标显示桌面图标,电脑开机后黑屏只有一个鼠标箭头怎么办 电脑黑屏的解决方法...

    启动电脑后开机黑屏,只显示一个鼠标箭头怎么解决?有很多的网友都经历过这种情况,解决方法很简单,大家可以看看下面的解决方法,帮你解决黑屏烦恼. 电脑开机后黑屏只有鼠标箭头的解决方法 使用电脑的过程中往往 ...

  9. 计算机内存不足黑屏怎么办,win10内存不足会黑屏吗_win10电脑内存不足黑屏了怎么办...

    有些用户的win10系统电脑使用时间比较长,导致一些硬件没有进行及时更换,因此在运行的过程中就容易出现一些黑屏的问题,大部分用户可能都觉得黑屏跟电脑的内存没有关系,其实不然,win10系统的内存不足也 ...

最新文章

  1. Leetcode1700. 无法吃午餐的学生数量[C++题解]:模拟题简单,用queue
  2. 关于JQUery.parseJSON()函数的知识札记
  3. c2064 项不会计算为接受0个参数的函数_无网格法理论与Matlab程序设计(6)——传统径向基点插值(RPIM)形函数...
  4. POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)
  5. SAP CRM Fiori My note应用 add to -append Frontend implementation
  6. minincom cannot open /dev/modem
  7. 自定义工作流界面开发
  8. android 动态获取全县_android 6.0之后动态获取权限
  9. 获取日志的等级_进阶之路:Java 日志框架全画传(中)
  10. 动态规划---01背包问题
  11. TCP连接吞吐率和线路效率的总结
  12. 如何在 Apple TV 上获得电影推荐?
  13. cacti监控mysql
  14. 数字信号处理_实验一_信号、系统及系统响应
  15. Flightgear操作方式以及几种典型飞机的起飞方法
  16. matlab 圆和直线的交点,用matlab求直线和椭圆的交点坐标!
  17. 从HttpClient3迁移到HttpClient4
  18. 我的服务器开发之路-服务器SSH默认端口22和ftp默认端口21修改
  19. python3之面向对象实例烤地瓜
  20. 如何用快搭低代码平台搭建CRM、MES等系统

热门文章

  1. 简单快速生成序列化ID
  2. 'utf-8' codec can't decode byte 0xb5 in position : invalid start byte
  3. 连获国际大奖创下史上第一,这家耳机品牌凭什么与众不同?
  4. 七年级计算机会考重点知识点总结,七年级语文期中考试复习知识点总结
  5. 【每日一GO】加密解密库—dongle
  6. deeplink唤醒app测试软件,短信跳转app-DeepLink
  7. 洛谷P5520 [yLOI2019] 青原樱 题解
  8. mp4 转 m3u8 java_java下载m3u8转ts合成mp4
  9. 想要报考华为技术认证,你一定要了解这些
  10. HTTP协议--概述