负极大值搜索

编者最近在学校五子棋AI博弈算法,好不容找到一本书籍资源来学习,但其中内容是作者在2003年缺少中文算法书籍的情况下编写的,因此有一些语义错误或语义不详的地方,对编者阅读造成很大影响。比如这个负极大值搜索的推导则是一笔带过,让编者百思不得其解。现在将花了三小时得出的推导过程,在这里整理一下,如果有错误请读者指正。
首先,负极大值搜索是极大极小值搜索的变种,对运行效率上没有什么影响,但代码更简洁,很多博弈算法作者都是用负极大值来演示,因此还是有必要学习的。
其实这个算法本质上是一种负负得正的关系。先看下极大极小值搜索的伪代码:

1。 p 为棋盘
2。 d 为规定的搜素最大深度,比如d层红方,d-1层为黑方,d-2层为红方...依此类推,可采用mod2来判断当前是哪一方
4。评估棋盘的函数evaluation,当然需要看是哪一方,若红方为机器,黑方为人,那么机器(红方)做为极大(INF),人作为极小(-INF),让机器选择最合适的一步。
int MiniMax(chessmap p , int d)
{
    int bestvalue , value ;
    if( Game Over )// 如果游戏结束
        return evaluation(p);
    if(depth <= 0) // 如果已经到了搜索树叶子结点
        return evaluation(p);
    if( d % 2  == RED) //轮到红方
        bestvalue = - INF; 
    else
        bestvalue = INF ;
     for(each possible move m)
    {
        MakeMove(m) ; //产生第i个局面(子节点),p会相应变化
        value = MiniMax(p,d-1);//递归
        UnMakeMove(m) ; // 恢复p
        if(d % 2 == RED)
            bestvalue = max(value ,bestvalue);//取最大
        else
            bestvalue = min(value ,bestvalue);//取最小
    }
    return bestvalue;
}

我这里就不详细解释了,默认大家都有一定了解。
首先要知道很重要的一点,负极大值的叶节点评估函数与极大极小不同:
极大极小的评估机制:若电脑为黑棋,则默认评估机制为在这个位置上总评分为:
黑棋总分-白棋总分 这个是固定的 不会以执棋对象为改变。而负极大值则是相反
负极大值的评分机制:若执棋方为黑棋 则评分=白棋总分-黑棋总分
若执棋方为白棋 则评分=黑棋总分-白棋总分
而负极大值搜索的简洁在于分开电脑和玩家的判断放在了叶节点 return 相应的评分机制
现在来将负极大值搜索伪代码附上:

更好话感韩庚韩庚韩庚规划 话感在这里插入图片描述要注意的是这里的递归调用前面有个负号,大家可以画图来使用负极大值,落黑子时即是求极大值 这里与极大极小搜索相反 相当于乘了个-1 评分=白棋总分-黑棋总分 evaluation 叶节点返回估值,返回到负极大值搜索中,加上负号, 注意:负极大值就是简洁在每次只用求下一层结点中的最大值,因此这里即求最大值 但因为返回的值*-1 相当于负负得正 得到的是最大值仍是最大值(负号会改变了大小关系)
落白子时则是求极小值 ,极大值则是return 黑棋评分-白棋评分 与极大极小搜索相同,但在负极大值函数中则会带上负号 原来的最大值就是极小值

因此整个负极大值搜索的代码避免了使用条件语句来选择最大或最小值 归并成一个语句

现在仔细回想是不是 就是负负得正的关系?
因此我推导出了另一种求法 也可以简洁代码
方法是 return 仍然分条件,简洁代码的目的其实就是为了让函数里不再需要分条件 因此我们可以只让求极小值时来迎合求 归并统一的求极大值 那么只需要让return 返回时条件是白棋落下 即是求极小值时 变为(白棋评分-黑棋评分) 而负极大值则是(黑棋评分-白棋评分) 而返回函数前不再需要加上负号 因此 求极大值时没有改变 求极小值时 因为负号改变了大小关系 最大的即是最小的!!

因此我手写一份笔记来简洁表达这种关系:附上图片
在这里插入图片描述
字不好 多多见谅

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值