博弈论

博弈论
大纲—— 巴什博弈、威佐夫博弈、尼姆博弈

一、巴什博弈 (一堆物品 两人取)
只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
n %(m+1)==0 则后手胜利 (最后取光者得胜。)
对于巴什博弈,如果我们规定 最后取光者输,那么又会如何呢?
(n-1)%(m+1)==0则后手胜利 (最后取光者输)
这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。 (最后取光者得胜的意思)
因为100%(10+1)!=0 所以 先手必胜

详解:
Bash Game: 同余理论
一堆n个物品,两人轮流取,每次取1至m个,最后取完者胜
比如10个物品,每次只能取1到5个,则先手方必赢
1.面对[1…m]个局面,必胜
2.面对m+1个局面,必输
3.如果可以使对手面临必输局面,那么是必赢局面
4.如果不能使对手面临必输局面,那么是必输局面

基础:1 , 2, …, m是必赢局面,m+1是必输局面
递推:m+2,m+3, … ,2m+1是必赢局面,2m+2是必输局面

k(m+1)是必输局面,应该允许k=0,因为0显然也是必输局面
在必输局和必赢局中,赢的一方的策略是: 拿掉部分物品,使对方面临k(m+1)的局面
例如上例中10个物品,只能拿1到5个,先手方拿4个即可,对手无论拿多少个,你下次总能拿完
从另一个角度思考这个问题,如果物品数量随机,那么先手一方胜利的概率是m/(m+1),后手方胜利的概率是1/(m+1)
例题如下
Hdu 1847
大概题意:共n张牌,两人轮流抓牌,规定每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…),最后抓完牌的人胜利。
题解:在草稿纸上手推列出n取不同值时的情况 很容易看出:n%3==0 则后手必胜,否则先手必胜

Hdu 2147
题意省略。题解:在草稿纸上手推 很容易得到 (n*m)%2==0 则先手必胜,否则先手必败

Hdu 2149
题意略。
题解:

if (m<=n) cout <<[m,n] 
     else {	    //  x可取值范围 [1,n] 
             cout<< 满足 (m-x)%(n+1)==0条件 的 x 
              如果没有   cout<<"none" 
}

很简单的巴什博弈

Hdu 2188
题意略。
题解:if(n%(m+1)==0) 后手必胜,否则后手必败。
最原始的巴什博弈。

Hdu 2897 (很经典的题)
题意:n个硬币,两人依次轮回取,规定每次只能取 [p,q] 个,如果剩下少于p枚就要一次取完,最后取光者输。
解法:

样例给的 p可能大于q  此时需要两者互换值。
在纸上手推规律 发现: n==[1,p]  先手必败     n==[p+1,p+q] 先手必胜
                      n==[1+p+q,p+p+q] 败  n==[p+p+q+1,p+q+p+q]...
                                ...
     n==[1+x(p+q),p+x(p+q)] 败     n==[p+1+x(p+q),p+q+x(p+q)] 胜
     一直重复着p个败q个胜。
即  如果 n%(p+q)==[1,p]  先手必败 ,否则先手必胜。

试思考,如果最后取光者胜(之前是最后取光者输),此时会怎么样呢?
经分析,此时一直重复着 q个胜 p个败(p<=q)
即 如果 n属于[1+x(p+q),q+x(p+q)] (n%(p+q)==[1,q]) 先手必胜。

二、威佐夫博弈(两堆物品 两人取)
有两堆各若干个物品,两个人轮流从某一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这种情况下是颇为复杂的。我们用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,…,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、
(12,20)。(注:k表示奇异局势的序号, 第一个奇异局势k=0)
可以看出,a[0]=b[0]=0,a[k]是未在前面出现过的最小自然数,
而 b[k]= a[k] + k。奇异局势就是当你面临这种情况的时候,你必然是输的,反之,你必赢。
所以要胜的话,就要想办法在自己取过物品后让对方面对奇异局势。
重要结论:(a,b)b>= a的,如果(int)(b-a)*(Math.sqrt(5)+1)/2 == a,那么先手必输。如果不等,后者必输。

例题如下:
Hdu 1527
题意略。题解:如果 (int) abs(b-a)*(sqrt(5)+1)/2==min(a,b) 先者必输。
最原始的威佐夫博弈。

Hdu 2177 (Hdu 1527的升级版)
题意:略。
题解:

如果(a,b)是奇异状态, cout <<0<<endl;
      else {
             cout <<1<<endl;
             //  接下来 输出能达到的奇异状态
// 按题意要求 首先是两堆同时取i后到达的奇异状态
    ............(代码省略)
     // 然后是 在任意一堆中取i后到达的奇异状态
      ..............(代码省略)
}

三、尼姆博弈( m堆物品 两人取 ) m >=3
定义是以三堆物品为例,但原理一样,都与异或和有关
有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。(必胜策略是想办法让对手面对奇异状态)
这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论自己如何拿,接下来对手都可以将其变为(0,n,n)的情形。
计算机算法里面有一种叫做按位模2加,也叫做异或(同0异1)的运算,我们用符号⊕表示这种运算,先看(1,2,3)的按位模2加的结果:
1 =二进制01
2 =二进制10
3 =二进制11 ⊕
———————
0 =二进制00 (注意不进位)
对于奇异局势(0,n,n)也一样,结果也是0。
任何奇异局势(a,b,c)都有a⊕b⊕c =0。
注意到异或运算的交换律和结合律,及a⊕a=0,:
a⊕b⊕(a⊕b)=(a⊕a)⊕(b⊕b)=0⊕0=0。
所以从一个非奇异局势向一个奇异局势转换的方式可以是:
1)使 a = c⊕b
2)使 b = a⊕c
3)使 c = a⊕b
例1。(14,21,39),14⊕21=27,39-27=12,所以从39中拿走12个物体即可达到奇异局势(14,21,27)。
例2。(55,81,121),55⊕81=102,121-102=19,所以从121中拿走19个物品就形成了奇异局势(55,81,102)。
例3。(29,45,58),29⊕45=48,58-48=10,从58中拿走10个,变为(29,45,48)。
结论:把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜(先手总有办法让对方面对奇异状态)。
例题如下:

Hdu 2176 Hdu 1850 (最后取光者胜)
题意略。题解:异或和。考察的都是 先手要赢,第一步应该如何取物品。此时先手的策略是:要让对手面对奇异局势。

Hdu 1907 (最后取光者败) ⭐⭐⭐ 很重要的题 ⭐⭐⭐
题意:本题最后取光者败。
题解:若是 S2,S1,T0 , 则先下的人必胜。
若是 T2,S0 则先下的人必输。
讲解: https://blog.csdn.net/liwen_7/article/details/7938423
用通俗语言概括一下:如果 异或和不为零且仅有奇数个孤单堆
或者 异或和为零且充裕堆的堆数大于等于2
先手必败。
否则 先手必胜。

参考文献:
【1】百度百科.
【2】给我一个团队,干翻TX,博弈论的算法总结,博客园,2018-11-03 19:37.
原文: https://www.cnblogs.com/674001396long/p/9901811.html
【3】AC_Gibson,博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈),CSDN,
2014-11-30 18:37:55.
原文: https://blog.csdn.net/ac_gibson/article/details/41624623
【4】小逸,【算法设计与分析】三个博弈论算法分析,CSDN,2012-02-01 13:14:31.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值