瞎扯

 \(orzorz\) \(cdx\) 聚聚给我们讲了博弈论。我要没学上了,祝各位新年快乐。现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了。
 
 马上就要回去上文化课了,今明还是收下尾再稍微开一波多项式吧,不然万一文化课上自闭了被锤自闭了站教室外面没课听了还能有事情做……所以把这两天学到的东西稍微整理一下,以后再慢慢完善好了。
 
 发现博弈论的题目还是 \(Nim\) 博弈和其他的比较多。这次就先简单整理一些 \(Nim\) 博弈的类型和东西吧,主要是以某博客里搜来的一串题目为引导。因为是整理,所以就写一些自己的理解,不会说的很详细了……
 

Bash 博弈

 一类经典而基础的博弈问题。
 
 两个人玩游戏,有一堆石子,每次仅从一堆中取且可以取 \(1 ~ m\) 个,无子可取者为负,问谁有必胜策略。
 
 引入了 \(N\) (先手必胜)状态和 \(P\) (先手必败)状态的概念,在博弈论问题中,显然最终状态是一个让当前状态先手无路可走的 \(P\) 状态。这样根据定义,能转移到此状态的状态就是 \(N\) 状态,常用这样的逆推方法,推到起手为止。
 
 而经过观察与推算,这样的问题常常是存在可总结的规律的,经过这样的总结往往可以使时空复杂度大幅度降低以致到常数级别。
 
 例如对于本题,可以从简单的状态入手,当石子数为 \(0\) 时为一个 \(P\) 状态,则石子数为 \([1, m]\) 时是 \(N\) 状态,因为总可以一次拿完。而石子数为 \(m + 1\) 时,先手无论如何操作,后手总可以拿完剩下的石子,故是一个 \(P\) 状态。继续向前推发现,当石子数为 \(m + 1\) 的倍数时,与上述情况是相同的,先手必败;否则,先手总可以让后手处于上述状态,后手必败。
 

Bash 博弈 II

 一类经典而基础的博弈问题的加强版。
 
 两个人玩游戏,有一堆石子,事先给定一个数集 \(S\),每次仅从一堆中取且可以取的石子的数量 \(x \in S\),无子可取者为负,问谁有必胜策略。
 
 显然可以用与前面一个问题相同的方法找规律求解,但有可能十分麻烦。如何抽象地让计算机去做这件事情或者打出表找规律呢?可以引入一个函数 \(SG(u) = mex\{\ SG(v)\ \}\),其中 \(u\) 为当前局面,\(v\) 表示后继局面,以方便表示状态。
 

SG 函数

 上面提到了 \(SG\) 函数,这是博弈论中重要的概念和工具。
 
 \(SG\) 函数主要利用了其定义以判断当前的胜负状态。往往最终局面的 \(SG\) 函数值被设为 \(0\),且当 \(SG\) 函数值为 \(0\) 时当前局面被认为是 \(P\) 状态,反之是一个 \(N\) 状态。这个结论是巧妙地和定义结合在一起的,因为若 \(\forall SG(v) \ne 0\),则 \(SG(u) = 0\),对应了 \(P\) 状态的后继状态都是 \(N\) 状态;若 \(\exists SG(v) = 0\),则 \(SG(u) \ne 0\),对应了一个 \(N\) 状态总有一个后继状态是 \(P\) 状态。
 
 \(SG\) 函数的用途很广,而且有着十分神奇的性质,后面会提到。
 

DAG 与博弈

 这一类问题中,\(SG\) 函数的用法显而易见,也有很多很多问题可以转化为此类问题。
 
 在这一类问题中,前驱与后继状态清晰明了,而且往往没有显然的规律,以至于出题人会给你充足的时间让你把各种起手的状态处理一遍。这时就要用到 \(SG\) 函数了,而且很显然是让你把起手时的 \(SG\) 函数值推出来存下来 …… 于是就可以将其他的一些问题也对应到 \(DAG\) 上,然后直接通过 \(SG\) 函数之间的转移而解决几乎全部的问题。
 

