极大极小搜索
刚刚正在写棋盘问题,中途出了一个BUG,暂时还没找出来,就先写这篇博客来详细阐述一下什么时极大极小搜索。
一、详述
什么是极大极小搜索?这个问题如果你遇到了,那肯定是在双人对弈的问题中。没错,在双人对弈问题里,双方的目的都是一致的,我方想尽可能地赢,尽可能地让对方输。在真实棋局中,我方往较大赢面的方向走,对方的目的就不同了,他可以朝他较大赢的方向走,也可以反过来堵我们,这样就是降低我们赢得几率(最后大不了平局嘛)。
明白了这个,接着就可以很好地解释算法了。在实际算法中,我方考虑的是往较大赢面的方向走,但对方就不用往他赢的方向走了,他的目的只有一个,尽可能的降低我方赢得几率(反过来想,他赢的机会也就越多了嘛)。
二、算法图示
下面我用一张图当示例展示一下刚刚的思想:
这里主要借鉴的是博主: 一张图读懂极大极小搜索和α-β剪枝_housong_csdn的博客-CSDN博客_极大极小搜索
首先,使用方框代表我方,圆形代表对方
我方的目的是在下面所有的方框中选取最大的,而对方的目的是尽可能地选取较小地。
经过每个分支的选择后,可呈现下图:
从图中我们可以知道,在对方的阻挠下,我方可以选取的最大值只能是 15。
注:如果你要是对这个15,包括这个对方的3,15,1是怎么来的不太了解的话,去参考
一张图读懂极大极小搜索和α-β剪枝_housong_csdn的博客-CSDN博客_极大极小搜索(因为图的原因不方便引用,所以只能自己去看了)
三、伪代码的实现
看到此,我相信你已经明白了Minimax算法的思想。下面伪代码的实现才是及其重要的,因为这关系到最后的写代码的过程。
int MaxMin(position p,int d)
{
int bestvalue; /* 对于当前人(指我max)最后可以获得的最好结果 */
int value;
if(game over) //检查游戏是否结束
return evaluation(p); // 游戏结束,返回估值
if(max) // 我方初始化
bestvalue=-INFINTY;
else // 对方初始化
bestvalue=INFINTY;
for(each possibly move m)
{
MakeMove(m); //走棋
value=MaxMin(p,d-1); /* 计算走完之后的价值 */
UnMakeMove(m); //恢复当前局面
if(max) /* 对抗搜索出现了 */
bestvalue=max(value,bestvalue);//取最大值
else
bestvalue=min(value,bestvalue);//取最小值
}
return bestvalue;
}