最近在写一个棋类博弈算法,总结一下用到的搜索算法
博弈树
一般的搜索是单一对象的,就像一个人在房间里寻找任务物品,只要找到了就赢了。
而棋类博弈用到的是对抗性博弈,有两方,两人在房间里寻找任务物品,谁先找到谁赢。
跟普通的搜索树不同,博弈树的每一层代表一方的走法,他们是交替的,代表甲方走法的子节点是乙方的走法。
博弈树是从根部向下递归产生的一颗包含所有可能的对弈过程的完全搜索树。
令甲胜的局面值为WIN,乙胜的局面值为LOST,平局为DRAW。轮到甲走时,甲肯定会选择节点值为WIN或者DRAW的,
轮到乙走时,乙肯定会选择节点值为LOST或者DRAW的。
极大极小算法
建立整颗搜索树,因为棋局涉及到的状态转换数量及其大,这是不可能的。
所以我们考虑用具体的值来表示局面值WIN,LOST,DRAW,例如甲胜为+∞,乙胜为-∞,和局为0。
甲希望得到极大值,乙希望得到极小值。
int MinMax(position p, int depth)
{
int bestvalue, value;
if (Game Over)
return evaluation(p);
if (depth <= 0)
return evaluation(p);
if (p.color == RED)
bestvalue = -INFINITY;
else
bestvalue