目录

一、问题描述

二、算法描述

三、评估函数

四、参考资料

五、源代码(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. 多台服务器通过ssh 无密钥直接登陆主机
  2. 6-uboot relocation介绍
  3. maven生命周期lifecycle和plugins介绍
  4. java五子棋用到的类_JAVA五子棋用到的知识点以及方法类有哪些?
  5. Windows 计划任务功能设置闹钟~
  6. COMCMS_CORE 起步篇,如何运行和部署
  7. [BZOJ2818][P2568]Gcd[欧拉函数]
  8. 【干货】大数据驱动的因果建模在滴滴的应用实践
  9. 使用WebViewJavascriptBridge与UIWebView交互
  10. MySQL中exists和in的区别
  11. 【每日一具18】基于HTTP协议的局域网文件共享软件
  12. FastDFS原理及维护
  13. GeekTool介绍及Shell模式应用二则(以及df、cal、date、sed的使用)
  14. as3学习笔记1:Embed嵌入图片
  15. php框架 f,ShuipFCMS: ShuipFCMS是一款基于ThinkPHP框架开发的内容管理系统!
  16. Acegi源码研究(五):七剑下天山
  17. 在嵌入式linux上玩OpenGL
  18. 数据库备份与恢复,全备份、增量备份
  19. 产品经理必读的十本好书
  20. 百度前CTO刘建国任搜索网站爱帮网CEO

热门文章

  1. OpenGL 简化点光源与平行光的对比实验
  2. php 回车符替换,php怎么替换回车符
  3. Git error. Command: `git clone --mirror git://github.com/Sky24n/FlutterRepos.git
  4. 币优网区块链原理浅析
  5. 科罗拉多州立大学计算机科学,科罗拉多州立大学
  6. Jenkins linux 操作系统一键部署多节点
  7. 国产矢量绘图软件--百绘大师
  8. Python自动化办公练习——合并工作簿
  9. HDU 6184 Counting Stars(分块)
  10. img和文字都居中对齐