假设在博弈过程中,对抗者1总是选择使得博弈值最小的移动,那么作为对手的对抗者2则总会选择是的博弈值最大的移动,对抗者1称为min,对抗者2称为max.由于博弈双方是交替移动的,所以博弈树的结点及其父结点分属于两个对抗者中的一个,他们的种类(type)分属max和min.博弈树上的每个结点对应于一个深度(depth),叶结点的深度为0.因此,在任意的结点node,对博弈双方均最优的博弈值为[3]:
由此,很自然地得出Min-Max算法,用来求出满足一些条件的二人零和博弈问题的博弈值:
MiniMax(node) 1: if node.depth = 0 then 2: return Evaluate(node) 3: if node.type = max then 4: score ← -∞ 5: else 6: score ← +∞ 7: for i ← 1 to node.branch.length 8: new_node ← Traverse(node, node.branch[i]) 9: value ← MiniMax(new_node) 10: if node.type = max then 11: if value > score then 12: score ← value 13: else 14: if value < score then 15: score ← value 16: return score 上述伪代码中,结点node各自的有种类(max或者min结点),分支(branch).Evaluate()函数就是叶结点的估值函数.Traverse()函数用于产生node的第i个分支(node.branch[i]).Min-Max方法对博弈树进行深度优先搜索.相对于广度优先搜索,深度优先搜索需要非常少的存储空间,而且存储空间的需求不随树的大小而指数增长.
通过Min-Max方法可以找到对于博弈双方都是最优的博弈值,称这个博弈值为最小最大值(minimax value).
Min-Max方法可以通过消除max结点和min结点的区别来进行简化[4].简单地将递归函数MiniMax()返回值取负再返回,就可以将所有的min结点都转化为max结点.注意此时还要改变评价函数Evaluate()为EvaluateNegaMax(),使得叶结点根据结点的种类(max或者min)来返回估值.
NegaMax(node) 1: if node.depth = 0 then 2: return EvaluateNegaMax(node) 3: score ← -∞ 4: for i ← 1 to node.branch.length 5: new_node ← Traverse(node, node.branch[i]) 6: value ← NegaMax(new_node) 7: if value > score then 8: score ← value 9: return score EvaluateNegaMax(node) 1: if node.type = max then 2: return Evaluate(node) 3: else 4: return -Evaluate(node)在经过这样的简化之后,除了叶结点每个结点的策略将不再区分种类(max或者min).对每个结点的搜索都尝试让结点值(value)最大.
本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article
--------------------
[3] Stuart Russell and Prter Norvig (1995). Artificial Intelligence, AModern Approach. Prentice-Hall, Egnlewood Cliffs, 1995.
[4] Knuth, D.E. and Moore, R.W. (1975). An Analysis of Alpha-Beta Pruning.Artificial Intelligence, 6:293–326.