博弈论中的Nim博弈
瞎扯
\(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博弈的更多相关文章
- 博弈论-一堆nim博弈合在一起
今天A了张子苏大神的的题,感觉神清气爽. 一篇对于多层nim博弈讲的很透彻的博文:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617 我来 ...
- Being a Good Boy in Spring Festival 博弈论 Nim博弈
易游戏雷火盘古校园招聘开始! kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/10000 K (Ja ...
- Nim博弈(nim游戏)
http://blog.csdn.net/qiankun1993/article/details/6765688 NIM 游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P- ...
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- 关于NIM博弈结论的证明
关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu 1730 Nim博弈
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1730 Nim博弈为:n堆石子,每个人可以在任意一堆中取任意数量的石子 n个数异或值为0就后手赢,否则先 ...
- POJ 2234 Matches Game(Nim博弈裸题)
Description Here is a simple game. In this game, there are several piles of matches and two players. ...
随机推荐
- 重建程序员能力(3)-asp.net MVC框架增加Controller
MVC在微软中提供的框架目前只是发现是asp.net用.另 8年前,我做了个MVC的Windows APP框架如果有兴趣我日后会介绍给大家,欢迎大家关注.MVC的概念网站上有很多,大家去查阅一 ...
- ext当表单中的输入项为必填时,输入项label后显示红色的*
form表单里,当输入项为必填项时,需要将对应item的allowblank属性设置为true,如果item的label后面自带红色的*,表单中哪些输入项是“必填”,哪些输入项是“非必填”,一眼望去清 ...
- SQL 知道字段名 全表搜索此字段属于哪个表
SELECT name FROM sysobjects WHERE id IN (SELECT ID FROM syscolumns WHERE name='字段名')
- CG-CTF simple-machine
运行一下,输入flag: 用ida打开: input_length和input_byte_804B0C0为重命名的变量:现在一个个看调用的函数. sub_8048526(): 这个函数使用了mmap分 ...
- Ranger-Kafka插件安装
Ranger-Kafka插件安装, 使用Ranger0.7.0版本,集成Kafka插件到Kafka集群, Kafka Plugin需要安装到所有的Kafka的集群节点上面. 1.登陆Kafka的安装用 ...
- git 同步远程分支
1. 同步远程分支到本地 git fetch 2. 查看本地分支 git branch *dev //当前分支 master test 3.切换分支 git checkout master // 切换 ...
- nginx正则匹配
1.通用匹配规则 . 匹配除换行符以外的任意字符 \w 匹配字母.数字.下划线.汉字 \s 匹配任意的空白符 \d 匹配数字 ^ 匹配字符串的开始 $ 匹配字符串的结束 ...
- Mongo C# Driver 聚合使用---深入浅出
聚合查询结构体系 我们都知道Mongo中聚合是由$match,$project等聚合项组成,所以在C# Driver中具有两种类型:聚合管道(PipelineDefinition)和聚合管道项(I ...
- QPalette
Help on class QPalette in module PyQt5.QtGui: class QPalette(sip.simplewrapper) | QPalette() | QPa ...
- Web后台快速开发框架
Web后台快速开发框架 Coldairarrow 目录 目录 第1章 目录 1 第2章 简介 3 第3章 基础准备 4 3.1 开发环境要求 4 3.2 ...