博弈论-SG函数的应用探究

本篇笔记是对大神 @龙杉老师 的两篇博客的一个整合,并且注入了我的部分理解。

基础原理

游戏图

  • 任何一个公平组合游戏都可以通过把每个局面看成一个顶点,对每个局面和它的子局面连一条有向边来抽象成这个“有向图游戏”。
  • 游戏的一个终点就是有向游戏图的一个汇点,此时该点没有后继节点(无法进行下一步操作),处于该位置的玩家失败

image

N点和P点

  1. 如果双方都按照最佳策略进行游戏,我们可以将游戏中的每个状态依据其是先手必胜还是后手必胜分类。

    • 一个先手胜状态被认为是一个N-状态(因为下一个玩家(Next)即将获胜)
    • 一个后手胜状态被认为是一个P-状态(因为前一个玩家(Prious)即将获胜)
  2. P-和N-状态归纳性地描述如下:

    • 一个点v是P-状态当且仅当它的所有后继都为N-状态
    • 一个点v是N-状态当且仅当它存在至少一个后继是P-状态
    • 归纳从汇点开始,汇点是P-状态,因为它显然满足P-状态的要求。

image

游戏的和

  • 如果G1和G2 是公平游戏,那么他们的和G=G1 + G2是另一个公平游戏。
  • 新游戏G的玩法如下:每个回合,一个玩家选择G1, G2 中的一个(随便哪个他希望的)然后玩它,不碰另一个游戏。当 G1 和 G2都不能操作时游戏结束。
  • 现在,假定我们给出两个游戏G1 和 G2。如果我们只知道单个游戏的P-状态和N-状态我们能够正确地玩好游戏和G1 + G2吗?答案是否定的。不难看出两个P-状态的和总是P-状态,P-状态和N-状态的和总是N-状态。但是两个N-状态的和既可能是P-状态也可能是N-状态。因此,只知道单个游戏的P-状态和N-状态是不够的。
  • 为了正确地玩好游戏和我们需要推广P-状态和N-状态,它就是Sprague-Grudy函数(或者简称为Grundy函数)。

Sprague-Grundy 函数

1. 函数定义
  • 自然描述】令N = {0, 1, 2, 3, …} 为自然数的集合。Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数。结点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数
  • 形式化描述】给定一个游戏图G=(V,E),其Sprague-Grundy函数g:V → N 递归定义如下:
    - g ( u ) = 0 , g(u)=0, g(u)=0,其中u的出度为0(汇点)
    - g ( u ) = m e x { g ( v ) ∣ ( u , v ) ∈ E } g(u)=mex\{g(v)|(u,v) \in E\} g(u)=mex{g(v)(u,v)E}
