博弈论

博弈论

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\{ \begin{aligned} x-1 & = & (x \mod 4=0) \\ x & = & (x\mod 4=1\&2) \\ x+1 & = & \ (x \mod 4=3) \end{aligned} \right. \]

题目&模板

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函数打表找规律才是最好的方法。

posted @ 2020-08-03 09:23  邦的轩辕  阅读(275)  评论(0编辑  收藏  举报