Nim 博弈

 又是一类经典而基础的博弈问题的最初版本。
 
 两个人玩游戏,有 \(n\) 堆石子,每次操作可以选一堆石子xjb拿,最少拿一颗,无子可取者为负。
 
 介绍一个 \(SG\) 定理:游戏的和的 \(SG\) 值是各个子游戏的 \(SG\) 值的 \(xor\)。
 
 知道了以上结论,想到 \(Nim\) 游戏实际上可以分为 \(n\) 个 \(Bash\) 游戏,而 \(Bash\) 游戏若可以无限取子,则以当前局面剩余石子数为状态,\(SG(x) = x\)。所以这个题目的答案即为各个堆石子数的异或值,若值为 \(0\),先手必败,否则先手总有方案使得下一局面异或值为 \(0\),后手必败。
 
 不仅仅是 \(Nim\) 游戏,\(SG\) 定理是可以推而广之的。
 

对称博弈

 一类博弈问题的套路 (好像不属于 Nim 博弈)
 
 这类模型可以直接写出结论:若先手有着在第一步就取胜的方法,则先手胜;否则后手可以通过一定的操作将局面分成无法互相影响的相同的两部分,这样,先手做什么操作,后手就在另一部分上做相同的操作,所以最后一步一定是后手做的,此时先手必败。
 

阶梯博弈

 \(Nim\) 博弈的直接变种一,有着类似的特性且广泛出现 (以下三种博弈的相关证明)
 
 对于这一类模型,通常情况下只有两两之间的状态可以决定局面的胜负。我们可以将每两堆石子绑定在一起,若石子堆数为奇数,则将 \(0\) 位置与第 \(1\) 堆绑定在一起。而石子数可以是两堆间距离,可以是能够转移的数量等。
 
 把所有奇数阶梯看成 \(N\) 堆石子做 \(Nim\)。把石子从奇数堆移动到偶数堆可以理解为拿走石子,就相当于几个奇数堆的石子在做 \(Nim\)。存在必胜态的一方只要一直保持奇数堆不变,就可以跟着另一方把偶数堆的石子最终移动到 \(0\),所以偶数堆的移动不会影响奇数堆做 \(Nim\) 博弈的过程。
 

反 Nim 博弈

 \(Anti-Nim\),\(Nim\) 博弈的直接变种二,已经是有些分析难度的模型了。
 
 两个人玩游戏,有 \(n\) 堆石子,每次操作可以选一堆石子最少拿一颗,最后取子者为负。
 
 一个状态为必胜态,当且仅当所有堆的石子个数为 \(1\),且 \(xor\_sum = 0\);或至少有一堆的石子个数大于 \(1\),且 \(xor\_sum \ne 0\)。
 
 当所有堆石子数均为 \(1\) 时,胜负态与奇偶数相关;当仅有一堆石子数不为 \(1\) 时,先手总存在将其转化为前一种情况的必胜态的方案;当有多堆石子数不为 \(1\) 时,可以分类讨论以证明。
 

Moore's Nimk

 \(Nim\) 博弈的直接变种三,变得更麻烦起来了。
 
 两个人玩游戏,有 \(n\) 堆石子,每次操作可以选不超过 \(k\) 堆石子取任意多个,最少拿一颗,无子可取者为负。
 
 把 \(n\) 堆石子的石子数用二进制表示,统计每个二进制位上 \(1\) 的个数,若每一位上 \(1\) 的个数 \(mod\ (k+1)\) 全部为 \(0\),则必败,否则必胜,可以如下证明。
 
 全为 \(0\) 的局面是必败态。
 
 在某一次移动中,至少有一堆被改变,也就是说至少有一个二进制位被改变。由于最多只能改变 \(k\) 堆石子,所以对于任何一个二进制位,\(1\) 的个数至多改变 \(k\)。而若原 \(i\) 位 \(1\) 的总数为 \(k+1\) 的整数倍,所以改变之后必然不是 \(k+1\) 的整数倍。故在 \(P\) 状态下一次操作的结果必然是 \(N\) 状态。
 
 任何 \(N\) 状态,总能使其变成 \(P\) 状态,即总有一种方法让所有二进制位上的 \(1\) 的数量都恢复到 \(k+1\) 的整数倍。
 

