博弈之最大-最小搜索算法

最近正在做一个人工智能的中国象棋,所以不可避免的接触到了博弈论,因为考虑到以后还会有所涉及 (alpha-beta search),所以写成了一片文章

这里以中国象棋为前提,AI首先需要一个博弈树 (变种的二叉树偷笑,N叉树),这是基础,因为下面的算法都是基于这颗树的,如下图就是一个#字棋游戏的博弈树:

博弈之最大-最小搜索算法_第1张图片

至于为什么需要这棵树我相信你很容易想到,计算机最擅长什么?没错,就是机械式穷举,试想一下,当你走了一步马后,计算机准备执行兵,它就会考虑所有兵能走的情况,然后他会再穷举你接下来的步骤然后再继续加深...不过回过头来想一下你就会发现这种方法更适用于一些棋盘比较小得如上面的#字棋,这样计算机只需要很少的搜索深度,就能选择最佳方案,因此一个设计优秀的#字棋AI基本上你是赢不了的,除非你也有同他那样的穷举能力,那么输赢就要取决于谁先走了


扯远了,回头再谈最大最小,这显然是一个对立的概念,如果你认为所谓最大最小就是穷举过程中找到的最佳走法和最差走法那你就错了,既然是对立的概念,当然对象是两个人了,这里的最大最小是当前轮到AI走了,AI进行穷举并选着一条对于AI来说最佳对于我来说最差的走法,但是再考虑一下,机器也是有限的,对于象棋这样棋盘较大的游戏,穷举完博弈树在当前科技下不可能,因此我们的最大最小算法需要一个深度即向前走几步,计算机能在这个指定的比较小的整数能对博弈树进行穷举

接着上面,当我们遍历若干树枝后我们总不可能就结束了吧,是的,如果在游戏没有结束的情况下我们还需要一个评价启发函数,这个函数用于判断当前策略的价值,如果使用某走法能赢,就返回一个大的正数;如果这种走法会输,就返回一个大的负值,如果走法会产生合局,就返回一个0左右的数;如果由于当前博弈树深度没办法判断局面,那么评价函数会返回一个启发值,至于这个启发值怎么算,百度一下你就知道,好吧我还是提供一片基于中国象棋的启发值计算(目测这个公式是作者自己使用的)()http://www.xqbase.com/computer/basic_evaluation.htm

然后就是喜闻乐见的code了

总结一下上面的内容,这个函数的参数一个设计者想让AI进行穷举的博弈树的深度depth,然后就是内部调用一个评价启发函数,如下代码

int MaxMin(int depth,int player_mode)
{ 
 int best = INFINITY(player_mode);//player_mode是参照物,如果当前落子是人,则返回一个很小的值,反之返回很大
 if (depth <= 0)//当前以局面为博弈树的root
  {
  return Evaluate();//估值函数
 } 
 GenerateLegalMoves(); //生成当前所有着法 
 while (MovesLeft())//遍历每一个着法
  { 
  MakeNextMove(); //实施着法
  val = -MaxMin(depth - 1);//换位思考
  UnmakeMove(); //撤销着法
  if (val > best)
      { 
   best = val; 
  } 
 } 
 return best; 
}
另别看depth说得这么轻巧,六层的搜索就接近是二十亿,而十层的搜索就超过两千万亿,所以由此产生了以后会说的alpha-beta搜索算法

你可能感兴趣的:(博弈之最大-最小搜索算法)