目录

一、问题描述

二、算法描述

三、评估函数

四、参考资料

五、源代码(Java版)


一、问题描述

利用极小极大搜索和alpha-beta剪枝算法预测五子棋落子问题,初始棋局如图所示,AI为白子,玩家为黑子,当前由AI落子。

二、算法描述

(一)极小化极大算法:

极小化极大搜索是一种在有限的深度范围内搜索博弈树的求解方法,程序代表AI方MAX节点,目的是打败玩家,基本原理为:

(1)轮到MIN落子时,MAX节点考虑最坏的情况,即评估函数取极小值。

(2)轮到MAX落子时,MAX节点考虑最好的情况,即评估函数取极大值。

(3)搜索到叶子节点进行回溯,代表双方的对抗策略,交替使用(1)(2)规则回溯到root节点即可得到评估值。

function minimax(node, depth)  // 给定初始状态和搜索深度if node is a terminal node or depth = 0return the evaluate value of the node //使用评估函数返回局面得分if player’s turn // 玩家走棋,是极小节点,选择一个得分最小的走法let val := +∞foreach child of nodeval := min(val, minimax(child, depth-1)else  AI’s turn   //AI走棋,是极大节点,选择一个得分最大的走法let val := -∞foreach child of nodeval := max(val, minimax(child, depth-1))return val;

(二)Alpha-beta算法:

极小化极大算法的搜索效率非常低下,而Alpha-beta剪枝算法能够提高搜索效率,基本原理为:

(1)alpha剪枝:任何极小层(由MIN落子)的节点的beta值都不大于其前驱节点(MAX节点)的alpha值,即搜索过程中,只要找到一个MIN节点的评估值不大于其前驱MAX节点的评估值,则可舍弃后续的搜索,这表示当前MIN节点落子对MAX是有利的。

(2)beta剪枝:任何极大层(由MAX落子)的节点的alpha值都不小于其前驱节点(MIN节点)的beta值。即搜索过程中,只要找到一个MAX节点的评估值不小于其前驱MIN节点的评估值,则可舍弃后续的搜索,这表示当前MAX节点落子对MAX是有利的。

function  alphaBeta(node, alpha, beta , depth) if node is a terminal node or depth = 0return the evaluate value of node  //使用评估函数返回局面得分elseif AI’s turnforeach child of node  val := alphaBeta(child, alpha, beta, depth-1)  if(val > alpha)    alpha:= valif(alpha >= beta)    break  return alphaelse player’s turnforeach child of node  val := alphaBeta(child, alpha, beta, depth-1)  if(val < beta)  beta:= valif(alpha >= beta)    break  return beta

三、评估函数

评估函数用于对博弈树中的叶子节点的状态进行评估,需要考虑五子棋中的基本棋型和特点,对叶子节点的棋局进行评估,给出评估值。

五子棋中的基本棋型(1代表AI落子,2代表玩家落子,0代表空位):

1.   连五:五颗同色棋子连在一起,如11111,22222

2.   活四:有两个点可以形成连五,如011110,022220

3.   冲四:有一个点可以形成连五,如011112,122220

4.   活三:可以形成活四的三点,如001110,002220

5.   眠三:只能形成冲四的三点,如001112,002221

6.   活二:能够形成活三的二点,如000110,000220

7.   眠二:能够形成眠三的二点,如000112,000221

在程序中可以某一坐标为中心,将改坐标点横竖撇捺四个方向的状态拼接为字符串,判断字符串是否包含上述的某种棋型作为判断标准。

由于算法是针对AI而言,因此在评估函数中,对玩家方赋予负值,AI方赋予正值。对于棋盘中的落子,从横竖撇捺四个方向判断形成的基本棋型,对不同的棋型赋予不同的权重,如连五代表一方胜利,赋予最大值代表AI胜利,赋予最小值代表玩家胜利。

根据棋型的重要性,划分权重如下(AI权重为正,玩家权重为负):

棋型

权重

连五

100000000

活四

10000000

冲四

1000000

