鱼C论坛

 找回密码
 立即注册
查看: 1504|回复: 3

[技术交流] 博弈树的搜索算法(一)

[复制链接]
发表于 2022-4-23 16:38:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
MaxMin算法(极大极小值算法)




该算法是一种找出失败的最大可能性中的最小值的算法(即最小化对手的最大得益)。通常以递归形式来实现。
Minimax算法常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的一个,其输赢的总和为0。

其实一般不太建议用这种算法,不过由于这个是AlphaBeta剪枝算法的前置,所有这里还是介绍一下。

介绍这个算法前,简单的介绍一下博弈树。如下图井子琪游戏为例,这只是一个简略的博弈树,整个博弈树有多少个节点的呢?答案是9!,共计362880个节点。而该算法则会尽心尽力的去搜遍这362880个节点。所以这是一个不“太聪明”的算法,也型号,这个是可以改进的,这里暂且不提。


5.png


MINMAX的基本思想,我们程序在搜索完成井子琪游戏的博弈树之后,可以知道所有的游戏的结局,知道哪个分枝会输,知道哪个分枝会赢,或者平局。既然知道结局,那么把结果传播回去就可以,假定电脑赢游戏,对游戏给定 1 分的评价,电脑输游戏,给对游戏给定 -1 分的评价,如果是平局,对游戏给定 0 分的评价。并且假定对手是非常聪明的,他落子的时候,总会选择最优的局面,对电脑而言就是最差的局面。

python伪代码实现

  1. def MiniMaxAlgorithm(int: depth,  flag):
  2.     # depth:: 是深度的意思,对于一些游戏树是深不可达,所以一般扩展到某一个游戏状态就停止了
  3.     #  定义递归出口,或者是游戏结束状态,返回当前游戏状态的评分
  4.     if (depth==0 and GameOver):
  5.         # 评分函数,赢了,输了,平局,会在自己定义响应的规则评分
  6.         return EvaluationFunction(Gs)
  7.     MaxValue = float('-inf')
  8.     MinValue = float('inf')
  9.     # 测试所有合法的着点
  10.     for Move in GeneratorMoves:
  11.         # 执行着点
  12.         MakeNextMove()
  13.         # 交换身份,继续,
  14.         score = MiniMaxAlgorithm(depth-1, falg)
  15.         # 撤销着点
  16.         UnMakeNextMove()
  17.         # 如果当前是电脑走步落子
  18.         if flag is Max:
  19.             MaxValue = max(score, MaxValue)
  20.         else:
  21.             MinValue = min(socre, MinValue)
  22.     if flag is Max:
  23.         return Maxvalue
  24.     else:
  25.         return MinValue

复制代码

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +3 收起 理由
hrpzcf + 5 + 5 + 3 鱼C有你更精彩^_^
傻眼貓咪 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-23 18:02:57 | 显示全部楼层
其实博弈树可以说是用内存替代的演算法吧?简单的说就是运算未来可能的路线,并且找出最优路线(算命师 + 风水师?)。
目前为止,世界级 AI 无论是象棋、五子棋等,棋盘游戏用博弈树方法(包括 AlphaBeta 等算法)最多也只能预算后十步以内吧(这已经是超级电脑的极限了,预设树根 root 的上限),不可能预算到游戏结束为止的所有步骤。毕竟每预算下一步所需的内存负担是以次方在增加的(井字棋游戏共 362880 个节点,扣除不合理步骤,也有 255168 个棋局之多啊)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-23 19:33:25 | 显示全部楼层
傻眼貓咪 发表于 2022-4-23 18:02
其实博弈树可以说是用内存替代的演算法吧?简单的说就是运算未来可能的路线,并且找出最优路线(算命师 +  ...

人下棋不也一样吗,我们的思维在布局,布陷阱,或者厉害的棋手可以看透预见后面棋。
这个我一个可以打包票,十步不止,虽然博弈树很大,但是阿尔法GO用的是蒙特卡洛算法,在看到的分支里面,远远大于一般的搜索。后面还有三篇,会有说AlphaBeta PV MCTS算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-23 19:59:46 From FishC Mobile | 显示全部楼层
收藏吃灰
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-2 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表