2. 函数性质
  • 对于所有终止状态的顶点,它们都没有后继,所以g(x)=0。

  • 对于所有的g(x)=0的顶点x,它的所有后继y都满足g(y)!=0。

  • 对于所有g(x)!=0的顶点x,它一定有一个后继y满足g(y)=0。

  • g(x)=0 ⟺ \Longleftrightarrow x局面为P状态(必败态

  • g(x)!=0 ⟺ \Longleftrightarrow x局面为N状态(必胜态

3. SG定理

游戏和的SG函数等于各个子游戏SG函数的异或和Nim和

image

问题描述

甲乙两人面对若干排石子,其中每一排石子的数目可以任意确定。例如图所示的初始局面:共n=3排,其中第一排的石子数a1=7,第二排石子数a2=3,第三排石子数a3=3。两人轮流按下列规则取走一些石子,游戏的规则如下:每一步必须从某一排中取走两枚石子;这两枚石子必须是紧紧挨着的;如果谁无法按规则取子,谁就是输家。

image

问题分析

  1. 问题给定的是n排石子各自的数量a[i]
  2. 该问题是个典型的组合游戏
    1. 2人交替操作
    2. 每个人的操作只依赖当前局面,与操作方身份、历史操作无关
    3. 如果无法操作,则游戏失败
  3. 这个游戏是可分解的,游戏总体是n个单排游戏的和。因为单排游戏之间互不影响,且一次只能选择一个单排游戏来玩,这符合游戏的和的定义。
  4. 子游戏的局面可描述为这一排石子的个数;当取石子操作后,一排石子会分割成各自连续的两部分,我们可以将其视为新产生的两排石子
    image
  5. 我们可以尝试使用SG函数来解决这一问题,为便于描述,我们做出如下定义:
    1. 游戏的总局面可以表示为 S = ( a 1 , a 2 , a 3 , . . . ) S=(a_1,a_2,a_3,...) S=(a1,a2,a3,...),则单排子游戏(以下简称子游戏)局面相应表示为 S i = ( a i ) S_i=(a_i) Si=(ai)。由游戏的和定义SG定理知, S = S 1 + S 2 + S 3 + . . . S=S_1+S_2+S_3+... S=S1+S2+S3+...
    2. 子游戏 X X X下一步所有可能的局面集合表示为 T ( X ) = { X 1 , X 2 , X 3 , . . } T(X)=\{X_1,X_2,X_3,..\} T(X)={X1,X2,X3,..}
    3. 对于子游戏局面 s s s,SG函数定义为 f ( s ) f(s) f(s),则 f ( s ) = m i n G ( s ‾ ) f(s)=min\overline{G(s}) f(s)=minG(s),其中 G ( s ) ‾ \overline{G(s)} G(s) G ( s ) G(s) G(s)关于自然数集 N N N的补集, G ( s ) = f ( x ) ∣ x ∈ T ( s ) G(s)={f(x)|x\in T(s)} G(s)=f(x)xT(s),即 G ( s ) G(s) G(s)表示 s s s下一步所有可能局面的SG函数的集合。换言之, f ( S ) f(S) f(S)表示 s s s所有后继局面的SG函数值之外的最小自然数。相应地,对于总游戏局面 S S S f ( S ) = f ( S 1 ) ⊕ f ( S 2 ) ⊕ f ( S 3 ) ⊕ . . . f(S)=f(S_1)\oplus f(S_2) \oplus f(S_3) \oplus ... f(S)=f(S1)f(S2)f(S3)...
  6. 对游戏进行SG求解:
    • G ( 0 ) = f ( { } ) = { 0 } → G ( 0 ) ‾ = { 0 , 1 , 2 , , . . . } → f ( 0 ) = 0 G(0)=f(\{\})=\{0\} \to \overline{G(0)}=\{0,1,2,,...\} \to f(0)=0 G(0)=f({})={0}G(0)={0,1,2,,...}f(0)=0
    • G ( 1 ) = f ( { } ) = { 0 } → G ( 1 ) ‾ = { 0 , 1 , 2 , . . . } → f ( 1 ) = 0 G(1)=f(\{\})=\{0\} \to \overline{G(1)}=\{0,1,2,...\} \to f(1)=0 G(1)=f({})={0}G(1)={0,1,2,...}f(1)=0
    • G ( 2 ) = f ( { 0 } ) = { f ( 0 ) } = { 0 } → G ( 2 ) ‾ = { 1 , 2 , 3 , . . . } → f ( 2 ) = 1 G(2)=f(\{0\})=\{f(0)\}=\{0\} \to \overline{G(2)}=\{1,2,3,...\} \to f(2)=1 G(2)=f({0})={f(0)}={0}G(2)={1,2,3,...}f(2)=1
    • G ( 3 ) = f ( { 1 } ) = { f ( 0 ) } = { 0 } → G ( 3 ) ‾ = { 1 , 2 , 3 , . . . } → f ( 3 ) = 1 G(3)=f(\{1\})=\{f(0)\}=\{0\} \to \overline{G(3)}=\{1,2,3,...\} \to f(3)=1 G(3)=f({1})={f(0)}={0}G(3)={1,2,3,...}f(3)=1
    • G ( 4 ) = f ( { 2 , ( 1 , 1 ) } ) = { f ( 2 ) , f ( 1 ) ⊕ f ( 1 ) } = { 1 , 0 } → G ( 4 ) ‾ = { 2 , 3 , 4... } → f ( 4 ) = 2 G(4)=f(\{2,(1,1)\})=\{f(2),f(1) \oplus f(1)\}=\{1,0\} \to \overline{G(4)}=\{2,3,4...\} \to f(4)=2 G(4)=f({2,(1,1)})={f(2),f(1)f(1)}={1,0}G(4)={2,3,4...}f(4)=2
    • G ( 5 ) = f ( { 3 , ( 1 , 2 ) } ) = { f ( 3 ) , f ( 1 ) ⊕ f ( 2 ) } = { 1 , 1 } → G ( 5 ) ‾ = { 0 , 2 , 3 , . . . } → f ( 5 ) = 0 G(5)=f(\{3,(1,2)\})=\{f(3),f(1) \oplus f(2)\}=\{1,1\} \to \overline{G(5)}=\{0,2,3,...\} \to f(5)=0 G(5)=f({3,(1,2)})={f(3),f(1)f(2)}={1,1}G(5)={0,2,3,...}f(5)=0
    • G ( 6 ) = f ( { 4 , ( 1 , 3 ) , ( 2 , 2 ) } ) = { f ( 4 ) , f ( 1 ) ⊕ f ( 3 ) , f ( 2 ) ⊕ f ( 2 ) } = { 2 , 1 , 0 } → G ( 5 ) ‾ = { 3 , 4 , 5 , . . . } → f ( 6 ) = 3 G(6)=f(\{4,(1,3),(2,2)\})=\{f(4),f(1) \oplus f(3),f(2) \oplus f(2)\}=\{2,1,0\} \to \overline{G(5)}=\{3,4,5,...\} \to f(6)=3 G(6)=f({4,(1,3),(2,2)})={f(4),f(1)f(3),f(2)f(2)}={2,1,0}G(5)={3,4,5,...}f(6)=3
    • G ( 7 ) = f ( { 5 , ( 1 , 4 ) , ( 2 , 3 ) } ) = { f ( 5 ) , f ( 1 ) ⊕ f ( 4 ) , f ( 2 ) ⊕ f ( 3 ) } = { 0 , 2 } → G ( 7 ) ‾ = { 1 , 3 , 4 , . . . } → f ( 7 ) = 2 G(7)=f(\{5,(1,4),(2,3)\})=\{f(5),f(1) \oplus f(4),f(2) \oplus f(3)\}=\{0,2\} \to \overline{G(7)}=\{1,3,4,...\} \to f(7)=2 G(7)=f({5,(1,4),(2,3)})={f(5),f(1)f(4),f(2)f(3)}={0,2}G(7)={1,3,4,...}f(7)=2
  7. 题目样例的局面 S = ( 7 , 3 , 3 ) S=(7, 3, 3) S=(7,3,3),有 f ( S ) = f ( 7 ) + f ( 3 ) + f ( 3 ) = 1 ⊕ 1 ⊕ 1 = 1 f(S)=f(7)+f(3)+f(3)=1 \oplus 1 \oplus1=1 f(S)=f(7)+f(3)+f(3)=111=1,故S胜。

实现代码

参考博客

  1. https://www.cnblogs.com/hsqdboke/archive/2012/04/21/2461034.html
  2. https://www.cnblogs.com/hsqdboke/archive/2012/04/20/2459796.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值