首页 > 代码库 > 博弈总结
博弈总结
下面是我从网上收集的关于组合博弈的资料汇总:
有一种非常有意思的游戏,就是有物体若干堆。能够是火柴棍或是围棋子等等均可。
两个
人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间非常古老的一个游戏
,别看这游戏极其简单。却蕴含着深刻的数学原理。以下我们来分析一下要怎样才可以
取胜。
(一)巴什博奕(Bash Game):仅仅有一堆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)的倍数,就能最后获胜。
这个游戏还能够有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十
个,谁能报到100者胜。
(二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同
时从两堆中取相同多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这样的情况下是颇为复杂的。
我们用(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)。
能够看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,神秘局势有
例如以下三条性质:
1。
不论什么自然数都包括在一个且仅有一个神秘局势中。
因为ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak
-1 + k-1 = bk-1 > ak-1 。所以性质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 – a
j 就可以。
从如上性质可知。两个人假设都採用正确操作。那么面对非神秘局势,先拿者必胜
;反之,则后拿者取胜。
那么任给一个局势(a,b)。如何推断它是不是神秘局势呢?我们有例如以下公式:
ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,…,n 方括号表示取整函数)
奇异的是当中出现了黄金切割数(1+√5)/2 = 1。618…,因此,由ak,bk组成的矩形近
似为黄金矩形,因为2/(1+√5)=(√5-1)/2,能够先求出j=[a(√5-1)/2]。若a=[
j(1+√5)/2],那么a = aj,bj = aj + j。若不等于,那么a = aj+1。bj+1 = aj+1
+ j + 1,若都不是。那么就不是神秘局势。
然后再依照上述法则进行。一定会遇到神秘
局势。
(三)尼姆博奕(Nimm Game):有三堆各若干个物品。两个人轮流从某一堆取随意多的
物品。规定每次至少取一个。多者不限,最后取光者得胜。
这样的情况最有意思,它与二进制有密切关系,我们用(a,b。c)表示某种局势,首
先(0。0。0)显然是神秘局势,不管谁面对神秘局势。都必定失败。另外一种神秘局势是
(0,n,n)。仅仅要与对手拿走一样多的物品,最后都将导致(0。0,0)。细致分析一
下。(1,2。3)也是神秘局势。不管对手怎样拿,接下来都能够变为(0,n,n)的情
形。
计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示
这样的运算。这样的运算和一般加法不同的一点是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 =0。
如果我们面对的是一个非神秘局势(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)就可以。
例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,4
5,48)。
例4。我们来实际进行一盘比赛看看:
甲:(7,8,9)->(1,8,9)神秘局势
乙:(1,8,9)->(1,8,4)
甲:(1,8,4)->(1,5,4)神秘局势
乙:(1,5,4)->(1,4,4)
甲:(1,4,4)->(0,4,4)神秘局势
乙:(0,4,4)->(0,4,2)
甲:(0.4,2)->(0,2,2)神秘局势
乙:(0,2,2)->(0,2,1)
甲:(0,2,1)->(0,1,1)神秘局势
乙:(0,1,1)->(0,1,0)
甲:(0,1,0)->(0,0,0)神秘局势
甲胜。
题目1:今有若干堆火柴,两人依次从中拿取。规定每次仅仅能从一堆中取若干根,
可将一堆全取走,但不可不取。最后取完者为胜,求必胜的方法。
题目2:今有若干堆火柴,两人依次从中拿取,规定每次仅仅能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
嘿嘿,这个游戏我早就见识过了。小时候用珠算玩这个游戏:第一档拨一个。第二档拨两个。依次直到第五档拨五个。然后两个人就轮流再把棋子拨下来。谁要是最后一个拨谁就赢。有一次暑假看见两个小孩子在玩这个游戏,我就在想有没有一个定论呢。以下就来试着证明一下吧
先解决第一个问题吧。
定义:若全部火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,
为利己态,用S表示。
[定理1]:对于不论什么一个S态。总能从一堆火柴中取出若干个使之成为T态。
证明:
若有n堆火柴,每堆火柴有A(i)根火柴数,那么既然如今处于S态。
c = A(1) xor A(2) xor … xor A(n) > 0;
把c表示成二进制,记它的二进制数的最高位为第p位,则必定存在一个A(t),它二进制的第p位也是1。
(否则,若全部的A(i)的第p位都是0,这与c的第p位就也为0矛盾)。
那么我们把x = A(t) xor c,则得到x < A(t).这是由于既然A(t)的第p位与c的第p位同为1,那么x的第p位变为0,而高于p的位并没有改变。所以x < A(t).而
A(1) xor A(2) xor … xor x xor … xor A(n)
= A(1) xor A(2) xor … xor A(t) xor c xor … xor A(n)
= A(1) xor A(2) xor… xor A(n) xor A(1) xor A(2) xor … xor A(n)
= 0
这就是说从A(t)堆中取出 A(t) – x 根火柴后状态就会从S态变为T态。证毕
[定理2]:T态,取不论什么一堆的若干根,都将成为S态。
证明:用反证法试试。
若
c = A(1) xor A(2) xor … xor A(i) xor … xor A(n) = 0。
c’ = A(1) xor A(2) xor … xor A(i’) xor c xor … xor A(n) = 0;
则有
c xor c’ = A(1) xor A(2) xor … xor A(i) xor … xor A(n) xor A(1) xor A(2) xor … xor A(i’) xor c xor … xor A(n) = A(i) xor A(i’) =0
进而推出A(i) = A(i’)。这与已知矛盾。所以命题得证。
[定理 3]:S态,仅仅要方法正确,必赢。
终于胜利即由S态转变为T态,不论什么一个S态,仅仅要把它变为T态。(由定理1,能够把它变成T态。
)对方仅仅能把T态转变为S态(定理2)。这样,全部S态向T态的转变都能够有己方控制,对方仅仅能被动地实现由T态转变为S态。故S态必赢。
[定理4]:T态,仅仅要对方法正确,必败。
由定理3易得。
接着来解决第二个问题。
定义:若一堆中仅有1根火柴,则被称为孤单堆。
若大于1根,则称为充裕堆。
定义:T态中,若充裕堆的堆数大于等于2,则称为全然利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态。用T0表示。
孤单堆的根数异或仅仅会影响二进制的最后一位,但充裕堆会影响高位(非最后一位)。一个充裕堆,高位必有一位不为0,则全部根数异或不为0。
故不会是T态。
[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
证明:
S0态,事实上就是每次仅仅能取一根。每次第奇数根都由己取,第偶数根都由对
方取。所以最后一根必己取。败。同理, T0态必胜#
[定理6]:S1态,仅仅要方法正确,必胜。
证明:
若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5。对方必输。己必胜。 #
[定理7]:S2态不可转一次变为T0态。
证明:
充裕堆数不可能一次由2变为0。
得证。
#
[定理8]:S2态可一次转变为T2态。
证明:
由定理1,S态可转变为T态,态可一次转变为T态,又由定理6。S2态不可转一次变为T0态。所以转变的T态为T2态。
#
[定理9]:T2态。仅仅能转变为S2态或S1态。
证明:
由定理2,T态必定变为S态。因为充裕堆数不可能一次由2变为0,所以此时的S态不可能为S0态。命题得证。
[定理10]:S2态,仅仅要方法正确。必胜.
证明:
方法例如以下:
1) S2态,就把它变为T2态。(由定理8)
2) 对方仅仅能T2转变成S2态或S1态(定理9)
若转变为S2, 转向1)
若转变为S1, 这己必胜。
(定理5)
[定理11]:T2态必输。
证明:同10。
综上所述,必输态有: T2,S0
必胜态: S2,S1,T0.
两题比較:
第一题的全过程事实上例如以下:
S2->T2->S2->T2-> …… ->T2->S1->T0->S0->T0->……->S0->T0(全0)
第二题的全过程事实上例如以下:
S2->T2->S2->T2-> …… ->T2->S1->S0->T0->S0->……->S0->T0(全0)
下划线表示胜利一方的取法。 是否发现了他们的惊人相似之处。
我们不难发现(见加黑部分),S1态能够转变为S0态(第二题做法),也能够转变为
T0(第一题做法)。哪一方控制了S1态。他即能够有办法使自己得到最后一根(转变为
T0),也能够使对方得到最后一根(转变为S0)。
所以,抢夺S1是制胜的关键!
为此。始终把T2态让给对方,将使对方处于被动状态。他早晚将把状态变为S1.
http://acm.hdu.edu.cn/showproblem.php?pid=1907
pid=2509" target="_blank" style="color:rgb(41,112,166); text-decoration:none; margin:0px; padding:0px">http://acm.hdu.edu.cn/showproblem.php?pid=2509
看完上面的结论,就能顺利解决上面2道了
http://acm.hdu.edu.cn/showproblem.php?pid=1536
http://acm.hdu.edu.cn/showproblem.php?pid=1944
小子近期迷途于博弈之中。
。。感触颇深。
为了让大家可以在学习博弈的时候少走弯路,最重要的也是为了加深自己的影响,温故而知新,特发此贴与大家共勉。
学博弈先从概念開始:
特别推荐LCY老师的课件:博弈入门。
下载地址:http://acm.hdu.edu.cn/forum/read.php?
tid=6875
这个课件个人觉得从博弈的基本思想。一直到解博弈的中心算法做了非常好的诠释。可是特别要注意的是。课件后面一部分英语写的讲义是重中之重。
小子英语非常弱,在这困扰非常久。如今为大家大概介绍一下。
主要是后继点和SG值的问题:
SG值:一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数。
后继点:也就是依照题目要求的走法(比方取石子可以取的数量,方法)可以走一步达到的那个点。
详细的有关SG值是怎么运用的希望大家自己多想想。
课件后面有一个1536的代码。能够放在后面做做
看到这里推荐大家做几道题:1846(最简单的博弈水题)
1847(求SG值)
有了上面的知识接下来我们来看看组合博弈(n堆石子)
推荐大家看个资料:
博弈-取石子游戏(推荐等级五星级)
http://acm.hdu.edu.cn/forum/read.php?fid=20&tid=5748
http://hi.baidu.com/netnode/blog/item/30932c2edc7384514fc226ea.html
这里提出了一个神秘状态的问题。看了这篇文章你会发现异或运算在博弈中使用的妙处。当然这里指出的仅仅是组合博弈中一种特殊情况。
王道还是对SG值的求解。可是知道这么一种思路无疑对思维的广度和深度扩展是非常有帮助的。
ZZ博弈
http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617
这里介绍了组和博弈的两种大的类型,一种是最后取的是N状态一种是最后取的是P状态。两个状态的解题方法能看懂非常有帮助。当然。可以把推导过程理解,吃透无疑是大牛级的做法~小子也佩服的紧~
1536题推荐做做这题,这题前面提醒大家是一个求SG值的题目,题眼下面是对异或运算运用在组合博弈问题中的非常好的解释。
当然题目本身是有所不同的。由于在这里面对取法有所要求。那么这样就回归到了解决博弈问题的王道算法——求SG值上。
有关运用求SG值的博弈题目有: 1850(也可基于神秘状态异或)
1848(中和的大斐波那契数列的典型求SG值题)
1517(个人觉得有点猥琐的题目。。
。。
在此题上困扰非常久。当然搞出来非常开心。小子是用比較规矩的求SG值的方法求出来的,可是论坛有人对其推出来了规律。这里佩服一下,大家能够学习一下)
1079(更猥琐的题目。对新手要求较高。由于按传统方法须要比較仔细的模拟加对边角状态的考虑,相同有人推出来了公式)
当你所有看完以上的东西。做完以上的题目的话。
。
。小子恭喜你~你博弈入门了~~~~
这里小子告诉大家。博弈非常强大。
学习要耐心~谢谢
----------------------------------------------------------------------------------------------------------------------------------
博弈小结:
(忽略从word上复制过来之后的奇葩缩进)
看了张一飞+贾志豪+方展鹏+曹钦翔的论文都讲得超好。这些应该到处都能够找到的。
最终会主要的博弈了。
只不过看完之后的回顾录而已。基本上和论文相似,仅总结加深记忆用。
看到本文的人轻点喷。
或许看论文会更清晰。
曾经博弈各种弱,仅仅是零零星星的了解一些知识。严格的证明之类的没有接触。
如今最终都搞清啦。只是碰上奇葩博弈还是做不出。。。
1.极大极小搜索
还是比較好理解的。
2.普通NIM游戏
假设A=B,则T胜。如S={3,3,2,2}分解成{3,3}和{2,2}.
假设对于A是S胜。B是S败(由于A,B等价,反过来亦然),S仅仅须要先拿A,然后T假设拿A,S也拿A,T拿B,S也拿B。那么S由于对于A,S是先手,所以S总是能够拿到A的最后一个。而且能够逼着T当B的先手。由于B先手必败。S也能够拿掉B的最后一个。
假设对于A和B都是S败,那么A先随便拿一个,对于T来说就变成了上一种情况了。那么此时T胜。
当A和B都是S胜时,S肯定不会第一步把局面变成一胜一负。他会继续变成AB都对于T必胜,那么T又纠结了。如此往复。就无法确定了。
上面的分解。归纳一下,假设对于B。S必败,那么整个局面的胜负和A一样。
那么假设原几何是{2,2,2,7,7,3,3,9}就能够分解成A{2,9},B{2,7,3},C{2,7,3}。
由于B+C是必败的,所以A+B+C的胜负和A一样,这样就转化成了一个不重集合了,打裸就少了一堆状态了。
好吧。以上就能够类比出XOR运算了。
沿着这个思路,就能够想到一个函数来优化打裸了。
(一下xor用+取代)
假设p=0则该状态是S败。否则S胜。
由于终止状态是p=0。要证明这个结论的正确性,仅仅须要证明从p≠0可以转移到p=0,而从p=0仅仅能转移到p≠0就可以。
首先,明白xor的基本性质。
1.a+b=c,则有a+c=b.
2.p=a1+a2+…..an≠0,必定存在k。使p+ak<ak,由于p的最高位为1,肯定有一个ak该位也是1。p+ak该位就是0了。所以得证。
证明从p≠0可以转移到p=0
证明从p=0仅仅能转到p≠0
其它时候。随便你选什么数ak,那么其它数的xor和肯定等于ak。
p=(ak-xxx) + ak,xxx为正数且小于ak,那么p显然就不为0了。
至此。证明了f[a1]=a1的正确性了。
如今题目稍稍拓展一下。
N堆石子,每次任选一堆,能够从这堆拿走不超过m个的石子。求先手必胜还是必败。
这个的f[a1]=a1%m.
由于游戏的分解之类的东西与前一个游戏一样,所以仅仅需考虑一堆石子就可以。
考虑最開始的那个打裸,从后往前推一下N和P就可一直到a1%m=0时必败。
来个终极版NIM游戏。
有若干排石子。每次必须选相邻的两个拿走,把原来的那排变成了两排。
谁无路可走了谁就挂了。
分析这个题,发现各种分解的性质和前面的两个游戏一样的。如今就须要求f值了。
和前面的游戏一样,我们设计的f值必须满足
终止状态p=0。从p≠0可以转移到p=0,从p=0仅仅能转移到p≠0就可以。
第一个条件是显然成立的。
回顾论文,先如果#S表示S这个状态的f值之xor和,
要满足第二个条件
要满足第三个条件
事实上,这就是sg值了。曾经一直认为这东西特别奇妙,原来就这样就证明出来了。
看sg函数的使用条件:
1.
2.
3.
4.
5.
3.anti-nim游戏
实际上非常多定理都会披上这么牛叉的名字。
先手必胜有两种状态:
1.假设每个小游戏都仅仅剩下一个石子了。SG为0。
2.至少一堆石子>1,且SG不为0.
证明
a.
b.
还须要证明1,2的反面是必败的。
1显然了。
2的话,你会把SG变成非0。并且由于如今至少两堆石子>1了,所以你还会给人家至少留一个>1的,那么不管怎么搞。都会送给后手一个必胜态。
4.every-SG游戏
形象的说就是红队和蓝队每一个队n个人,然后进行n个博弈,最后结束的一场博弈的胜者胜利。
显然,每一个博弈的胜者都想让时间坚持得更久,每一个败者都想让这场博弈早点结束。
不难列出每一个点到终止的步数的DP方程。
假设v是先手必胜,则f[v]=max(f[u])+1,当中u为v的后继且u为先手必败。
否则f[v]=min(f[u])+1,u为v后继。
5.不平等博弈
B能够转移到w。
则说明x>=0成立。且x<=0不成立。
也就有SA中的元素都>=0,y中的元素都>0,那么A能转移到的状态总是有>=0的,y能转移到的总是>0的。那么A总是有状态可转。那么A必胜。
假设x<0
假设x=0
真的非常佩服方展鹏神犇能想到把博弈和超现实数结合起来。
弱菜就仅仅有膜拜的份了。
理论知识最终准备得几乎相同了,接下来就是刷很多其它题熟练了。
博弈总结