Minimax算法被广泛应用在棋类游戏中,是一种找出失败的最大可能性中的最小值的算法(Wikipedia)。
博弈树(game tree)
以“tic tac toe”游戏为例。从当前状态或初始状态开始,根据可以采取的行动(actions)和可以到达的状态(s),绘制子节点,再对子节点绘制子节点。直到游戏结束的状态。如下图这种树称为game tree。
Minimax算法
先从一个简单的场景入手,介绍Minimax的思想。
假设有一个游戏,只有两个玩家参与,两轮便定出胜负。我们称两个玩家为MAX和MIN。每个玩家在各自的回合中,都有2个到1个行动(actions)可选。MAX先手。下图中,圆形表示MAX的回合,方形表示MIN的回合,每条连线表示当前状态下可以采取的行动。因为假设游戏只有两轮,所以游戏进行到图中标号为4的层时,游戏的胜负就已经知道了,我们可以评估该层各个状态的效用值(utility),来表示玩家MAX的胜负多少,对于这一层的结果,MIN和MAX双方都是知道的。
假设现在我们就是MAX,我们的对手就是MIN。MIN为了赢得游戏,一定会想办法让MAX的得分最低。游戏双方都会从游戏的结果开始回溯,来指导相应的状态下,自己该采取何种行动来最大化自己的目标。
假设现在处在标号为3的层,是MIN的回合。MIN在所有可选的actions中,一定会选择使得MAX的得分最少的行动。所以将子节点较小的效用值填写到第3层中,表示游戏进行到相应的状态,MAX能达到的最大效用。
接着回溯到第2层,这层是MAX的回合,MAX知道了第3层各种状态下自己的效用值,MAX当然会选择使自己效用最大的行动。所以选取子节点效用最大的填入第2层。
接着回溯第1层,是MIN的回合,与第3层同理。
最后回溯到第0层,MAX的回合,与第2层同理。
MAX从游戏结束的状态开始回溯,知道了自己能够达到的最大效用是-7。
上述过程就是Minimax算法的主要流程。
多玩家场景
前面考虑的都是只有两个玩家参与的场景。如果是多玩家场景,可以将单个的效用值扩展到向量的形式。
总结
算法的实现可以通过递归的方式,从当前状态开始搜索,一直到游戏结束,然后回溯。但是当游戏的状态和可采取的步骤变多,game tree的深度变深时,博弈树的节点数量就会指数爆炸。所以根据minimax搜索整棵树的行为,对大多数游戏是不现实的。但是Minimax的思想是其他算法的基础。