博弈论中的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. ...
随机推荐
- 通用查询类封装之Mongodb篇
查询在应用程序中很重要,花样也特别多,不同得业务需求需要不同的查询条件,还要支持and.or ……事实上也确实如此,程序中有N多个查询类,并且很可能其中有多个类查询同一张表,所以特别想弄一个通用的查询 ...
- 《JavaScript高级程序设计》笔记:DOM2和DOM3(十二)
DOM1级主要定义的是HTML和XML文档的底层结构.DOM2级和DOM3级在这个结构基础上引入了更多的交互能力,也支持更高级的XML特性.为此DOM2级和DOM3级分为了很多的模块(模块直接具有某种 ...
- 安装odoo小程序商城模块报错 KeyError: u'oejia_weshop'
错误截图如下 检查模块目录名是否不是 oejia_weshop,比如 oejia_weshop-master,注意odoo的模块名不能随便更改,odoo小程序商城模块目录名必须是oejia_wesho ...
- SuperMap iServer 在Linux 部署中问题总结
SuperMap iServer 作为超图公司的云GIS服务器产品,一般是部署在Linux服务器上.下面把日常部署和使用过程中遇到的相关问题做以汇总. 1.部署iServer的第一步是要检查Linux ...
- SpringBoot+MyBatis配置多数据源
SpringBoot 可以支持多数据源,这是一个非常值得学习的功能,但是从现在主流的微服务的架构模式中,每个应用都具有唯一且准确的功能,多数据源的需求很难用到,考虑到实际情况远远比理论复杂的多,这里还 ...
- nginx常用场景
1.浏览器缓存 server { listen 8083; server_name 127.0.0.1; sendfile on; access_log /var/log/nginx/static_s ...
- SQL Server数据仓库的基础架构规划
问题 SQL Server数据仓库具有自己的特征和行为属性,有别去其他.从这个意义上说,数据仓库基础架构规划需要与标准SQL Server OLTP数据库系统的规划不同.在本文中,我们将介绍在计划数据 ...
- July 11th, 2018. Wednesday, Week 28th.
It is during our darkest moments that we must focus to see the light. 越是在艰难的时候就越要着眼于光明. From Aristol ...
- ASP.NET MVC 下自定义 ModelState 扩展类,响应给 AJAX
ModelStateExtensions.cs using System.Collections.Generic; using System.Linq; using System.Web.Mvc; n ...
- awk删除最后一个字符
删除最后一个字符 如:1.1.1, 在file文件中: sed '$s/.$//' file 或者: head -c-2 去掉最后一个字符 head -c-3 去掉最后二个字符 head -c- ...