由取石子游戏想到的博弈论

先将本文的参考列表如下,以示对大咖的尊敬:

作者:ojshilu     两人取石子游戏 组合数学-博弈问题》

作者:提比-我有特殊的AC技巧 取石子游戏【各类取石子总结】》(该文也系转载)

    有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。

    在讨论所有问题之前 ,我们要明白一件事,因为这是一个博弈游戏,游戏双方都希望自己胜,所以不管是先手还是后手每出一次手都会采用“最优策略”(尽量使对方输的策略)。

    首先给出两个名词:“先手必胜态““后手必胜态“。态是状态的态。

(一)巴什博弈(Bash Game):现有一堆n个物品,两个人轮流从这堆物品中取物,规定至少每次至少取1个,最多取m个。最后取光者胜。

分析1:显然当n=m+1(状态)时,由于一次最多只能取m个,所以无论先手拿走多少个,后手都能够一次性拿走剩余的物品(读者可自己模拟一遍)。故有结论:当n=m+1时,产生后手必胜态

分析2:接下来,我们分析n是m+1的倍数的情况。先给出结论:当n=p*(m+1)时(p=1,2,3....n,即p为正整数),产生后手必胜态。

下面用数学归纳法证明:

假设当n=(p-1)*(m+1)时,产生后手必胜态

则当n=p*(m+1)时,因为p*(m+1)=(p-1)*(m+1)+(m+1),无论先手怎么选,后手都可以使得先取完(p-1)*(m+1)部分(此时保持后手胜),剩下的m+1个物品,根据分析1,还是后手胜。

得证。

分析3:前面分析1和分析2都是后手胜态的结论,现在我们来讨论先手胜态的解:自然不是分析1和分析2的情况就是先手必胜态,所以有结论:当n=p*(m+1)+q时(p是正整数,q<=m),产生先手必胜态。

这里的证明,因为才疏学浅不知道怎么证明,如有哪位高人能给出证明,不胜感激!

小结:如果能将问题化解成巴什博弈,则可用上述公式进行求解。

练习1:这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。

练习2:从一堆100个石子中取石子,最后取完的胜。

(二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,甲乙两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。(这里对题目的理解有点难度,应该是从某一堆中取任意多个,或同时在两堆中取同样多个物品;取光是指所有两堆物品数都为0)

分析1:这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,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)。

为什么(0,1)(0,2)……(0,n)不是奇异局势?只剩下n个,甲取n个就先取光,就赢了。

为什么(1,1)(2,2)……(n,n)不是奇异局势?甲可以在两堆中取同样多个取光,所以甲就赢了。

为什么(1,3)(1,4)……(1,n)(n>=3)不是奇异局势?当先手在右堆取(1,2,3,4,……,n-2)个后,就让后手面对奇异局势了。

其余同理!

分析2:奇异局势的判定:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

对于这个数字序列,设第k个奇异局势是(Ak,Bk),k为自然数,我们发现它具有递推的规律:初始条件当k=0时为(0,0),下一个(Ak,Bk)中的Ak是前面未出现过的最小自然数,下一个Bk=Ak+k。

那么剩下一个问题Ak怎么求呢?读者自然会想到用一个数组存储已经有的自然数,也算是一种方法,其实有更好的方法。

分析3(关于求Ak):观察每个Ak,当k=1,2,3,4,5,6,7,8时,Ak=1,3,4,6,8,9,11,12,我们会发现Ak=[k*1.61803398875],这个1.61803398875是个什么东西?嘿嘿!著名的黄金分割数!等等,不对,黄金分割数不是2/(1+sqrt(5))=(sqrt(5)-1)/2吗,其小数约等于0.61803398875。没错只不过是黄金分割数的倒数(1+sqrt(5))/2,约等于1.61803398875。所以黄金分割数很重要,它的倒数也很重要,请读者记住。

小结:

这个奇异局势的序列的通项公式可以表示为:

  Ak = [k*(1+sqrt(5.0)/2]

  Bk = Ak + k  

  其中k=0,1,2,...,n ,方括号表示int取整函数。

有了这个通项式子,逆向的,对于某一个局势,只需要判断其A是否是黄金分割数的某个k的倍数,然后再确认B是否等于A+k即可。

(三)尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

分析1:按递推法,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。

分析2:(0,0,0)(0,n,n)(1,2,3)这三个奇异局势很有意思,它与二进制有密切关系,计算机算法里面有一种叫做按位模2加,也叫做异或的运算,C++中用符号^表示这种运算。这种运算和一般加法不同的一点是1+1=0。

先看(1,2,3)的按位模2加的结果:

1 =二进制01
2 =二进制10
3 =二进制11 ^
———————
0 =二进制00 (注意不进位)

   对于奇异局势(0,n,n)也一样,结果也是0。

    我们用(a,b,c)表示某种局势, 任何奇异局势(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)即可。

获胜情况对先取者进行讨论:

异或结果为0,先取者必败,无获胜方法。后取者获胜;

结果不为0,先取者有获胜的取法。

小结:对于尼姆博奕(Nimm Game)我们用(a,b,c)表示某种局势, 任何奇异局势(a,b,c)都有a^b^c =0。

拓展:Nimm Game)有k堆各n个石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限。取走最后石子的人获胜。

我们用(a1,a2,a3,……,an)表示某种局势,任何奇异局势都有:a1^a2^a3^a4^……^an=0

玩家的策略:

    就是把面对的非奇异局势变为奇异局势留给对方。也就是从某一堆取出若干石子之后,使得每一个bit位上1的个数都变为偶数,这样的取法一般不只有一种。可以将其中一堆的石子数变为其他堆石子数的位异或运算的值(如果这个值比原来的石子数小的话)。


猜你喜欢

转载自blog.csdn.net/blaze003003/article/details/79875384
今日推荐