【读书笔记】基础博弈知识小结
一些概念和约定:
公平游戏:
这里讨论的组合游戏都是公平游戏,也就是说一个游戏者可以把状态A变成B,那么另一个游戏者也可以。比如下棋就不是公平游戏,因为白方可以移动白子而黑方不能。
状态图:
我们可以把游戏的状态用图的形式来组织。一个状态是一个节点,一条边代表通过一次操作将一个状态转移到另一个状态。
xor为二进制的异或运算,n个数的异或和在组合游戏中也称Nim和。
有的资料中把必败状态也叫做奇异状态,但我感觉必败状态这种叫法更直白一些。
假设游戏者双方都足够聪明,所以有这样两条规则:
- 一个状态是必败状态当且仅当它所有的后继都是必胜状态。
- 一个状态是必胜状态当且仅当它至少有一个后继是必败状态。
一、巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的 法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个, 结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
二、威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
本以为这是个比较简单的博弈,后来喜欢刨根问底的我发现涉及到的东西还真不少。
主要参考资料:http://scimath.unl.edu/MIM/files/MATExamFiles/Cotton_MATpaper_Final_EDITED.pdf
这个问题还可以描述成这样:
- 有一个棋子在棋盘的(n, m)位置上,有两位个人分别轮流移动这枚棋子。移动的规则是:向左移动若干格子,或者向下移动若干格子,或者向左下移动若干格子。移动到左下角即(0, 0)的人获胜。
先看几个比较简单的状态,如果先手面对的局面是(a, 0)或(0, a)或(a, a),那么直接将所有石子全部拿走即可获胜(或者说是将棋子直接移到左下角)。
如果现在状态是(1, 2)会怎样呢?枚举一下所有可能的情况:
- 拿走第一堆的一个石子,状态变为(0, 2),那么第二个人将第二堆的两个石子全部拿走即可获胜。
- 拿走第二堆的一个石子,状态变为(1, 1),那么第二个人将两堆石子全部拿走即可获胜。
- 拿走第二堆的两个石子,状态变为(1, 0),那么第二个人将第一堆的石子拿走即可获胜。
- 分别拿走第一堆和第二堆的一个石子,状态变为(0, 1),那么第二个人拿走第二堆的一个石子即可获胜。
也就是说无论第一个人怎样拿,第二个人都会获胜。那么称(1, 2)这个状态为必败状态或者奇异状态。
对于状态(1, 3)应该怎样?根据前面的分析,显然先手在第二堆取一个石子,将状态转移为(1, 2)就能获胜。
同样地,对于状态(2, 3),先手分别在两堆中各拿走一个石子,就能把状态转移为(1, 2)。
所以,对于状态(1, p)(p > 2)和状态(p, p+1)(p>1),先手将其转移为(1, 2)即可获胜。
其他奇异状态:
如图A,两个黑色的格点(1, 2)和(2, 1)是已知奇异状态,过这两个格点向右向上向右上作射线,则这些射线上的点都可以转移到黑色的格点上去。所以这些射线上的点对应的状态是必胜状态。然后我们再取没被标记过的横纵坐标最小的格点作为新的奇异状态,也就是(3, 5)和(5, 3)。然后再过这两个点作射线,继而得到新的奇异状态,以此类推。
有了这样一个过程,我们也很容易找到必胜的策略:如果现在的状态是必胜状态,那么必有一条射线经过该点。所以只要顺着这条射线将棋子移动到奇异状态(也就是图中的黑色格点)即可。这样对手在面对奇异状态的时候,不论怎么走,走到的都是有射线的格子(想一想,为什么)。所以你又可以把必胜状态转变为奇异状态给对手,最终获胜。
不妨再多找几个奇异状态试试:
因为两堆石子除了数量以外没有任何区别,所以只考虑(A, B)(A ≤ B)的奇异状态,做成表格如下:
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
A | 0 | 1 | 3 | 4 | 6 | 8 | 9 | 11 | 12 | 14 | ... |
B | 0 | 2 | 5 | 7 | 10 | 13 | 15 | 18 | 20 | 23 | ... |
容易发现一些规律:
- An + n = Bn
- ,这个可能不太好理解,不妨举个例子看一下:A3 + B3 = 4 + 7 = 11 = A7
这两个数列还可以按这样的方法得到,An为A、B中前n-1个数中为出现过的最小的正整数,Bn = An + n。比如,A1 = 1, B1 = A1 + 1 = 2;A2为为出现的最小的正整数3,B2 = A2 + 2 = 5;A3为未出现的最小正整数4,B3 = A3 + 3 = 7...
更强悍的通项公式:
设φ为黄金分割率(Golden Ratio),有或,解得
然后就有个神奇的结论:
知道有人喜欢不服,又懒得自己算,所以这里好心再附上一张表格验证一下:
n | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
φ⋅n | 0 | 1.618 | 3.236 | 4.854 | 6.472 | 8.090 | 9.708 | 11.326 | 12.944 | ... |
⎣φ⋅n⎦ | 0 | 1 | 3 | 4 | 6 | 8 | 9 | 11 | 12 | ... |
φ2⋅n | 0 | 2.618 | 5.236 | 7.854 | 10.472 | 13.090 | 15.708 | 18.326 | 20.944 | ... |
⎣φ2⋅n⎦ | 0 | 2 | 5 | 7 | 10 | 13 | 15 | 18 | 20 | ... |
最后还有一个事实要告诉大家:
每个正整数只在A或者B中出现,且仅出现一次。换句话说就是,A和B中没有相同的正整数,但是A和B并起来就得到了所有的正整数。
楼主的好奇心已经爆棚得不得了了,=_=||,干脆最后一口气又从维基百科上学了一下这个定理:
Beatty sequence:
两个无理数α和β满足:
那么两个数列{ ⎣α⎦, ⎣2α⎦, ⎣3α⎦... } 和 { ⎣β⎦, ⎣2β⎦, ⎣3β⎦... }是不相交的,而且他们的并集是所有的正整数。
Rayleigh theorem:
感觉第二个证明的反证法比较好懂一些,英语并不是很多,所以就不翻译了。
三、尼姆博弈(Nim Game):有三堆各若干个石子,两个人轮流从某一堆取任意多的石子,规定每次至少取一个,多者不限,最后取光者得胜,或者说最后不能操作的人输。
因为是三堆石子,所以我们用(a, b, c)来表示一个状态。
还是从最简单的状态开始:显然(0, 0, 0)是必败状态,其次(0, x, x)也是必败状态,因为你从某一堆中取k个石子,对手只要和你一样从另一堆中取同样的石子,保持两堆石子数量相同即可,这样最终取完的人将会是对手。
Bouton定理:状态(a, b, c)为必败状态当且仅当a xor b xor c = 0.
1).对于必胜状态,一定有一个后继必败状态。
假设三堆石子的个数的异或和为X(X > 0),X最高位的1在第k位,那么一定有一堆石子的数量第k位为1。
设这堆石子的数量为Y,我们只要把这堆变为X xor Y,就将必胜状态变为了必败状态。
首先说明 X xor Y < Y,因为X的第k位左边全部为0,所以X xor Y后,Y的第k位左边不变,而第k位变为0,所以Y xor X后Y变小。
下面计算Y变为X xor Y后所有数字的异或和:除了Y,所有数字的异或和为X xor Y,因为异或一个数两次相当于没有异或,然后再异或上Y改变以后的值X xor Y,最终答案为X xor Y xor (Y xor X) = 0,所以这是一个必败状态。
2).对于必败状态,所有的后继都是必胜状态。
因为要改变其中一堆火柴,不论哪一位发生变化,最终的xor和都不是0.
另类的Nim游戏:还是和原来一样n堆里面取石子,每次只能从一堆里面取若干个,至少取一个。但取到最后一个石子的人输!
天真地猜想一下,那结论是不是也要反过来呢?Nim为0必胜,不为0必败,很遗憾我误导你们了,=_=||
这个问题变得更复杂了,所以得再引入一些新的概念才能解决。
以下分析转自kuangbin的博客:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html
可能原文说得比较乱,所以这里把定义的概念统一列出来方便阅读:
- T状态,即Nim和为0的状态
- S状态,Nim和不为0的状态
- 孤单堆,只有一个石子的石子堆,好吧,确实很孤单=_=||
- 充裕堆,和孤单堆相反,至少有两个石子的石子堆。
- 所以,一个石子堆不是孤单堆就是充裕堆
将S、T状态与充裕堆的数量结合就可以得到分类更细致的状态:
- S2,Nim和不为0,至少有两个充裕堆
- S1,Nim和不为0,只有一个充裕堆
- S0,Nim和不为0,没有充裕堆,也就是只有奇数个孤单堆
- T2,Nim和为0,至少有两个充裕堆
- T1,404 Not Found!孤单堆只会影响Nim和的最后一位,而充裕堆必然有一个高位的1,将导致Nim和中对应的高位也是1,所以不存在这样的状态。
- T0,Nim和为0,没有充裕堆,也就是只有偶数个孤单堆
原文中还有更详细的推导:
[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
证明:
S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对
方取,所以最后一根必己取。败。同理, T0态必胜#
[定理6]:S1态,只要方法正确,必胜。
证明:
若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜。 #
[定理7]:S2态不可转一次变为T0态。
证明:
充裕堆数不可能一次由2变为0。得证。 #[定理8]:S2态可一次转变为T2态。
证明:
由定理1,S态可转变为T态,态可一次转变为T态,又由定理6,S2态不可转一次变为T0态,所以转变的T态为T2态。 #
[定理9]:T2态,只能转变为S2态或S1态。
证明:
由定理2,T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的S态不可能为S0态。命题得证。
[定理10]:S2态,只要方法正确,必胜.
证明:
方法如下:
1) S2态,就把它变为T2态。(由定理8)
2) 对方只能T2转变成S2态或S1态(定理9)
若转变为S2, 转向1)
若转变为S1, 这己必胜。(定理5)
[定理11]:T2态必输。
证明:同10。
综上所述,必输态有: T2,S0
必胜态: S2,S1,T0.
最后说一下
SG函数和SG定理:对于任意状态x,定义SG(x) = mex(S),其中S是x的后继状态的集合。SG(x) = 0当且仅当x为必败状态。
组合游戏的和:假设有k个组合游戏G1,G2...Gk,定义一个新游戏:每个回合当前游戏者选择一个子游戏进行合法的操作,直到不能操作者输。这样和游戏的SG函数值为各个子游戏的SG函数值的Nim和。
因为水平有限,仅仅是刚刚接触博弈论,所以这篇博客可能以后还会继续补充新的内容。
转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4396404.html
【读书笔记】基础博弈知识小结相关推荐
- 【读书笔记】隐性知识
持续学习&持续更新中- 守破离 [读书笔记]隐性知识 隐性知识 参考 实际的体会 实践出真知 隐性知识 隐性知识是 1958 年,迈克尔.波兰尼(Michael Polanyi)从哲学领域提出 ...
- Hadoop读书笔记——基础知识
//书非借不能读也,今早从图书馆新书阅览室借来<Hadoop in Action>,最长借期7天.整理读书笔记并留下电子版以供以后方便复习. Hadoop是一个开源的框架,可编写和运行分布 ...
- .net框架读书笔记---基础类型
接上一篇.net框架读书笔记---值类型的装箱与拆箱, 一.Object CLR要求每个类型都最终集成自System.Object类型,这意味着以下两种定义是相同的: //隐式继承自Object cl ...
- 读书笔记 --- [基础知识点] 小结2
1. TCP和UDP的区别 \ TCP UDP 是否连接 面向连接 无连接 是否可靠 可靠 不可靠 连接对象个数 1对1 1对1 或1 对多 传输方式 面向字节 面向报文 首部开销 20字节 8字节 ...
- #java读书笔记#基础知识
一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. ...
- 读书笔记 --- [基础知识点] 小结3
1. cookie与session的区别 参考 cookie机制 Cookie是服务器在本地机器上存储的小段文本,并随每一次发送至同一个服务器.网络服务器用HTTP头向客户端发送cookies,在客户 ...
- 读书笔记之——个人知识管理
最近,感觉学习的知识有点乱.于是专门找了本关于知识管理方面的书来读.<你的知识需要管理>,作者:田志刚 关于管理知识,我个人觉得: 一.做笔记.保存数据可以用: 1.OneNote:MS ...
- Python读书笔记-基础篇-1.万丈高楼平地起
随着人工智能领域的兴起,Python可以说集万千宠爱于一身,成了炽手可热的香饽饽.Python作为脚本语言,简单易上手,受到了很多编程爱好的喜爱. 编程语言是相通的,简单是一时的,任何语言的存在都有他 ...
- 视频图像传输学习笔记-基础小知识(一)
摄像头DVP与MIPI区别 DVP是并口,需要PCLK.VSYNC.HSYNC.D[0:11]--可以是8/10/12bit数据,看ISP或baseband是否支持:总线PCLK极限大约在96M左右 ...
最新文章
- 特斯拉AI日放大招!发布自研超算Dojo芯片,每秒可执行1024亿次计算
- 安防业内人士对云存储未来的发展充满信心
- js判断display隐藏显示
- 精通python-精通Python设计模式
- uploadify 附件上传
- form表单 无法提交js动态添加的表单元素问题。。
- Java 代码复用 —— 泛型
- oracle log 分析程序,oracle之logminer日志分析
- Python3.x:定义一个类并且调用
- 什么是GreenSock动画平台?
- 第一型曲线和曲面积分总结
- Print a rhombus (C++)
- 群晖NAS DSM7.0系统安装qBittorrent和transmission套件教程
- 产生调幅波的几种方法
- 机器人学回炉重造(5-2):关节空间规划方法——梯形加减速(与抛物线拟合的线性函数)、S型曲线规划
- SAP采购业务发票校验和后继凭证关联与参考码逻辑关系
- 王晓昀-PowerDesigner与模型驱动开发-UMLChina讲座-音频和幻灯
- watir安装及中文支持问题
- 常见基本回测指标(年化收益率,夏普率,最大回撤,β值,α值)的实现
- 人工智能时代将如何改变社会?
热门文章
- 数据库 -- 由数据库连接池引出的三种设计模式
- 编译php的时候,报configure: error: mcrypt.h not found. Please reinstall libmcrypt.错误的解决办法...
- 8.7 使用索引-notes
- html中单选多选怎么写,HTML中select标签单选多选用法详解
- input自适应_深度残差网络+自适应参数化ReLU(调参记录18)Cifar10~94.28%
- 基础练习 01字串(取位操作)
- 计算机漫游用户的工作原理,深入理解计算机系统——计算机系统漫游
- 技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生
- Golang 单元测试:有哪些误区和实践?
- 为了在全球“买买买”,阿里工程师自研了一套海外HR系统