参考自:
人工智能之博弈二、最大最小值方法
象棋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;
}