• 博弈论


    博弈论

    oi中的博弈论

    • oi中的博弈论主要研究博弈游戏,本质上是平等组合游戏

    • 什么是“平等组合游戏”

    • 两人游戏

    • 有一个状态集,通常是有限的

    • 规定哪些状态的转移是允许的

    • 所有的规定对两个人来说是一样的

    • 两个人轮流走步

    • 有一个终止状态,到达终止状态后游戏即告终止

    • 游戏可以在有限的步内终止

    开头及一些基本的性质

    一.必胜点与必败点

    • P点:必败点,在双方都聪明无比的情况下(比如zsyzsy和pplppl在玩游戏),当前先手的人必败的情况。
    • N点:必胜点,在双方操作都正确的情况下先手必胜的位置。

    几个性质

    • 所有的终止位置都是必败点P(我们认为这个是公理,即所有推导都在这个性质成立的基础上进行)。
    • 从任何一个必胜点N操作,至少有一种方法可以达到一个必败点P。
    • 从一个必败点P出发,只能够到达一个必胜点N。

    我们要明白这样一件事,所有的选择都是为了最大化自己的利益,所以,当有让对方失败的机会时,自己肯定会选择这样做

    二.无偏博弈

    无偏博弈是一类任意局势对于游戏双方都是平等的回合制双人游戏。平等的含义是当前的所有可行的走法仅仅只依赖与当前的局势,而与当前谁移动无关。换而言之,两个人除了先后手的区别之外就不存在任何区别。除此之外,还需要满足一下性质:

    • 完全信息,任何一个游戏者都能够知晓整个游戏状态。
    • 无随机行动,所有的行动都会转移到一个唯一确定的状态。
    • 在有限步内游戏会终止,此时有唯一的胜者。

    常见的模型

    • 巴什博奕(Bash GameBash Game)
    • 威佐夫博弈(Wythoff GameWythoff Game)
    • 尼姆游戏(Nim GameNim Game)
    • Anti−SGAnti−SG游戏
    • Multi−SGMulti−SG游戏
    • Every−SGEvery−SG游戏
    • 翻硬币游戏
    • 树上删边游戏

    巴什博弈

    基本问题

    有一堆石子,总个数是nn,两名玩家轮流在石子堆中拿石子,每次至少取11个,至多取mm个。取走最后一个石子的玩家为胜者。判定先手和后手谁胜。

    解决办法

    如果((m+1)|n)则先手必败,否则先手必胜

    证明

    假设(m+1)|n,那么假设先手拿走了x个,那么后手必定可以拿走(m+1)−x个,这样子无论怎么拿,剩下的石头个数都将是m+1的倍数。那么最后一次取的时候石头个数必定还剩m+1个,无论先手拿多少个,都会剩下石头,此时后手必定可以将剩下的所有石头取光从而获胜。

    威佐夫博弈(Wythoff GameWythoff Game)

    基本问题

    有两堆石子,石子数可以不同。两人轮流取石子,每次可以在一堆中取,或者从两堆中取走相同个数的石子,数量不限,取走最后一个石头的人获胜。判定先手是否必胜。

    解决办法

    这个东西意义不是很大,打表找规律之后可以发现先手必败的状态一定形如(([i×ϕ],[i×ϕ2])中ϕ=√{5+1}/2),表示不大于x的最大整数。一些证明可以参考

    尼姆博弈(Nim GameNim Game)

    基本问题

    有三堆石子,两人轮流取,每次可以从一堆中取走任意数量个石子,至少取走一个,问先后手谁胜。一般推广:有nn堆石子x1,x2,x3,...,xnx1,x2,x3,...,xn,两人轮流取,每次可以从任意一堆石子中取走至少一个石子,问先后手谁胜。

    解决方法

    方法很简单,直接求所有xixi的异或和,如果异或和为00则先手必败,否则先手必胜。形式化的表达即当且仅当x1⊕x2⊕x3⊕...⊕xn=0时,先手必败。同理,也就是所以异或和为0的状态是P状态,所有异或和非0的是N状态。

    证明

    首先当没有石子的时候,先手必败,此时所有石子的异或和为0,这个是P状态。(必败点)

    接下来我们证明任意一个N状态至少能够达到一个P状态。

    假设当前所有石子个数的异或和为k,即(⊕_{i=1}^n)xi=k,那么,必定存在一个xi满足xi二进制位上存在kk的最高位,并且不难证明xi⊕k<xi,那么,将xi异或上k之后,剩下所有的数的异或和恰好为0,又回到了一个P状态。

    而一个P状态的异或和为0,任何一个数减小之后异或和一定不为0,所以可以证明任何一个P状态的后继状态都是N状态。

    综上,异或和为0的状态先手必败,其他情况先手必胜。

    拓展模式

    • 每次取的石子数存在上界m

      这个是Bash Game+Nim Game,只需要把所有石子按照m+1取模再考虑Nim游戏就好了。

    • 每次允许从k堆石子中取((Nim_k))

      我们一般考虑的情况是(Nim_1),我们的解法是考虑2进制下的异或和是否为0,而异或和是不进位的加法,同理,对于(Nim_k)的情况,我们考虑k+1进制下每一位不进位加法的结果,如果每一位都是0的话就是P局面,否则是N局面。

    • 阶梯博弈:博弈在阶梯上进行,每次可以将一堆的若干式子移动到上一阶去,不可操作者输。

      忽略所有的偶数阶梯,只留下奇数阶梯,转化为普通的Nim游戏。大致的思路是这样的:首先终止状态一定是所有石子都在0号阶梯,即一个偶数阶梯。那么如果对方移动了一个偶数阶梯上的石子,那么你可以在移动结束的那个奇数阶梯,直接把等数量的石子继续向前移动,这样子可以保证偶数阶梯上的石子对于结果没有任何影响。那么如果移动的是一个奇数阶梯,因为偶数阶梯是没有影响的,所以你可以认为移动奇数阶梯就是直接被移走了,那么这就是一个普通的Nim游戏了。

      阶梯博弈的例题洛谷p2575

      AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手!

      游戏规则是这样的:

      对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛。

    题目及模版

    洛谷2197 Nim游戏裸题

    BZOJ1299 Nim游戏变形

    POJ1704 阶梯博弈变形

    SG定理及SG函数

    • Sprague−GrundySprague−Grundy定理:所有一般胜利下的无偏博弈(定义在上面)都能够转化成尼姆数表达的尼姆堆博弈,一个无偏博弈的尼姆值定义为这个博弈的等价尼姆数。(抄自YMDYMD课件)
    • SGSG函数:对于每一个状态的一个尼姆数的函数又被称作Sprague−GrundySprague−Grundy函数。

    翻译成人话就是:对于当前游戏X,它可以拆分成若干个子游戏x1,x2,x3,...,xn那么(SG(X)=SG(x1)⊕SG(x2)⊕...⊕SG(xn))

    接下来定义mex运算,mex运算是对于一个集合S而言的,mex(S)表示的是最小的、不属于集合S的非负整数。例如mex{1,2,3}=0,mex{ϕ}=0。那么我们有运算SG(x)=mex{SG(y),<x,y>∈E},其中E是边集。即对于当前状态x的SG函数,它的值定义为所有的后继状态的mex值。对于SG函数为0的位置一定是P位置,SG函数非0的位置是N位置。

    这里直接空说很不好,我们举个例子。

    HDU1848 Fibonacci again and again,为了节约篇幅,直接戳链接看题目&题解&代码。

    事实上,注意"后继"这个词语,我们不难发现上述的东西可以理解为一个DAG上的问题。

    (Anti−SG)游戏&(SJ)定理

    基本问题

    决策集合为空者的操作者胜利。翻译成Nim一点的问题就是,给定n堆式子,每次每个人可以从任意一堆石子中拿走不少于一个的石子,拿走最后一个石子的人输。

    解决办法

    SJ定理:对于一个Anti−SG游戏,如果我们规定当前局面中所有单一游戏的SG为0时,游戏结束,则先手必胜的条件为:

    • 游戏的SG值不为0,且存在一个单一游戏的SG值大于1
    • 游戏的SG值为0,且不存在一个单一游戏的SG值大于1

    题目及模版

    BZOJ1022 Anti−SGAnti−SG模板题

    (Multi−SG)游戏

    基本模型

    决策集合为空的操作者输。一个单一游戏的后继可以是多个单一游戏。还是写成Nim一点的式子,给定你n堆石子,每次可以取走任意数量个,或者将一堆式子拆分成两堆(事实上更多也是可行的)非空石子,不能操作者输,判定胜负。

    解决办法

    还是可以使用SGSG函数解决,举个例子,比如当前存在一堆33个石子,那么可以直接走0,1,2,3个石子,也可以拆分成(1,2)两堆,因此(SG(3)=mex{SG(0),SG(1),SG(2),SG(3),SG((1,2))=SG(1)⊕SG(2)})

    那么这个问题本质上还是一个Nim游戏,可以直接用SG函数解决。

    同时,对于这样每次可以拆分两堆的Multi−SG游戏,打表后发现有这样一个性质:

    [SG(x)=left{ egin{aligned} x-1 & = & (x mod 4=0) \ x & = & (xmod 4=1&2) \ x+1 & = & (x mod 4=3) end{aligned} ight. ]

    题目&模板

    HDU3032 Multi−SGMulti−SG模板题

    BZOJ2940 简单的Multi−SGMulti−SG题目

    BZOJ1188 有些困难的Multi−SGMulti−SG模型

    BZOJ3576 有点难度的Multi−SGMulti−SG变形

    Every--SG游戏

    基本模型

    对于没有结束的任何一个单一游戏,操作者必须对其进行一步操作,无法操作者输。

    解决办法

    所有游戏都是独立的,并且我们发现无法操作者输,而同时又在进行多个游戏。因此,我们知道胜负情况只与最后结束的游戏的胜负情况相关。既然只与最后结束的游戏相关,那么我们这样分析:首先对于一个能够取得胜利的游戏,我们必定会取得胜利,这样一定不会让结果更差,因为只要赢了,这局游戏就一定不会让自己输。那么对于所有单个游戏的胜负情况,我们一定可以判定,但是对于整个Every−SG的情况,我们只能够通过最后结束的游戏判定。所以,对于一个我们必胜的游戏,我们一定会想办法将其尽可能的向后拖,即我们期望它尽可能完的结束;反过来,对于一个必败的游戏,我们一定会让他尽可能早的结束。这几句推论正确的理由都是所有游戏都是互相独立的。

    那么,我们首先可以判定出所有位置是N点还是P点,然后根据必胜和必败的关系,我们必定要决策步数最小还是步数最大,那么这个就非常类似于一个min−max搜索。至于NN点和PP点的判定我们可以很容易的用SGSG函数表示出来。我们定义step(x)为状态xx时(在满足N/P的条件下)的步数,我们可以得到这样一个转移:

    翻硬币游戏

    题目

    有n枚硬币排成一排,依次编号1到N,有的正面朝上,有的反面朝上。现在按照一定的规则翻硬币(比如每次只能翻一枚或者两枚,或者每次只能翻动连续的几枚),但是强制要求最靠右的硬币必须从正面被翻到了反面。操作集合为空者负。

    解决办法

    结论是这样的:当前局面的SG值是所有正面朝上的硬币单独存在时的SG值的异或和。

    证明?我也不会啊。可以感性理解一下,无论如何最右边的硬币都要翻,它翻了之后必定改变前面的状态,但是前面的状态是什么似乎和之前的状态无关(假装能够说服我自己),之和之前的状态和现在状态的差别(也就是看成01串后的异或和)相关,所以你可以把游戏拆分成所有正面朝上的硬币的子游戏。

    链接中给出这么多游戏的主要目的是因为直接使用SG函数求解效率太低,很多时候利用SG函数打表找规律才是最好的方法。

  • 相关阅读:
    C#:如何设置MDI窗体
    asp.net在类库中使用EF 6.0时的相关配置
    asp.net中使用jquery ajax保存富文本的问题
    Asp.net Api中使用OAuth2.0实现“客户端验证”
    NLog在asp.net中的使用
    元素的隐藏特性
    jQuery 使用笔记
    获取标签的所有选择器存放在一个数组
    自己绘制的flex布局思维导图
    js打印三角形
  • 原文地址:https://www.cnblogs.com/bangdexuanyuan/p/13424499.html
Copyright © 2020-2023  润新知