巴什博弈(Bash Game)
• 问题模型:只有一堆n个物品,两人轮流从这堆物品中取物,最多取m个,最后取光者胜。
• 解决思路:当n=m+1时,由于一次最多取m个,无论先取者拿走多少个,后取者都能一次拿走剩余的物品,后者取胜,所以当一方面对n%(m+1)==0的时候,其面临的是必败局势。所以当n==(n+1)*r+s(r为任意自然数,s<=m)时,如果先取者要拿走s个物品,后取者拿走x(x<=m)个物品,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保留给对手留下(m+1)的倍数,就能最后获胜。
威佐夫博奕(Wythoff Game)
• 问题模型:有两堆各若干个物品,两个人轮流从某一堆或同时从两堆取出同样多的物品,规定每次取出k个,多者不限,最后取光者得胜。
• 有两堆各若干物品,两个人轮流从任意一堆中至少取出一个或者从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜。
• 这里的必输局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。从这些必输局势可以发现,每组的第一个是前面没有出现的最小正整数,ak=[k*(1+√5)/2] bk=ak+k (k=0,1,2,…,n 方括号表示取整函数)
• 所以,先求出差值,差值*黄金分割比 == 最小值的话后手赢,否者先手赢。
• (证明见百度百科)
斐波那契博弈(Fibonacci Nim Game)
• 一堆石子有n个,两人轮流取,先取者第一次可以去任意多个,但是不能取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜。
• 同样是一个规律:先手胜当且仅当n不是斐波那契数。
尼姆博弈(Nimm Game)
• 有n堆物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜。
• 假如有3堆物品(a,b,c)
(0,0,0)状态时先手是一个必输局势因为没有东西可取,(0,n,n) 状态时也是必输局势只要后者在另一堆取得物品与前者一样多时那么前者也就是必输局势。慢分析(1,2,3)也是一个必输局势。如果我们将其转化为二进制形式并通过异或运算(^)我们会发现:
0001^0010^0011=0000
通过验证所有的堆数量累^后只要为0就都是必输局势,所以我们就只要记住这个规则:将n堆物品数量全部异或后结果为0者必败,否则必胜。
• 如何使得对手必败?
• 1)如若给出 的是必败状态:a1^a2^......^an=0,则先手不会有任何可能获得胜利;
• 2)若给出的是必胜状态:a1^a2^.......^an=k,(其中k不为零),那么我们的目的是要把必胜状态
• 转化为必败状态从 而使得先手胜利。若a1^a2^...^an!=0,一定存在某个合法的移动,将ai
• 改变成ai'后满足a1^a2^...^ai'^...^an=0。若a1^a2^...^an=k,则一定存在某个ai,
• 它的二进制 表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^k<ai一定
• 成立。则我们可以将ai改变成ai'=ai^k,此时a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。
Sprague-Grundy定理(SG定理)
• SG函数可以说是博弈论中很重要的运用,有了SG函数就可以解决很多很难解决的博弈问题,也是解决例如nim博弈和翻硬币博弈的一些基础。
• 先引入一道题:两个玩家,一堆石子n个;规则:轮流取石子每次只能取1,3或4个;谁取走最后一枚石子谁就获胜。
• 先引入一个概念:
• P点 即必败点,某玩家位于此点,只要对方无失误,则必败。
• N点 即必胜点,某玩家位于此点,只要自己无失误,则必胜。
• 定理:
• 1,所有总结点都是P点;
• 2,无论任何操作,必败点P都能进入必胜点N;
• 3,从任何必胜点N,至少有一种方式进入必败点P;
• 所以:
• 当n=0时,为P点,因为你没有石子可取;
• 当n=1,2或3时,为N点,因为你都可以一次取完;
• 当n=4时,为P点,因为你一次不可能全部去完但下一次的操作可以全部取完;
• 如此类推:
• n:0 1 2 3 4 5 6 7 8 9…
• position:P N N P N N P N N P…
• SG函数:
• 先引进一个定理mex(miniml,excludant)运算,就是对集合求运算,表示不属于这个集合的最小非负整数。例如: mex{1,2,4}=0,mex{0,2,3,6}=1。
• 对于任意的状态x,定义SG(x)=mex(S),其中S是x后继状态(相当于一个树节点下的子节点)的SG函数值集合。假如x的后继状态有三个a,b,c,那么SG(x)=mex{SG(a),SG(b),SG(c)}。如果SG(x)=0,那么x就是P点。
• 如果游戏变成了有N堆石子那么判断的就是SG[a1]^SG[a2]^…^SG[an]的值为0就是P否则为N。