博弈论中的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. ...
随机推荐
- selenium-确认进入了预期页面
selenium确认进入了预期页面 在自动化操作中,浏览器每次进入一个新的需要,都需要确认该页面是否打开或打开的页面是否是预期的页面 需要进行确认页面后方可进行下一步操作 确认页面有很多中方法,像每个 ...
- layui+ztree 树状下拉框
一.效果图 [关闭] [展开] 二.代码 [HTML]注:布局一定要用DIV不是select否则效果···· <div class="layui-form-item"> ...
- 基于GitLab的Code Review教程
一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...
- 教你一招 | 用Python实现简易可拓展的规则引擎
做这个规则引擎的初衷是用来实现一个可序列号为json,容易拓展的条件执行引擎,用在类似工作流的场景中,最终实现的效果希望是这样的: 简单整理下需求 执行结果最终返回=true= or false 支持 ...
- MongoDB个人简单总结
当同一个变量被连续插入两次会出现id相同的异常,但是同样内容的两个变量同时插入不会有问题,可能是同一个变量同一个地址生成id相同,导致异常. 默认登陆不需要用户名密码认证,需要密码认证登陆需要在adm ...
- win10下Resin安装--入门(1)
我个人采用是解压版的,直接解压亦可使用下载地址 开启该服务需要的环境:首先你的JDK必须安装成功 解压后你会看到 当我们运行程序时,需要修改配置文件中的相关配置: 1.端口:以免端口被占用 2.相应 ...
- windows10滑轮bug
今天我突然发现我一点也忍受不了在UWP应用.wi10窗口.设置等界面无法使用鼠标滑轮了.这个bug已经困扰了我差不多一年了,从买了这台笔记本就开始了.而且这个问题在中间的某一次升级系统后,也修复了,但 ...
- 一个简易的kmp教学并给出java实现
简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source 为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...
- ERROR:"org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /config/topics/test" when creating or deleting Kafka operations authorized through the Ranger policies
PROBLEM DESCRIPTION When creating or deleting topics in Kafka, they cannot be authorized through the ...
- 015_python原生在线调试工具
一.pdb https://docs.python.org/3/library/pdb.html