极大极小搜索

极大极小搜索

刚刚正在写棋盘问题,中途出了一个BUG,暂时还没找出来,就先写这篇博客来详细阐述一下什么时极大极小搜索。

一、详述

​ 什么是极大极小搜索?这个问题如果你遇到了,那肯定是在双人对弈的问题中。没错,在双人对弈问题里,双方的目的都是一致的,我方想尽可能地赢,尽可能地让对方输。在真实棋局中,我方往较大赢面的方向走,对方的目的就不同了,他可以朝他较大赢的方向走,也可以反过来堵我们,这样就是降低我们赢得几率(最后大不了平局嘛)。

​ 明白了这个,接着就可以很好地解释算法了。在实际算法中,我方考虑的是往较大赢面的方向走,但对方就不用往他赢的方向走了,他的目的只有一个,尽可能的降低我方赢得几率(反过来想,他赢的机会也就越多了嘛)。

二、算法图示

​ 下面我用一张图当示例展示一下刚刚的思想:

这里主要借鉴的是博主: 一张图读懂极大极小搜索和α-β剪枝_housong_csdn的博客-CSDN博客_极大极小搜索

首先,使用方框代表我方,圆形代表对方

https://jlice-top.oss-cn-beijing.aliyuncs.com/466b1b14002211e9bac5509a4c21c90b.png

我方的目的是在下面所有的方框中选取最大的,而对方的目的是尽可能地选取较小地。

经过每个分支的选择后,可呈现下图:

https://jlice-top.oss-cn-beijing.aliyuncs.com/468b9c8c002211e99464509a4c21c90b.png

从图中我们可以知道,在对方的阻挠下,我方可以选取的最大值只能是 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值