剪枝

Alpha-Beta剪枝(Alpha-Beta Purning)

新的问题出现了:对于一般的最大最小搜索,即使每一步只有很少的下法,搜索位置的数目也会随着搜索深度呈级数级增长。在大多数的中局棋形中,每步平均有十种下法,假设电脑搜索九步(程序术语称为搜索深度为九),就要搜索十亿个位置(十的九次方),这样极大地限制了电脑的棋力:我们总不能忍受电脑棋手一年才下一步棋。减少搜索结点的最简单的方法是减小搜索深度,但这大大影响了电脑棋手的棋力。是否有办法在不减小搜索深度的前提下将需要搜索的结点减小一些?幸运的是,可以证明,程序不需要考虑所有的位置而找到最佳点,于是人们采用了一个方法,叫"alpha-beta剪枝",它大为减少了检测的数目,提高电脑搜索的速度。所有的强力黑白棋程序都用到了各种各样的这种算法。(同样用于其他棋类游戏,如国际象棋和跳棋)。为了搜索九步,一个好的程序只用搜索十万到一百万个位置,而不是没用前的十亿次。

还有几种alpha-beta算法的改进型,最广泛采用的是NegaScout,(Alexander Reinefeld发明),但它和一般的alpha-beta剪枝算法没有根本的不同。其他的还有PVS和SSS*。下面举例说明。

还是基于刚才的棋形,假设先搜索e3-f2 f3 f4 f5 f6、再c3-c2 d3 e6 f5、再c5-b6 c6 d6 e6 f6,即从左至右的顺序的深度优先搜索。则搜索到d3分枝之后,就不用搜索e6和f5了。因为如果接下来的值比d3大,就不会赋值给c3,如果比d3小,赋值给c3后,也不会赋给根节点,因为根节点取最大的值,现在根节点的值是-1,不会取更小的值。同样的,搜索d6后,也不用搜索e6、f6了,也就是说,搜索到比-1还小的值之后,就不用搜索了。

在搜索过程中,电脑下棋结点的当前最优值被称为α 值(即初始棋局的值),对手下棋结点的当前最优值被称为 β值(即例子中C3的值)。在搜索过程中,α 值递增, β值递减,两者构成了一个区间。这个区间被称为窗口,而对手下棋的结点最终的最优值将落在这个窗口中。一旦在电脑下棋的结点得到其子结点的返回值大于β 值,则发生剪枝。

初始棋局(-1)

------------------+------------------

|                 |                 |

e3(-1)            c3(-1)            c5(-5)

-----+-----       ----+----       -----+-----

|  |  |  |  |      |  |  |  |      |  |  |  |  |

f2 f3 f4 f5 f6     c2 d3 e6 f5     b6 c6 d6 e6 f6

+84+36+12 +5 -1    +11 -1 +6 +6     +6 +0 -5 +3 +5

Alpha-Beta搜索:

function AlphaBeta(Depth: Integer; Alpha, Beta: Double; Board: TBoard): Double;

var

I, J: Integer;

t: Double;

begin

if Depth = 0 then                                   //根节点depth=DepthMax;叶子节点depth=0;

begin

Result := 估值;                                   //叶子结点估值返回

Exit;

end;

对于每一个合法的可下棋的位置(i,j) do

begin

保存棋局;

下棋;

t := -AlphaBeta(Depth - 1, -Beta, -Alpha, Board); //递归调用

if t > Alpha then

if t >= Beta then

begin

Result := t;

Exit;

end

else

Alpha := t;

if (Depth = DepthMax) and (t > Alpha) then        //如果值大于根节点值则赋值

begin

max := t;

max_x := i;                                     //x坐标

max_y := j;                                     //y坐标

end;

