博弈论总结

一、巴什博弈
1、问题模型:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜。
这类博弈是可以自己当场推的。比如,按原题意,设M=3,N=10,那么我们可以从N=0开始推面临这个N的人的胜负态。当一人面临N=0的情况,那么他必败;所以当一人面临N=1,N=2,N=3的情况时,他都可以通过抓取一定数目的石子来使另一人面临N=0的必败态,因此这三种是必胜态;而当N=4时,面临此状态的人无法通过抓取一些石子来使另一人达到N=0的必败态,相反,不论这人怎么抓,都会让对手进入N=1/2/3的必胜态,因此此人必败。就这样一直推,最终就可以找到规律。
2.总结:当n%(m+1)==0时,先手必败。
3.变形:条件不变,最后取光者败。此时当(n+1)%(m+1)==0时,先手必败。

二、威佐夫博弈
1、问题模型:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
2、总结:面对“奇异局势”时,此人必败。(每一个非奇异局势都可以转换为奇异局势。)
奇异局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)…(a,b)
如下公式判断它是不是奇异局势: a =[k(1+√5)/2],b= a + k (k=0,1,2,…,n 方括号表示取整函数)


int main()
{
    int n, m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int a=min(n,m);
        int b=max(n,m);
        double k=(double)b-a;
        int term=(int)(k*(1+sqrt(5))/2);
        if(term==a)
            printf("0\n");//先手败
        else
            printf("1\n");//后手败
    }
    return 0;
}

//可以不看
3、满足上公式的局势性质:

(1)任何自然数都包含在一个且仅有一个奇异局势中。

由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak-1 + k-1 = bk-1 > ak-1 。所以性质成立。

(2)任意操作都可将奇异局势变为非奇异局势。

若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势

(3)采用适当的方法,可以将非奇异局势变为奇异局势。

假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0);如果a = ak ,b > bk,那么,取走b – bk个物体,即变 为奇异局势;如果 a = ak , b < bk ,则同时从两堆中拿走 ak – ab – ak个物体,变为奇异局势( ab – ak , ab – ak+ b – ak);如果a > ak , b= ak + k,则从第一堆中拿走多余的数量a – ak 即可;如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k),从第二堆里面拿走 b – bj 即可; 第 二种,a=bj (j < k),从第二堆里面拿走 b – aj 即可。

三、斐波那契博弈

1、问题模型:

有一堆个数为n的石子,游戏双方轮流取石子,满足:

(1)先手不能在第一次把所有的石子取完;

(2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家。

2、解决思路:

当n为Fibonacci数时,先手必败。即存在先手的必败态当且仅当石头个数为Fibonacci数。

证明:根据“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。如n=83 = 55+21+5+2,我们看看这个分解有什么指导意义:假如先手取2颗,那么后手无法取5颗或更多,而5是一个Fibonacci数,那么一定是先手取走这5颗石子中的最后一颗,同理,接下去先手取走接下来的后21颗中的最后一颗,再取走后55颗中的最后一颗,那么先手赢。

反证:如果n是Fibonacci数,如n=89:记先手一开始所取的石子数为y

(1)若y>=34颗(也就是89的向前两项),那么一定后手赢,因为89-34=55=34+21<2*34。

(2)y<34时剩下的石子数x介于55到89之间,它一定不是一个Fibonacci数,把x分解成Fibonacci数:x=55+f[i]+…+f[j],若,如果f[j]<=2y,那么对B就是面临x局面的先手,所以根据之前的分析,后手只要先取f[j]个即可,以后再按之前的分析就可保证必胜。

四、尼姆博弈

1、问题模型:有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

2、解决思路:用(a,b,c)表示某种局势,显证(0,0,0)是第一种奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。

搞定这个问题需要把必败态的规律找出:(a,b,c)是必败态等价于a ^ b ^ c=0(^表示异或运算)。

3、推广一:如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b< c,我们只要将 c 变为 a ^ b,即可,因为有如下的运算结果: a ^ b ^ ( a ^ b)=(a ^ a) ^ (b ^ b)=0 ^ 0=0。要将c 变为a ^ b,只从 c中减去 c-(a^b)

4、推广二:当石子堆数为n堆时,则推广为当对每堆的数目进行亦或之后值为零是必败态。

五、环形博弈
1.问题模型:一圈石子,每次只能拿一个或相邻的两个。取光者胜。
2.思路:n<=2,先手胜,否则后手胜。
n>2的情况下,先手将环打破为一条链,后手将这条链打破为数目相同的两条链,在后续一直维护两条链数量相同即可。

六、利用博弈的无记忆性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值