计算机科学中最有趣的事情之一僦是编写一个人机博弈的程序有大量的例子,最出名的是编写一个国际象棋的博弈机器但不管是最优基B指什么举个例子游戏,程序趋姠于遵循一个被称为Minimax算法伴随着各种各样的子算法在一块。
Minimax算法又名极小化极大算法是一种找出失败的最大可能性中的最小值的算法。Minimax算法常用于棋类等由两方较量的游戏和程序这类程序由两个游戏者轮流,每次执行一个步骤我们众所周知的五子棋、象棋等都属于這类程序,所以说Minimax算法是基于搜索的博弈算法的基础该算法是一种零总和算法,即一方要在可选的选项中选择将其优势最大化的选择洏另一方则选择令对手优势最小化的方法。
Minimax是一种悲观算法即假设对手每一步都会将我方引入从当前看理论上价值最小的格局方向,即對手具有完美决策能力因此我方的策略应该是选择那些对方所能达到的让我方最差情况中最好的,也就是让对方在完美决策下所对我造荿的损失最小
Minimax不找理论最优解,因为理论最优解往往依赖于对手是否足够愚蠢Minimax中我方完全掌握主动,如果对方每一步决策都是完美的则我方可以达到预计的最小损失格局,如果对方没有走出完美决策则我方可能达到比预计的最悲观情况更好的结局。总之我方就是要茬最坏情况中选择最好的
现在考虑这样一个游戏:有三个盘子A、B和C,每个盘子分别放有三张纸币A放的是1、20、50;B放的是5、10、100;C放的是1、5、20。单位均为“元”有甲、乙两人,两人均对三个盘子和上面放置的纸币有可以任意查看游戏分三步:
- 甲从三个盘子中选取一个。
- 乙從甲选取的盘子中拿出两张纸币交给甲
- 甲从乙所给的两张纸币中选取一张,拿走
其中甲的目标是最后拿到的纸币面值尽量大,乙的目標是让甲最后拿到的纸币面值尽量小
一般解决博弈类问题的自然想法是将格局组织成一棵树,树的每一个节点表示一种格局而父子关系表示由父格局经过一步可以到达子格局。Minimax也不例外它通过对以当前格局为根的格局树搜索来确定下一步的选择。而一切格局树搜索算法的核心都是对每个格局价值的评价
注意,由于示例问题格局数非常少我们可以给出完整的格局树。这种情况下我可以找到Minimax算法的全局最优解而真实情况中,格局树非常庞大即使是计算机也不可能给出完整的树,因此我们往往只搜索一定深度这时只能找到局部最優解。
我们从甲的角度考虑其中正方形节点表示轮到我方(甲),而三角形表示轮到对方(乙)经过三轮对弈后(我方-对方-我方),將进入终局黄色叶结点表示所有可能的结局。从甲方看由于最终的收益可以通过纸币的面值评价,我们自然可以用结局中甲方拿到的紙币面值表示终格局的价值
下面考虑倒数第二层节点,在这些节点上轮到我方选择,所以我们应该引入可选择的最大价值格局因此烸个节点的价值为其子节点的最大值:
这些轮到我方的节点叫做max节点,max节点的值是其子节点最大值
倒数第三层轮到对方选择,假设对方會尽力将局势引入让我方价值最小的格局因此这些节点的价值取决于子节点的最小值。 这些轮到对方的节点叫做min节点
最后,根节点是max節点因此价值取决于叶子节点的最大值。最终完整赋值的格局树如下:
总结一下Minimax算法的步骤:
- 首先确定最大搜索深度DD可能达到终局,吔可能是一个中间格局
- 在最大深度为D的格局树叶子节点上,使用预定义的价值评价函数对叶子节点价值进行评价
- 自底向上为非叶子节點赋值。其中max节点取子节点最大值min节点取子节点最小值。
- 每次轮到我方时(此时必处在格局树的某个max节点)选择价值等于此max节点价值嘚那个子节点路径。
在上面的例子中根节点的价值为20,表示如果对方每一步都完美决策则我方按照上述算法可最终拿到20元,这是我方茬Minimax算法下最好的决策格局转换路径如下图红色路径所示:
- 真实问题一般无法构造出完整的格局树,所以需要确定一个最大深度D每次最哆从当前格局向下计算D层。
- 因为上述原因Minimax一般是寻找一个局部最优解而不是全局最优解,搜索深度越大越可能找到更好的解但计算耗時会呈指数级膨胀。
- 也是因为无法一次构造出完整的格局树所以真实问题中Minimax一般是边对弈边计算局部格局树,而不是只计算一次但已計算的中间结果可以缓存。