zoukankan      html  css  js  c++  java
  • [日常摸鱼]博弈论入门/经典模型/SG函数

    博弈论

    这些内容大概是去年年底在学博弈论的时候写的,之前存在本地了一直没发出来,今天下午上近代史的时候突然想起来一个东西,想翻一下自己的博客发现自己忘记发了,于是晚上回去重新整理了一下终于发出来啦…相比之前还加了一些东西(比如中间那个SG函数的)。

    同时在这篇博客之后应该还会有另一篇连着的配套的题目(也是之前写的)

    巴什博奕

    经典的模型,一堆(n)个物品,每次至少取一个,至多取(m)个,取完的胜利。

    想直接上(SG)函数…(SG(0)=0,SG(1)=1,SG(2)=mex{0,1}=2,SG(3)=mex{0,1,2}=3,dots)

    (SG(m)=mex{0,1,dots,m-1}=m,SG(m+1)=mex{1,dots m}=0),以此类推,容易发现(k(m+1))是必败态,其他是必胜态

    威佐夫博弈

    http://www.matrix67.com/blog/archives/6784

    规则:两堆石子((n,m)),每次可以从一堆拿走任意多个,或者在两堆中拿走同样多个。

    等价:一个棋盘,“挪动皇后”,向左或者向右走任意多步,或者向左下角走任意多步

    分析

    选定左下角,做三条射线,碰到的格子标蓝,再在新出现“死角”进行同样的操作,得到下面的图形:
    左下角(0,0)是个必败态,其他白点同样的必败态,蓝点是必胜态

    (varphi=frac{sqrt 5+1}{2}),我们把对应白点的序列记为序列(W),则先不加证明地给出结论,对应的点对为:(([varphi],[varphi^2]),([varphi],[2varphi^2]),dots,(lfloor kvarphi floor,lfloor kvarphi^2 floor),dots)

    序列的前几项为((1,2),(3,5),(4,7))

    会用到的关于(varphi)的一些性质
    比如(1/varphi+1/varphi^2=1)

    得到(varphi+1=varphi^2)

    **Beatty-Rayleigh 定理 **

    若正无理数(alpha,eta:frac{1}{alpha}+frac{1}{eta}=1),则数列(lfloor 1cdot alpha floor,lfloor 2cdot alpha floor,lfloor 3cdot alpha floordots)(lfloor 1cdot eta floor,lfloor 2cdot eta floor,lfloor 3cdot eta floor,dots)能够不重不漏地覆盖所有正整数。

    证明:

    首先(alpha,eta)一定不是整数,所以有(lfloor alpha floor<alpha,lfloor eta floor <eta),从而([alpha]+[eta]<alpha+eta),同时又有([x]>x-1),也就是([alpha]+[eta]>alpha+eta-2),所以(alpha+eta-2<[alpha]+[eta]<alpha+eta)

    进一步,对于([alpha],[2alpha],dots,[nalpha])小于(n)的一共有([n/alpha])个(并不会是小于等于的情况,因为…),同样([eta],[2eta],dots,[neta])中小于(n)的一共有([n/eta])个,于是两个数列中的数里小于(n)的一共是([n/alpha]+[n/eta])个,又由上面得到的不等式和条件(1/alpha+1/eta=1),得到(n-2<[n/alpha]+[n/eta]<n),所以([n/alpha]+[n/eta]=n-1)

    进一步小于(n)的正整数也是(n-1)个,鸽巢原理就告诉我们两个序列能够不重不漏地覆盖这(n-1)个数

    回到序列(W)

    • 性质1:序列(W)能够不重不漏地覆盖自然数
      • (1/varphi+1/varphi^2=1),可以直接由Beatty-Rayleigh定理得到
    • 性质2:第(n)个数对中两数之差为(n)
      • 利用上面的性质(varphi^2=varphi+1),所以([nvarphi^2]=[n+nvarphi]=n+[nvarphi])
    • 性质三:后一项总比前一项大
      • 更显然了,(varphi approx 1.618>1),加完之后取整仍然严格大于

    Nim博弈

    (n)堆石子,个数分别为(a_1,dots,a_n),每次选一堆取若干个,最后取完的赢

    (SG(x)=x),SG函数的异或还是SG函数,所以最终只要看(SG(a_1)oplus SG(a_2)oplusdotsoplus SG(a_n))是否为0即可,如果为0则是一个必败态,否则是必胜态

    反Nim游戏

    (n)堆石子,分别为(a_1,dots,a_n),最后取完的输。

    先给结论,记Nim和为(S)。先手有必胜策略当且仅当:

    • 所有堆数均为1,且有偶数堆石子(即(S=0)
    • 否则,(S eq 0)

    证明:

    • 如果所有堆数均为1,显然充要条件是(S=0)

    • 如果有一个堆数大于1

      • 如果只有一个堆数(a_i>1),一定有(S eq 0)

        • 先手希望能够一次转化成必败态,也就是转化成1的个数为奇数个的状态。很显然如果当前1的个数是奇数,那就把(a_i>1)的一堆拿到只剩一个。

        • 否则如果是偶数直接把整堆拿走。

      • 如果有多堆(a_i>1)

        • 同样还是希望能转化成一个前面已经得到的必败态。这种情况稍微复杂一些
        • 考虑如果当前(S)为0,考虑后继状态,首先一定有(S eq 0),同时要么有多堆(即至少两堆)(a_i>1),要么只有一堆(a_i>1)
        • 其中前一种状态我们在后面考虑,而后一种状态相当于把必胜态交给了对手
        • 现在考虑(S eq 0)的状态,假设有(a_i>1,a_j>1),那么仿照Nim的套路,我们找到拥有(S)的最高位1的(a_i),容易知道在这个数位上有1的个数一定是奇数个。把找到的(a_i)变成(a_i'=a_i oplus S)之后新的异或和(S'=0),同时能够保证(a_i'>1)(因为如果(a_i'=0),则(S=a_i),进一步除去(a_i)的元素的异或和为0,

    另一方面

    这么考虑

    • 对于都是1的情况,直接分奇偶性讨论
    • 有一个1,和上面一样
    • 对于一般的情况,Nim的胜负反转

    SG函数的一些理解

    (依然还是感谢小伙伴@Moebius Meow跟我讲了一上午的SG函数,让之前只会套结论的我突然理解SG函数是怎么来的了)

    一般考虑博弈dp/搜索,就是考虑这个状态的后继状态:如果只能到达必胜的状态,那当前状态必败,否则如果能到达必败态,则当前状态是必胜态。如果用1表示必胜态,0表示必败态,于是我们能写出(f(c)=1-min{f(succ(c))}),这还不是SG函数,不过已经能表示一个有向图博弈了(即一张有向图上有一个棋子,两个人轮流移动,不能移动的输)

    而SG函数应用的背景则是同时存在多个有向图游戏,每轮每个人只能操作其中一张图的棋子。

    如果继续沿着之前的思路也可以:(n)个游戏就开个(n)维数组之类的,(f(x_1,dots,x_n))记录状态,然后复杂度炸了,而SG函数给出的就是一种方法从单个游戏的状况计算出(n)个游戏的结果。

    (SG(c))定义为({SG(x):xin succ(c)})这个集合中,最小的没有出现的非负整数,也就是我们熟悉的(mex)函数(minimum excluded),也就是(SG(c)=mex{SG(x):xin succ(c)}),这样对单个游戏来看,似乎除了值变大之外和上面那种暴力算01的没什么区别(把1变成了12345…),不过这么定义(SG)函数当然是有用的——它有一些性质。

    这个性质学过博弈论的应该也都见过,就是多个游戏的SG异或和如果为0,则必败,否则必胜,为什么?

    回到一开始那个01互换的分析,如果我们能有:1、异或和为0的局面只能变成异或和非0的局面。2、异或和非0的局面,一定可以变成异或和为0的局面。只要证明这两条那上面那个判断依据就是正确的了:

    • 1、异或和为0的时候,如果某个游戏经过一步操作,SG从(a)变成了(b),异或和就会变成(0oplus aoplus b=aoplus b),而mex的定义告诉我们(a,b)一定不同,所以第一条成立。
    • 2、第二条说的是异或和非零(设为(S))的局面可以变成为0的局面,类似Nim游戏,设(S=SG(G_1)oplusdotsoplus SG(G_n)),考虑(S)在二进制下最高位(设为第(p)位)的那个1,一定有对应某个游戏(i)(SG(G_i))在这一位也是1,那么因为(SG(G_i))可以转移到(SG(t)=0,1,dots,SG(G_i)-1)的这些状态,所以一定存在一个(x=Soplus SG(G_i):SG(G_i) o x),最后异或和(S o Soplus SG(G_i)oplus x=0),同时我们说(Soplus SG(G_i))的第(p)位一定是两个1异或起来,也就是0,所以有(x<SG(G_i)),于是第二条也成立了。

    阶梯博弈

    从左到右(n)个台阶,第(i)个台阶有(a_i)个石子,两个人轮流操作,每次可以把第(i)个台阶任意个(至少1个)石子放到左边台阶上,第一个台阶放到地上,不能操作的输

    • 首先意识到如果只有标号是偶数的阶梯有石子的话,先手必败,因为不管先手怎么做后手只要对称着做就行
    • 进一步如果当前局面能一步转化成只有偶数阶梯的局面那就是个必胜态了
    • 我们其实可以把那些偶数阶梯看成是一个无底洞,只考虑奇数阶梯就变成了一个Nim
    • 这么想也是挺河里的(虽然有可能加石子,但是因为取石子没有上限所以这条其实没什么用)
    • 问题就变成奇数阶梯的Nim了

    Poset Game

    偏序集游戏(Partially Ordered Set Game)

    Given a partially ordered set (P, <), let

    (P_x=P-{a|ageq x})

    denote the poset formed by removing x from P.

    A poset game on P, played between two players conventionally named Alice and Bob, is as follows:

    • Alice chooses a point xP; thus replacing P with P**x, and then passes the turn to Bob who plays on P**x, and passes the turn to Alice.
    • A player loses if it is his/her turn and there are no points to choose.

    Chomp

    (n imes m)的巧克力块,左上角的有毒吃了会死,每轮每个人选一个块,并把它右下方向的所有块都吃了。

    In combinatorial game theory, the strategy-stealing argument is a general argument that shows, for many two-player games, that the second player cannot have a guaranteed winning strategy. The strategy-stealing argument applies to any symmetric game (one in which either player has the same set of available moves with the same results, so that the first player can "use" the second player's strategy) in which an extra move can never be a disadvantage.

    • (n=m=1)先手必败
    • 否则先手有必胜策略:
      • 假设后手有必胜策略,那么先手一开始只吃掉右下角的一个块
      • 按照我们的假设后手会有与之对应的必胜策略应对这种情形,后手会选择某个块((x,y))把右下角的都吃掉
      • 但是先手如果一开始就采取后手的“必胜策略”,先手就有必胜策略了,于是矛盾
      • 所以先手有必胜策略

    就是上面那个“Strategy-Stealling Argument”:对于这种对称的博弈(后手可以走的状态是先手可走的状态的一个子集),按照上面的套路可以证明先手有必胜策略

    Sylver Coinage

    https://en.jinzhao.wiki/wiki/Sylver_coinage

    两个人轮流报数(报大于1的整数),后一个人报的数必须不能是之前出现过的数的任意线性组合,不能报的人输。

    • 比如A报了2,B报了3,B就赢了(手算几组数确实是这样…其实(2perp3),那按照上面的结论1就是最大符合条件的数了)

    [Unlike many similar mathematical games, sylver coinage has not been completely solved, mainly because many positions have infinitely many possible moves.]:

    Fibonacci Game

    一堆石子,第一个人取([1,n-1]),剩下的每一轮取的石子不超过上一个人的两倍

    结论:必败态构成斐波那契数列

    Anti-SG与SJ定理

    2009年国家集训队论文

    Anti-SG游戏

    • Anti-SG游戏规定,决策状态为空的游戏者胜利
    • 其他规则和SG游戏相同
    • 当前局面所有单一游戏的SG为0的时候游戏结束

    则类似上面那个Anti-Nim有:

    定理

    先手有必胜策略的充要条件是:

    • 如果整个游戏(SG eq 0)且有一个游戏(SG>1)
    • 如果整个游戏的(SG=0)且所有游戏(SGleq 1)

    类似Anti-Nim

    实际上,聪明的读者可能会发现,我们在 SJ 定理中给出的附加条件
    “规定当局面中所有的单一游戏的 SG 值为 0 时,游戏结束”过于严格,
    完全可以替换成“当局面中所有的单一游戏的 SG 值为 0 时,存在一个单
    一游戏它的 SG 函数能通过一次操作变为 1”。
    笔者为什么要将限制条件设制成这样?
    因为笔者发现这样可以出题,我们可以将题目模型设成这样:游戏
    中存在一个按钮,游戏双方都可以触动按钮,当其中一个人触动按钮时,
    触动按钮的人每次必须移动对方上次移动的棋子。如果触动按钮的人能
    保证他能够使得对方无路可走,那么他同样获胜!

    Turning Turtles翻硬币游戏

    (N)枚硬币排成一排,翻转有一些限制,所翻动 的硬币中最右边的必须是从正面到反面

    不能翻的输

    • 记正面为H,反面为T

    定理:整个局面(S)(SG(S))为每个正面H单一存在的SG值,例如(S=THHTTH)对应的(SG(S)=SG(TH)oplus SG(TTH)oplus SG(TTTTTH))

    考虑证明

    • 数学归纳,如何记录状态?

    • 只有两种状态的串容易往二进制想吧,正面H代表1,反面T代表0,转化成二进制之后一种状态就对应了唯一一个数字

    • (S=0)(S=1)的情况都容易

    • 假设当前状态(S=k)的时候结论成立,考虑(S=k+1)的状态

    • 先欠着…

    • 于是问题就变成如何求(SG(TTdots TH))这样的东西

    三枚硬币

    一次可以选择翻1/2/3枚(不要求连续)

    打表会发现好像有规律:如果从0开始给正面H的硬币编号为0,1,2…

    会发现:

    SG[0]=1
    SG[1]=2
    SG[2]=4
    SG[3]=7
    SG[4]=8
    SG[5]=11
    SG[6]=13
    SG[7]=14
    SG[8]=16
    

    Odious数(odd?)为二进制表示中1个数为奇数的数,Evil数(even?)为二进制表示中1的个数为偶数的数。

    我们先给出结论:如果(x)是一个Odious,则(SG(x)=2x),否则即(x)是一个Evil,(SG(x)=2x+1)

    证明继续咕了(

  • 相关阅读:
    Android系统进程Zygote启动过程的源代码分析
    Android系统默认Home应用程序(Launcher)的启动过程源代码分析
    Android应用程序安装过程源代码分析
    Android应用程序进程启动过程的源代码分析
    Android应用程序绑定服务(bindService)的过程源代码分析
    Android应用程序发送广播(sendBroadcast)的过程分析
    Android应用程序注册广播接收器(registerReceiver)的过程分析
    Android系统中的广播(Broadcast)机制简要介绍和学习计划
    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:
    解开Android应用程序组件Activity的"singleTask"之谜
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/14608742.html
Copyright © 2011-2022 走看看