minimax search
设计象棋等AI模型时常常需要使用博弈论的思想,minimax search就是一种基于当前状态推测出使我方最有利而对方最不利的行动,在实际模型中需要考虑状态函数,树的深度,时间成本等等因素,这里只讲一个最简单的例子说明minmax search的计算过程。
假设根据当前局面我们得到一个下图所示的博弈树:
从上往下,单数层是我方行动,双数层是对方行动,我方行动需要选择对我最有利的行动,即value大的行动,对方行动则是选择使我方最不利的行动,即value小的行动。
我们需要从最底层第四层开始考虑,双数层所以是对方行动。对于node I,会选择值更小的node M,node I的值更新为0。再考虑第三层,单数层是我方行动。node F会选择I,J中值更大的J,更新为5,G会选择K,L中值更大的L,更新为8。依次一层层向上类推,可以得到最终结果为:
alpha-beta prune
当树的深度很大的时候,遍历一遍的代价非常大,alpha-beta prune是一种优化方法,其根据遍历顺序分为left-to-right和right-to-left两种,前者从左边开始遍历,后者从右边开始遍历。
alpha-beta剪枝的基本思想是对于每个max结点设置一个目前已知下界alpha,每个min节点设置一个目前已知上界beta。alpha代表我方可以搜索到的最好值,beta代表了对方可以接受的最坏值。如果某个行动的结果小于或等于alpha,那么它就是很差的行动,我方可以选择更好的行动(当前alpha值的行动)。反之,如果某个行动的结果大于或等于beta,那么整个节点就作废了,因为对手不希望走到这个局面,而它有一定有别的行动(即走当前beta值的行动)可以避免到达这个局面。
但发生下面两种情况时可以剪枝,即停止搜索该节点的其余子节点:
1)当计算一个min结点时,如果它的beta值小于等于其父结点的alpha值,则可以立即停止此结点的计算(alpha剪枝)。
2)当计算一个max结点时,如果它的alpha结点大于等于其父结点的beta值,也可以立即停止此结点的计算(beta剪枝)。
简单来说,当时,发生剪枝,因为后续搜索到的行动一定会差于之前的行动或是对方一定不会采取后续的行动。通过剪枝可以减少遍历的节点数,从而加快速度。
还是以之前的博弈树为例(left-to-right)
- Initially node A , pass to node B and D.
- Starting form node D, for node B.
- Search node E, for node B.
- For node A, . Then node A passes to node C, F and I.
- For node I, . So we do not need to consider node I’s another child node N. And pass the result back to node F. For node F, .
- Search node J, for node F. For node C, and .
- Node C passes its value to node G. For node G, .
- Search node K, for node G. So we do not need to consider node G’s another child node L. Return to node C, .
- Search node H, . Return to node A, .
最后的结果:
即对于当前局面,我的选择最好可以达到4。