经典入门博弈 与 SG函数和SG定理(Sprague_Grundy)

一、P/N法

必胜点和必败点的概念:

       P点:必败点,处于此位置的人,在双方操作均正确的情况下必败。

       N点:必胜点,处于此位置的人,在双方操作均正确的情况下必胜。

必胜点和必败点的性质:

        1、终结点为必败点P

        2、该点为必胜点N  等价于  该点至少有一种方式进入必败点P

        3、该点为必败点P  等价于  无论如何操作,该点都只能进入必胜点N(即无法进入必败点P)

典例:HDU - 1847

题目大意:

Kiki和Cici打牌,n张牌,轮流抓 ,Kiki先抓
抓牌数只能是2的幂次(1,2,4,8,16…) 张
最后抓完牌的人获胜

于是你可以打出如下的P/N表

于是你发现规律,3的倍数的点都是必败点

当然,没发现也没所谓,这个题 n 还是很小的,确确实实利用上面的性质用循环把表打出来也是可以的

好,理解了P/N法之后我们来继续学习下面的内容

二、经典博弈

1.巴什博弈(Bash Game)

首先说句废话,就是为啥这个叫巴什博奕,原因就是这事巴什发明的数学游戏,接下来要讲的两个博弈同理

巴什博奕事实上超级简单,那么我开讲了

只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。这就是巴什的游戏

根据我们上面讲的 P/N 法实际上就可以轻松的做出来了

我就不多讲了

然后这个是有结论的。记住最好,记不住就 P/N 也就几秒钟的事。

结论是:n 为 (m+1) 的倍数时必败

bool Bash_Game(int n,int m){//1赢0输,以后的代码同理
    if(n%(m+1)==0) return 0;
    return 1;
}

2.尼姆博弈(Nimm Game)

从尼姆博弈开始,我们就要增加难度了,由单游戏多游戏(组合游戏)转变

N堆物品,每堆有ni>0个物品,依旧是两个人来取,但是可取个数不再是 1~m 而是 1~∞

在这种情况下,问题就变得有意思了,而且还与二进制有密切关系。

对于这种多游戏博弈,我们不再用必败必胜点的说法了,而是说某种局势

奇异局势就相当于必败点非奇异局势就相当于必胜点

奇异局势的性质:(事实上就是必胜必败点的性质)

        1、任意操作都可将奇异局势变为非奇异局势。

        2、采用适当的方法,总可以将非奇异局势变为奇异局势。

然后有个非常有意思的人还专门提出一个定理

Bouton定理:先手能够在非平衡尼姆博弈中取胜,而后手能够在平衡的尼姆博弈中取胜。(平衡的尼姆博弈就是奇异局势)

(就是你面对奇异局势必败,面对非奇异局势必胜,和P/N一样,这个定理说的什么别再反复读了,知道还有这么个定理就行了)

我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势

第二种奇异局势是(0,n,n),只要对手与我拿走一样多的物品,最后都将导致(0,0,0)

仔细分析一下,(1,2,3)也是奇异局势,无论自己如何拿,接下来对手都可以将其变为(0,n,n)的情形。

那么这些奇异局势共有的特点是什么呢

研究表明:任何奇异局势(a,b,c)都有a⊕b⊕c =0 (异或运算⊕,或者你用模二加法做也一样,模二加减就是异或)

并且可以扩展到 N 个数,奇异局势(n1,n2,..,nN) 有 n1⊕n2⊕...⊕nN=0

这样我们就可以直接判断某一局势是奇异局势还是非奇异局势了

那么非奇异局势是通过进入奇异局势来取胜的,那么是如何进入的呢,让我们进一步来了解一下吧

由于异或运算满足 交换律和结合律 且 a⊕a=0

于是对于 (a,b,c),让 a=b⊕c,则 a⊕b⊕c = (b⊕c) ⊕ (b⊕c) = 0

同理你也可以让 b=a⊕c 或者 c=a⊕b,n个数同理,就不多说了

bool Nimm_Game(int N){
    int ans=0;
    for(int i=0;i<N;i++) ans^=n[i];
    if(ans) return 1;
    return 0;
}

典例:POJ - 2234 (纯Nimm博弈,一毛一样)

3.威佐夫博奕(Wythoff Game)

有两堆各a,b个物品,依旧是两个人来取,数量变为 单堆取1~∞个 或 同时从两堆中取同样多的物品。

这个游戏就比较有意思了,对于威佐夫博弈,我们可以发现他的奇异局势,前驱后继是链式的连接

我们用 (x , y) 来表示当前局势

然后 (a[ i ] , b[ i ]) 来表示 第 i 个奇异局势( i >= 0 ) ,前几个奇异局势为:

