https://blog.csdn.net/u012074597/article/details/80105676
算法的实现可以通过递归的方式,从当前状态开始搜索,一直到游戏结束,然后回溯。但是当游戏的状态和可采取的步骤变多,game tree的深度变深时,博弈树的节点数量就会指数爆炸。所以根据minimax搜索整棵树的行为,对大多数游戏是不现实的。但是Minimax的思想是其他算法的基础。
https://blog.csdn.net/witnessai1/article/details/78377544
https://zh.wikipedia.org/wiki/极小化极大算法
https://blog.csdn.net/FlowShell/article/details/6266283
https://blog.csdn.net/joshualiunsw/article/details/52131507
算法的实现可以通过递归的方式,从当前状态开始搜索,一直到游戏结束,然后回溯。但是当游戏的状态和可采取的步骤变多,game tree的深度变深时,博弈树的节点数量就会指数爆炸。所以根据minimax搜索整棵树的行为,对大多数游戏是不现实的。但是Minimax的思想是其他算法的基础。
https://blog.csdn.net/witnessai1/article/details/78377544
计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子,最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏,程序趋向于遵循一个被称为Minimax算法,伴随着各种各样的子算法在一块。
Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两方较量的游戏和程序,这类程序由两个游戏者轮流,每次执行一个步骤。我们众所周知的五子棋、象棋等都属于这类程序,所以说Minimax算法是基于搜索的博弈算法的基础。该算法是一种零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,而另一方则选择令对手优势最小化的方法。
- Minimax是一种悲观算法,即假设对手每一步都会将我方引入从当前看理论上价值最小的格局方向,即对手具有完美决策能力。因此我方的策略应该是选择那些对方所能达到的让我方最差情况中最好的,也就是让对方在完美决策下所对我造成的损失最小。
- Minimax不找理论最优解,因为理论最优解往往依赖于对手是否足够愚蠢,Minimax中我方完全掌握主动,如果对方每一步决策都是完美的,则我方可以达到预计的最小损失格局,如果对方没有走出完美决策,则我方可能达到比预计的最悲观情况更好的结局。总之我方就是要在最坏情况中选择最好的。
https://zh.wikipedia.org/wiki/极小化极大算法
function minimax(node, depth)
if node is a terminal node or depth = 0
return the heuristic value of node
if the adversary is to play at node
let α := +∞
foreach child of node
α := min(α, minimax(child, depth-1))
else {we are to play at node}
let α := -∞
foreach child of node
α := max(α, minimax(child, depth-1))
return α
https://blog.csdn.net/FlowShell/article/details/6266283
所以说Minimax算法是基于搜索的博弈算法的基础。该算法是一种零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,而另一方则选择令对手优势最小化的方法。
我们知道,常用的博弈算法都是基于搜索的博弈算法,所有可能的下棋步骤构成一个树的结构,以Tic-tac-toe(中文称为井字棋,即两人轮流在井字棋盘的方格内划×或〇,谁先将划过的三个方格成一直线或对角线为胜)游戏为例,下面一幅图表示了Tic-tac-toe游戏的前两步所有可能的步骤.
上图中第0层为空棋盘,第1层是×方所有可能的步骤,第2层是〇方所有可能的步骤。在第1层,×方需要选择使其优势最大的选择,而在第2层,〇方则需要选择使×方优势最小即己方优势最大的选择。
Minimax的含义就是极小化对手的最大利益,在上图中,在第2层〇方一定会选择使自己优势最大的选择,而对于×方需要做的就是选择〇方最大选择中的极小值。
https://blog.csdn.net/joshualiunsw/article/details/52131507
其实说白了,这个算法就是一个树形结构的递归算法,每个节点的孩子和父节点都是对方玩家,所有的节点被分为极大值(我方)节点和极小值(对方)节点
上述代码depth是最多预测层数限制,函数递归有两个出口,一是到达层数限制即depth 为 0,二是已经递归到叶子节点,在游戏中体现为“死棋“或者有一方已经确定胜利获失败。
下面的两个迭代过程需要进行玩家判断,因为我们需要最小话敌方的优势(最大化我方优势),所以对应敌方的当前步,需要返回找到的min;我方的当前步,需要返回找到的max。
与此同时,迭代本身体现在我们假设对方也做出了在我们已经考虑到的范围内(同样想到了这层策略)的最佳判断,因为游戏通常是双方交替进行的,所以通常在实际编程中我们还要给minimax方法中添加一个确认当前玩家身份的参数,如果只有两个玩家布朗型可能是一个较好的选择。
每次的迭代,都可以认为是向上一层的预测,当然,因为minimax的算法是树形结构,不断地向下拓展该树会导致计算量的倍数增加(多少倍取决于所剩可选的当前支孩子节点的数量)。但是有可能会出现一种情况,当函数递归到一定层数(计算量达到一定数值后),所剩可选分支已经很少(很多已经到达叶子节点),可继续递归的子节点数量也相应减少,反而高层级的预测计算量并不大。当然通常情况是在还没到达这个极值之前,计算机已经无法在可以接受的时间内进行玩这些计算了,比如围棋。
alpha-beta 剪枝
每个节点都有其α β两个值,α记录当前最大值,β记录当前最小值。所有层级的α默认值为负无穷,β默认值为正无穷。