目录
博弈问题
博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。
此类问题一般有如下特点:
1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。
2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。
3、公平博弈。即两人进行决策所遵循的规则相同。
理论铺垫
1.P状态和N状态:假设双方都采取最明智的策略,则对于一些状态,刚完成走步的游戏者(Previous Player) 一定胜利,而对于其他状态,下一个走步的游戏者(NextPlayer) 一定胜利。把两种状态称为P状态(P position) 和N状态(N position) 。
2、P/N状态有如下性质:
1.若面临末状态者为获胜则末状态为胜态否则末状态为必败态。
2.一个局面是胜态的充要条件是该局面进行某种决策后会成为必败态。
3.一个局面是必败态的充要条件是该局面无论进行何种决策均会成为胜态
巴什博弈
1.如果n<=m,先取者胜。
2.如果n=m+1,那么由于一次最多只能取m 个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。所以当一方面对的局势是n%(m+1)=0时,其面临的是必败的局势。
结论:
至此我们发现了如何取胜的法则:如果n=(m+1)*r+s,(r 为任意自然数,s≤m),那么先取者要拿走s 个物品,如果后取者拿走k(k≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)*(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
巴什博弈的一个最重要的特征就是只有一堆。然后就在其中改,要么在范围内不规定个数,要么就规定只能取几个,再要么就倒过来,毕竟是最简单的博弈,代码相对而言较短。
例1
import java.util.Scanner;
/**
* 在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,
* 她们是用旺仔小馒头当作石子。游戏的规则是这样的。设有一堆石子,数量为N(1<=N<=1000000),
* 两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利。
* 我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么?
* 输入描述:
* 第一行是一个正整数n表示有n组测试数据
* 输入有不到1000组数据,每组数据一行,有两个数N和M,之间用空格分隔。
* 输出描述
* 对于每组数据,输出一行。如果先取的TT可以赢得游戏,则输出“Win”,否则输出“Lose”(引号不用输出)
* 示例输入:
* 2
* 100 1
* 1 100
* 示例输出:
* Lose
* Win
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int count = in.nextInt();
while (count > 0){
int n = in.nextInt();
int m = in.nextInt();
if(n % (m + 1) == 0){
System.out.println("Lose");
}else {
System.out.println("Win");
}
count--;
}
}
}
威佐夫博弈
可以得出结论无论先手怎么取,后手总是能赢,所以先手必输!
可以发现 不论第一次先手如何取,那么后手会变成前面分析过的先手必输的局面
我们继续往下写。
第五个 ( 6 ,10 )
第六个 ( 8 ,13)
第七个 ( 9 , 15)
第八个 ( 11 ,18)
会发现他们的差值是递增的,为 0 , 1 , 2, 3, 4 , 5 , 6, 7.....n
而用数学方法分析发现局面中第一个值为前面局面中没有出现过的第一个值,比如第三个局面,前面出现了 0 1 2,那么第三个局面的第一个值为 3 ,比如第五个局面,前面出现了 0 1 2 3 4 5 ,那么第五个局面第一个值为6。
再找规律的话我们会发现,第一个值 = 差值 * 1.618
而1.618 = (sqrt(5)+ 1) / 2 。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?
我们总结了如下公式:a[i] =[i(1+√5)/2],b[i]= a[i] + i (k=0,1,2,...,n 方括号表示取整函数)
奇异局势的性质:
1、任何自然数都包含在一个且仅有一个奇异局势中。
2、任意操作都可将奇异局势变为非奇异局势。
3、采用适当的方法,可以将非奇异局势变为奇异局势。
结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜
威佐夫博弈的性质:
性质1:所有自然数都会出现在一个必败点中,且仅会出现在一个必败点中;
证明:m(k)是前面没有出现过的最小自然数,自然与前k-1个必败点中的数字都不同;m(k)>m(k-1),否则违背m(k-1)的选择原则;n(k)=m(k)+k>m(k-1)+(k-1)=n(k-1)>m(k-1),因此n(k)比以往出现的任何数都大,即也没有出现过。又由于m(k)的选择原则,所有自然数都会出现在某个必败点中。
性质2:规则允许的任意操作可将必败点移动到必胜点;
证明:以必败点(m(k),n(k))为例。若只改变两个数中的一个,由于性质1,则得到的点一定是必胜点;若同时增加两个数,由于不能改变两数之差,又有n(k)-m(k)=k,故得到的点也一定是必胜点。
性质3:一定存在规则允许的某种操作可将必胜点移动到必败点;
证明:以某个必胜点(i,j)为例,其中j>i。因为所有自然数都会出现在某个必败点中,故要么i等于m(k),要么j等于n(k)。