博弈论

bash:
一堆石子共n个,两人轮流从中取石子,规定每次至少取一个,最多取m个,最后取光者得胜。问两人博弈,他们都采用最聪明的策略,问最后谁可以必胜。
首先我们从小开始分析:
当m>=n时,先手可以一把抓完石子,这样先手必胜
当n=m+1时,先手无论怎么抓,都会留下1~m个石子,这样后手一把就可以抓完,这样先手必败
当m+1<n<2(m+1)时,先手只要抓适当的石子就可以剩下m+1个石子,然后后手必输,那么先手必胜
当n=2
(m+1) 时,后手可以采取这种策略,当先手抓x个时,后手就抓m+1-x个,这样就会把m+1的情况送给先手,那么先手必败
所以,当n%(m+1)==0时是必败态,其余为必胜态。
nim:
地上有n堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这n堆石子的数量,他想知道是否存在先手必胜的策略。
若一开始a1 ^ a2 ^ a3...^ an=0那么后面状态a1 ^ a2 ^ a3...^ an!=0。如果a1 ^ a2 ^ a3...^ an!=0,那么肯定可以通过一步转化让自己变成异或和为0。证明看nimk或者P1247
nimk:
你一次可以取k堆的石子。那么
sg函数就是必败态为0,一个结点的sg为后继状态的mex。我们可以将所有ICG通过sg函数转化为nimk。
将所有数都转化成二进制数,若所有二进制位上1的数量都能被(k+1)整除,那么先手必败
终止局面每堆石子数都为0,为必败态。
否则任取一个二进制位搞bash。具体看
反正就是这样。

通过这个sg函数,我们就可以把所有ICG游戏转换成nim游戏!

博弈论有个很好用的结论是若状态 S 能到达状态 x,且 ∀ 状态 x 能到达状态 y 都有状态 S 能到达状态 y,则状态 S 必胜。利用sg函数去易证。

这个成立的要求是包含,S到达的状态包含x到达的状态并上x

一个很搞笑的事情是我们不知道每个局面对应的sg函数是什么。所以我
需要推sg函数。比如在nim中,我们对于每堆石子分开考虑,那么我们只要知道每堆石子的sg就可以了。
首先sg(0)=0,sg(1)=1,sg(2)=mex(sg(0),sg(1))=2。所以数学归纳易证sg(x)=x所以直接异或即可。

anti-nim:
一、当所有堆的石子数均为1时
(1):石子异或和(t)=0,即有偶数堆。此时显然先手必胜。
(2):t≠0,即有奇数堆。此时显然先手必败。
二、当有一堆的石子数>1时,显然t≠0
(1):总共有奇数堆石子,此时把>1的那堆取至1个石子,此时便转化为一.(2),先手必胜。
(2):总共有偶数堆石子,此时把>1的那堆取完,同样转化为一.(2),先手必胜。
三、当有两堆及以上的石子数>1时
(1):t=0,那么可能转化为以下两个子状态:
①:至少两堆及以上的石子数>1且t≠0,即转为三.
(2)。
②:至少一堆石子数>1,由二可知此时必胜。
(2):t≠0,根据Nim游戏的证明,可以得到总有一种方法转化为三.(1)状态。
观察三我们发现,三.(2)能把三.(1)扔给对面,而对面只能扔给你三.(2)或必胜态。所以当三.(2)时先手必胜。

树上删边游戏:
给定一棵 n 个点的有根树,每次可以删掉一个子树,则叶子节点的 SG 值为 0,非叶子节 点的 SG 值为其所有孩子节点 (SG 值 +1) 的异或和。
克朗原理:对于树上某一个点,它的分支可以转换为以这个点为根的一根竹子,这个竹子的长度等于它各个分支的边的数量的异或和。那么这其实就变成了一个nim游戏,每堆石子有子树sg值+1条边,那么就是全异或起来就行了

衍生:对于博弈论大部分问题,只要SG值相同,都可以相互转换。上面的证明是证明可以转换的原因。

拓展:给定一棵树,一些节点上接了一些环。
考虑偶环。他的sg值就是从所有子状态转移过来。因为删去一条边后,剩下的两条边就肯定不同,所以mex是0。
考虑奇环。他的sg值就是从所有子状态转移过来。因为删去一条边后,剩下的两条边同奇偶,所以0取得到,1取不到,所以mex是1。
所以我们可以将偶环去掉,奇环变成一条边

综上,所有堆的石子数均=1且t=0/至少有一个堆的石子数>1且t≠0时,先手必胜。

有很多模型啊:
1.nim&anti-nim
2.staircase-nim
3.bash
4.二分图匹配博弈/奇偶博弈 P4136
.....

posted @ 2024-08-12 08:47  wuhupai  阅读(4)  评论(0编辑  收藏  举报