最大值最小值算法(象棋博弈)

参考自:
人工智能之博弈二、最大最小值方法
象棋AI博弈算法(最大值最小值算法)

主要思想其实就还是暴搜,不过可以在搜索阶段进行剪枝+优化。

这个算法可以在竞赛中用于一些博弈题的打表,然后找规律。

有这么一个博弈题:
在这里插入图片描述
Take Apples

然后就如何用这个算法进行打表。

定义必赢态为先手必赢,必输态为先手必输。以下所说的必赢、必输都是对于先手而言。

首先,如何找到一个必赢态,假设目前是先手要进行操作,可以有k种操作,只有k种操作中有一个必赢态,那么他肯定选这个必赢态就行选择,那么对于先手这个必赢态是如何确定的呢,是后手在这个必赢态下(先手过了就后手,可以抽象为一棵树的节点)进行下一次操作的所有操作都是导致先手必赢,即后手怎么选都不能赢。直到最后某一个能一次拿完。

code

//因为每一轮是两个选手都要操作完之后才结束,所以get_max相当于是先手在操作,get_min是后手。
//1 表示先手赢   0表示先手输
int get_max(int n,int k){//返回的是先手是否赢或者输
	if(n<=k){//如果小于k,那么先手赢。
		return 1;
	}
	int maxx = -1;//相当于只要有一个1,那么就赢,与取max等价。
	for(int i = 1;i <= k;++i){
		maxx = max(maxx,get_min(n-i,k));
	}
	return maxx;
}

int get_min(int n,int k){
	if(n<=k){//如果小于k,那么后手赢,即先手输。
		return 0;
	}
	int minn = 2;//必须全都是1,先手才能赢,与取min等价。
	for(int i = 1;i <= k;++i){
		minn = min(minn,get_max(n-i,k+1));
	}
	return minn;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值