活三

100000

眠三

10000

活二

1000

眠二

100

仅一

10

1

(一)评估函数v1

在评估过程中,计算AI所有落子位置横竖撇捺四个方向形成的棋型,得出评估值作为叶子节点的评估值。

效果:此种评估方式效果很差,仅对AI落子点进行判断过于片面,且会造成急于进攻疏于防守的局面。

(二)评估函数v2

在评估过程中,将棋盘中的所有落子的评估值相加得出最后的评估值。最终得到的评估值实际为AI落子形成的棋局评估值减玩家落子形成的棋局评估值。按此计算的目的是平衡进攻和防守。以叶子节点的评估值进行回溯,进而选择初始状态的下一步落子。

效果:评估结果较好,能够平衡进攻和防守。

四、参考资料

五子棋基本棋型及其特点

Alpha-beta剪枝

极小极大搜索方法、负值最大算法和Alpha-Beta搜索方法

五子棋的核心算法

Alpha-Beta搜索

最小-最大搜索

五子棋AI算法第四篇-启发式搜索函数

五、源代码(Java版)

Github地址:利用极小极大搜索和alpha-beta剪枝算法预测五子棋对弈落子

利用极小极大搜索和alpha-beta剪枝算法预测五子棋对弈落子相关推荐

  1. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  2. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  3. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  4. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  5. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  6. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

  7. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  8. 基于阿尔法贝塔剪枝算法的五子棋_C4.5算法剪枝2

    作者:柏安之    封面:自己想吧 1 悲观错误剪枝 在讲解悲观剪枝思路的时候,将会运用统计学的相关知识,所以我们将对这部分知识进行粗略的复习,再进行悲观错误剪枝的学习. 首先,我们认为决策树构建期间 ...

  9. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格

    1.前言 目的: 本文通过多元线性回归与随机森林算法预测笔记本新品的发售价 工具: 语言:Python 3.8 软件:Jupyter Notebook 库:pandas.numpy.matplotli ...

  10. Alpha-Beta剪枝算法在直棋中的运用

    游戏说明 详见本人的项目描述页面:https://gitee.com/liuweilhy/NineChess/blob/master/Readme.md 我做了个简单的GUI如下图. 点击这里可以下载 ...

最新文章

  1. html中事件调用JavaScript函数时有return与没有return的区别
  2. Apache Spark Jobs 性能调优
  3. git--分支管理:创建、合并、冲突解决
  4. 【转贴】C#中事件处理的个人体会
  5. OSMboxPost()
  6. 女老师vs男老师的区别...
  7. # CF1572B Xor of 3(构造)
  8. 转一篇关于并发和并行概念的好文,附带大神评论
  9. LeetCode MySQL 1479. 周内每天的销售情况(dayname星期几)
  10. python3.12答案_编程常见问题
  11. c语言 poll,c语言 linux 中 poll 的参数
  12. Spring Cloud 配置中心中的native配置
  13. 博文视点MySQL书单丨无惧停机故障,数据库异常不可怕
  14. 数字图像处理(冈萨雷斯)_数字图像处理笔记总结
  15. 这可能不只是一篇面经
  16. RFID射频识别的解读及应用
  17. CSS弹性盒子布局flex
  18. M24C08-RMN6TP
  19. HTTP抓包神器---Fiddler
  20. SourceTree安装跳过注册

热门文章

  1. CRM客户管理系统有哪三大功能
  2. SylixOS -- KN_SMP_WMB()内存屏障函数解析
  3. MybatisPlus实现数据库加解密
  4. 【量化笔记】通道突破策略
  5. python 比对两个excel表数据_Python第17课:两个数据表如何比对碰撞?(二)
  6. qq邮箱foxmail imap服务器,foxmail登录imap服务器提示失败。怎么办?
  7. 一篇论文8778个作者:人均写5个字,署名用了17页
  8. 手动更新windows补丁
  9. 计算机编程语言用英语怎么说,编程用英语怎么说
  10. [转]现代汉语词性分类