c语言编黑白棋游戏,怎样编制黑白棋(2)相关推荐

  1. c++语言编的小游戏,用C++语言编写小游戏系统(可读取文件)

    #include #include #include #include #include #include #include #include #include using namespace std ...

  2. c语言大作业黑白棋,C语言编写黑白棋游戏源代码.doc

    C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值 ...

  3. c语言课程设计之黑白棋游戏,c语言课程设计黑白棋游戏.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp学术论文&nbsp>&nbsp大学论文 c语言课程设计黑白棋游戏.doc26页 本文档一共被 ...

  4. c语言写的黑白棋游戏代码,C语言编写的黑白棋游戏源代码..doc

    C语言编写的黑白棋游戏源代码. C语言编写的黑白棋游戏/*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...

  5. c语言程序设计黑白棋游戏,C语言课程设计_黑白棋游戏

    C语言课程设计_黑白棋游戏 C语言课程设计_黑白棋游戏 #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值* ...

  6. 黑白棋代码Linux程序,C语言编写的黑白棋游戏源代码.doc

    PAGE PAGE 1 C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...

  7. C++ 黑白棋游戏的实现

    时光荏苒..眨眼间半年过去了.半年间我的人生轨迹经历了重大的改变.我最终还是决定把我在去年暑假里实现的这个C++的黑白棋游戏发布在我的CSDN博客上.这或许是我写的最后一个C++程序了. 记得当时,7 ...

  8. c语言设置一个选择数字的程序,C语言编一个数字益智小游戏

    程序功能及运行情况 设计的程序是一个数字益智游戏,旨在培养小朋友玩家的数学思维,提高玩家的数学能力.游戏共设有四个不同的小游戏,分别是一位数四则运算.两位数四则运算.找最值游戏.排序游戏.程序能实现产 ...

  9. 如何让c语言编的游戏运行,如何用C语言编写游戏一.doc

    如何用C语言编写游戏 网络游戏是常谈的话题,是交互式娱乐的主力军,是一种 高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式 作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的 ...

最新文章

  1. pcDuino 软件更新
  2. 防火墙简单组网方案之双机热备
  3. 初级和高级产品运营的分水岭指标:大局观和节奏感
  4. spec linux,linux – 在RPM包中SPEC文件中1%{?dist}的含义是什么?
  5. OpenGL:纹理Textures
  6. 无聊的一天_一人互联网公司背后的无聊技术
  7. 基础知识—函数-函数参数及返回值
  8. 给 UITextField 添加左侧指示图片(类似微信登录框)
  9. MPEG-7实例入门
  10. 不同VPC路由器通过静态路由、动态路由(OSPF)实现网络互通实战
  11. 相册批量下载 前版本为v3.5 支持:雅虎相册、谷歌相册、网易相册、yupoo相册、百度相册、QQ相册
  12. MATLAB-数组的使用
  13. 透明背景视频的制作与应用
  14. Win11如何关闭445端口?Win11关闭445端口的方法
  15. c++高级编程学习笔记7
  16. 前奈飞 CTO 两年吃回扣上百万,将面临数十年监禁
  17. 应聘的16个经典面试问题回答思路
  18. WPF 基础到企业应用系列4——WPF千年轮回
  19. 信号与系统-连续系统的时域分析
  20. 德鲁克《卓有成效的管理者》学习读书-总结

热门文章

  1. yy直播礼物android开源,YY直播没“大哥”刷礼物了,不是没大哥,而是神豪们都开直播了...
  2. UCOSII移植教程仅仅移植不讲解
  3. eclipse c 调用java_eclipse项目,用命令行执行javac,java
  4. 简报 | 菲律宾:计划打造“亚洲加密谷”,定位亚洲最理想区块链投资目的地
  5. 你遇到过的测试难题(4)活动抽奖转盘九宫格抽奖测试用例测试点
  6. 不喜欢打扫卫生间?机器人来帮你
  7. 【Linux】IPCS/IPCRM命令详解
  8. 王亟亟的Python学习之路(七)-date,continue,迭代对象,生成器
  9. 自制Ping(2) Structures
  10. TensorFlow2笔记