(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

发现一个威佐夫博弈中的奇异局势所具有的一条特殊性质两个结论

特殊性质:任何自然数都包含在一个且仅有一个奇异局势中。

初步结论:a[0] = b[0] = 0,a[ i ] 是未在前面出现过的最小自然数,且 b[ i ] = a[ i ] + i。

而这样的结论我们无法满足,毕竟 a[ i ] 的判断并不简单

于是继续研究 ( 威佐夫博弈中所有研究与证明都请忽略吧,研究的价值不大,学会结论才是最重要的 )

发现,a[ i ] = i * \frac{sqrt(5)+1}{2}\frac{sqrt(5)+1}{2}就是著名的黄金分割数

结论:令 b = max(a,b) , a = min(a,b)

            若 (b - a) * (1.0 + sqrt(5.0)) / 2.0 == a 则为奇异局势(必败),否则必胜

bool Wythoff_Game(ll a,ll b){
    if(a>b) swap(a,b);
    ll tmp=(b-a)*(1.0+sqrt(5.0))/2.0;
    if(tmp==a) return 0;
    return 1;
}

典例:HDU - 1527 (纯Wythoff博弈,一毛一样)

4.斐波那契博弈(Fibonacci Nim)(官方翻译:斐波那契尼姆)

其实这个放在第二个讲好点,和巴什博奕差不多都很简单

n 个砂子,两人轮流取,开局第一次可取 1 ~ n-1 个,从第二次开始每次可取 1~上一次*2 个

比如我先取了 2 个,轮到你取,你可以取 (1 ~ 4)个,你取了 3 个,然后轮到我取 (1 ~ 6)个

那么这个题呢,博主认为 P/N 法并不适用,比方说 2 是必败点,而你从 3 进到 2 , 2反而变成了必胜点

就是说同一个剩余数量 未必可取数量相同 于是状态不同 必胜必败将不再确定

总之,这个问题是有结论的,关于结论的证明过程博主也懒得去看了,客官也记结论吧,能做题就行

结论:n为斐波那契数则必败

斐波那契数 就这个:1,1,2,3,5,8,13,21,34,55...

典例:HDU - 2516

三、SG函数和SG定理(Sprague-Grundy)

学会了 P/N法 和 经典博弈 后,就该来谈谈我们的 SG函数和SG定理 了

SG定理是用来解决 多游戏(组合游戏) 的标准方法

SG定理:多游戏的SG函数值等于各个游戏SG函数值的Nim和。(Nim和即模二相加和,即异或和)

讲SG函数前,我们先来讲一下mex(minimal excludant)运算

mex运算:施加于集合,表示最小的不属于这个集合的自然数。例:mex{0,1,2,4}=3、mex{2,3,5}=0、mex∅=0。

SG函数公式: 令 RES(n) 表示状态 n 的所有后继状态构成的集合 (即 n 被取后剩余数量构成的集合)

                           令 SG(0) = 0,对 r1,r2,...,rcnt ∈RES(n) 有

                           SG(n) = mex{ SG(r1) , SG(r2) , ... , SG(rcnt) }

例如:有1堆n个的石子,每次只能取{ 1, 3, 4 }个石子

             n=1时,RES = { 0 },SG( 1 ) = mex { SG (0) } = mex{ 0 } = 1

             n=2时,RES = { 1 },SG( 2 ) = mex { SG (1) } = mex{ 1 } = 0

             n=3时,RES = { 0 , 2 },SG( 3 ) = mex { SG (0) , SG(2) } = mex{ 0 } = 1

             n=4时,RES = { 0 , 1 , 3 },SG( 4 ) = mex { SG (0) , SG(1) , SG(3) } = mex{ 0 , 1 } = 2

             n=5时 ,  RES = { 1 , 2 , 4 },SG( 5 ) = mex { SG (1) , SG(2) , SG(4) } = mex{ 0 , 1 , 2 } = 3

注:SG函数是单游戏递推得到的函数,对于单游戏,SG 函数完全可以取代 P/N 法

        SG函数值 非0 时 必胜,SG函数值为 0 时 必败。多游戏可用 SG 定理求得 和SG函数,进而判断出必胜必败情况

SG函数求取模板:

int sg[MAXN],f[N],vis[MAXN];//f[N]为N种可取个数(从小到大) vis标记RES对应的sg值 
void get_sg(){
	memset(sg,0,sizeof sg);
    for(int i=1;i<MAXN;i++){
        memset(vis,0,sizeof(vis));
        for(int j=0;j<N&&f[j]<=i;j++) vis[sg[i-f[j]]]=1;
        for(int j=0;;j++) if(!vis[j]){
            sg[i]=j;
            break;
        }
    }
}

典例:HDU - 1848

四、扩展与总结

1.SG函数的本质:当前状态为自变量,函数值为距最近的奇异局势(函数值为0)的距离

2.SG定理的理解:当前多游戏的SG函数值,等于子游戏的SG函数值的异或和

3.SG函数事实上是P/N法向多游戏的一个拓展,完全可以用来取代P/N法

4.SG函数的自变量可以是多维,函数值是单一的

   多游戏可以直接构造一个多维的SG函数,但往往由于游戏的重复性

   加上考量到时空复杂度,我们选取构造一维SG函数并利用SG定理求解

5.SG函数求取方法可概括为:所有当前状态的后继状态(后继状态可为多游戏,那么就是往往

   就是一个异或和)对应的SG函数值构成的集合的mex

6.巴什博弈是P/N法的一个应用,尼姆博奕是SG函数与SG定理的一个应用

7.标准的Nimm类游戏(可用P/N SG)要求游戏间操作独立,且对任意状态在任意情况下

   进入后继状态可以使用的手段相同,不随情况改变而改变

8.威佐夫博弈由于游戏间可互相影响,不是标准的Nimm类游戏

   但是可以将威佐夫博弈整体视作一个二维SG函数的单游戏并加以求解

9.斐波那契博弈中,同一状态在不同情况下进入后继状态的手段不同,不可用P/N与SG

发布了49 篇原创文章 · 获赞 0 · 访问量 1716

猜你喜欢

转载自blog.csdn.net/weixin_44077863/article/details/102754218