树上博弈

 又是 \(Nim\) 的变种,不过已经看不太出来了呢。
 
 一棵树,有一个点作为树的根节点。游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走,谁无法移动谁输。
 
 叶子节点的 \(SG\) 值为 \(0\),中间节点的 \(SG\) 值为它的所有子节点的 \(SG\) 值加\(1\) 后的异或和。
 

图上博弈

 和树上博弈类似的东西,只是多了一点技巧而已。
 
 一个无向联通图,有一个点作为图的根节点。游戏者轮流从图中删去边,删去一条边后,不与根节点相连的部分将被移走,谁无法移动谁输。
 
 对于这个模型,有一个著名的 \(Fusion Principle\) 定理。可以对无向图做如下改动:将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边,所有连到原先环上的边全部改为与新点相连。这样的改动不会影响图的 \(SG\) 值。
 
 
 就先这么多吧……有没有 \(dalao\) 补充啊 \(orz\),后排膜一下 \(Attack\) 大爷 \(orz\)。
 
 —— 我知道有些人是爱我的,但我好像缺乏爱人的能力。  《人間失格》

博弈论中的Nim博弈的更多相关文章

  1. 博弈论-一堆nim博弈合在一起

    今天A了张子苏大神的的题,感觉神清气爽. 一篇对于多层nim博弈讲的很透彻的博文:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617 我来 ...

  2. Being a Good Boy in Spring Festival 博弈论 Nim博弈

    易游戏雷火盘古校园招聘开始! kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Ja ...

  3. Nim博弈(nim游戏)

    http://blog.csdn.net/qiankun1993/article/details/6765688 NIM 游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P- ...

  4. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...

  5. HDU 1907 Nim博弈变形

    1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...

  6. 关于NIM博弈结论的证明

    关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...

  7. HDU 2176:取(m堆)石子游戏(Nim博弈)

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. hdu 1730 Nim博弈

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1730 Nim博弈为:n堆石子,每个人可以在任意一堆中取任意数量的石子 n个数异或值为0就后手赢,否则先 ...

  9. POJ 2234 Matches Game(Nim博弈裸题)

    Description Here is a simple game. In this game, there are several piles of matches and two players. ...

随机推荐

  1. vue v-for动画bug

    因为是v-for 循环 出来的,:key = "index" 会出现问题,所以,需要把:key="XXX"换成其他属性就好了. 链接参考: https://se ...

  2. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  3. [20190423]那个更快的疑问3.txt

    [20190423]那个更快的疑问3.txt --//前一阵子,做了11g在单表单条记录唯一索引扫描的测试,摘要如下:--//参考链接:http://blog.itpub.net/267265/vie ...

  4. bootstarp 多图片上传 带进度条

    前台代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...

  5. redis报错:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)

    最近写了一个服务通过springboot构建,里面使用了redis作为缓存,发布到服务器运行成功,但是有时候会报redis的错误:org.springframework.data.redis.Redi ...

  6. 最新 robot framework安装

    相信大家对robot framework并不陌生,它是一个基于Python语言,用于验收测试和验收测试驱动开发(ATDD)的通用测试自动化框架=,提供了一套特定的语法,并且有非常丰富的测试库. Pyt ...

  7. C语言函数的格式

    #include <stdio.h>#include <stdlib.h>extern int addf(int a,int b);//函数能多次声明//int addf(in ...

  8. Charles(V3.10.1)的抓包以及常见功能的使用

    一.Charles的安装 安装都不会,那就不用再往下看了.(*^__^*) 嘻嘻…… 二.HTTP抓包 1.查看电脑IP地址 2.设置手机的HTTP代理 手机连接到同一WiFi下设置HTTP代理: 服 ...

  9. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  10. Tree 和ls 的使用

    再次声明:linux下的文件系统采用树的结构实现的 我们 可以安装 Tree 软件 在当前目录下(随便一个当前目录下)输入 tree 命令,我们可以看到整个当前文件目录下的目录以及文件的树状结构,这也 ...