博弈论之SG函数

参考自《算法竞赛进阶指南》

NIM博弈:

n堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品的人获胜。假设两人每一步都必然采取最优的策略。问先手是否必胜。

定理:

若先手必赢,那么当且仅当满足:A1xorA2xorA3...xorAn!=0

两个概念:

必败局面:若某一局面无论采取什么行动,都会输掉游戏,则称该局面必败。
必胜局面:若在某一局面下采取某种行动后可以使对手面对必败局面,那么优先采取此行动,那么这种局面叫必胜局面。

证明:

  1. 如果所有物品被取光,那么即Ai=0,那么这是一个必败局面,则满足:A1xorA2xorA3...xorAn==0
  2. 对于任意一个A1xorA2xorA3...xorAn=x!=0局面,那么我们应该证明它一定可以采取一定行动来出现x=0的局面(即对手必败局面)。
  • x的二进制表示下最高位的1在第k位,那么至少存在一堆石子Ai,它的第k位是1,显然Aixorx<Ai,然后我们便可以从Ai中取走AiAixorx个石子,使这堆石子变为Aixorx个石子,那么代入式子得:xxorx=0
  1. 对于任意一个A1xorA2xorA3...xorAn=x==0局面,那么我们应该证明无论采取什么行动都不可能出现出现x=0的局面。
  • 用反证法证明:假设Ai被取成了Ai,那么此时就应该满足A1xorA2xorA3...xorAi,...xorAn!=0,由于A1xorA2xorA3...xorAn==Ai, 那么则出现了AixorAi==0得情况,说明Ai==Ai,那么这显然不对与题目要求“不能不取石子”矛盾。

Mex运算

S表示一个非负整数集合。定义mex(S)为求出不属于集合S得最小非负整数的运算,即:

mex(S)=minxN,xS{x}

SG函数

有向图中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,...,yk,定义SG(x)x的后继节点y1,y2,...,ykSG函数值构成的集合,再执行mex运算,即:

SG(x)=mex(SG(y1),SG(y2),...,SG(yk))

整个有向图的SG函数就是图的起点的SG,SG(G)=SG(s)

那么多个有向图的游戏中,行动规则是任选一个有向图Gi,并在Gi中行动一步,那么类比于NIM游戏,如果满足:

SG(G)=SG(G1)xorSG(G2)xor...SG(Gm)==0

那么此时是必胜局面,证明方法与NIM博弈类似
否则必败局面。

理解:

在一个没有出边的节点上,不能进行任何操作,那么它的SG=0,此时就是必败局面。
对于一个节点的某一个后继节点SG=0的情况,在mex运算后,该节点SG>0,那么等价于当前局面是必胜局面,因为后继界面是必败界面。
对于一个节点的后继节点SG均不为0,在mex运算后,该节点SG值为0,那么当前就是一个必败界面。

理论部分结束!
后边新学知识我再补上。

posted @   Xxaj5  阅读(115)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示