博弈SG函数
转自:Sprague-Grundy Function-SG函数--博弈论(3)
公平游戏的Sprague-Grundy定理
公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的。
一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作。

我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点。当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一个需要操作的玩家就是胜者。
P- 和 N-状态
如果双方都按照最佳策略进行游戏,我们可以将游戏中的每个状态依据其是先手必胜还是后手必胜分类。
一个先手胜状态被认为是一个N-状态(因为下一个玩家即将获胜),一个后手胜状态被认为是一个P-状态(因为前一个玩家即将获胜)
P-和N-状态归纳性地描述如下:
一个点v是P-状态当且仅当它的所有后继都为N-状态
一个点v是N-状态当且仅当它的一些后继是P-状态
这个归纳从汇点开始,汇点是P-状态因为它显然满足P-状态的要求。

游戏的P-和N-状态的信息提供了它的必胜策略。如果轮到我们且游戏处在一个N-状态,我们应该转移到一个P-状态。接着我们的对手就会被迫进入N-状态,依此类推。我们最终会移入一个汇点并获得胜利。
游戏的和
如果G1和G2 是公平游戏,那么他们的和G1 + G2是另一个公平游戏,玩法如下:每个回合,一个玩家选择G1, G2 中的一个(随便哪个他希望的)然后玩它,不碰另一个游戏。当 G1 和 G2都不能操作时游戏结束。
形式上,如果 G1 = (V1, E1) 和 G2 = (V2, E2)是游戏图,那么他们的和 Gsum = (Vsum, Esum) 规定为:
Vsum = V1 × V2,
Esum = {(v1v2, w1v2) | (v1, w1) ∈ E1} ∪ {(v1v2, v1w2) | (v2, w2) ∈ E2}.
现在,假定我们给出两个游戏G1 和 G2。如果我们只知道单个游戏的P-状态和N-状态我们能够正确地玩好游戏和G1 + G2吗?答案是否定的。不难看出两个P-状态的和总是P-状态,P-状态和N-状态的和总是N-状态。但是两个N-状态的和既可能是P-状态也可能是N-状态。因此,只知道单个游戏的P-状态和N-状态是不够的。
为了正确地玩好游戏和我们需要推广P-状态和N-状态,它就是Sprague-Grudy函数(或者简称为Grundy函数)。
The Sprague-Grundy function
Sprague-Grundy 函数
令N = {0, 1, 2, 3, ...} 为自然数的集合。Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数。结点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数。
形式上:给定一个有限子集 S ⊂ N,令mex S(最小排斥值)为没有出现在S中的最小自然数
mex S = min (N S).
现在,给定一个游戏图G=(V,E),其Sprague-Grundy函数g:V → N 归纳定义为
g(v) = mex {g(w) | (v, w) ∈ E}.
从G的汇点开始归纳,可知它的Grundy值为0

Sprague-Grundy函数满足两个重要性质:
点v是一个P-状态当且仅当g(v)=0
如果G = G1 + G2 且 v = v1v2 是G的一个状态,那么g(v) 为g(v1) 和 g(v2) 在二进制下的异或:
g(v) = g(v1) ⊕ g(v2).
运算⊕也称作nim和。举个例子,3 ⊕ 5 = 011 ⊕ 101 = 110 = 6。类似地,3 ⊕ 6 = 5 且 5 ⊕ 6 = 3。
不难利用归纳法证明上面两个性质。
根据这些性质有v = v1v2 是P-状态当且仅当g(v1) = g(v2), 因为这是唯一能够使得nim和为0的途径。
无疑,游戏的求和是满足交换律和结合律的运算,nim和运算也是。
因此,我们可以通过获知单个游戏的Grundy函数来正确地玩好任意数目游戏和。
我们的策略如下:如果轮到我们且游戏的Grundy值给出了一个非0的nim和,那么必然在游戏的某个组分中存在一个操作使得nim和变为0。我们应该执行这个操作,那么接着我们的对手就被迫再次使得nim和非0。最终,我们将成为在最后一个游戏执行最后一个操作的人,最后将nim和变为0.
The game of Nim
Nim游戏
最基本的公平游戏是Nim堆。一个Nim堆由确定数目代币组成。在每个回合,一个玩家从堆上拿走1到整堆中任意数目的代币。拿空整堆的人获得胜利。

这个游戏如果独立看是没有意义的:先手玩家可直接拿走所有代币并立即获得胜利!
但是如果我们将各种大小的Nim堆加在一起,我们就得到了著名的Nim游戏。
大小为n的Nim堆的Grundy值为n。因此,Nim游戏中每个状态的Grundy值为每堆大小的Nim和。
Games that decompose into sums of themselves
一些分解成自身和的游戏
Sprague-Grundy定理最自然的应用就是一些分解成自身和的一些游戏。
考虑下面这个游戏:有一个大小为m*n的棋盘,且有无限数目某特定形状的骨牌供应。在每个回合,玩家在棋盘上一个空位放置一个骨牌,不能放骨牌的玩家就是败者。

在游戏期间,棋盘会逐渐分成不同的区域,对其我们可以分别计算Grundy值。

再举个例子,考虑Grundy游戏。这个游戏的一个状态由一些不同大小的代币堆组成,一次操作由只取一堆并把它分成两个不相等的堆组成。当所有堆的大小只有1和2的时候游戏结束,因为它不能再分。
令g(n)为单个大小为n的堆的Grundy值。数列g(n)如下:
n: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...
g(n):0 0 1 0 2 1 0 2 1 0 2 1 3 2 1 3 2 4 3 0
比如:
当n等于1,2时已满足条件,即不能再取,也就没有下一个局面,所以g(1)={};所以G(1)={0,1,2,3,4...};
所以g(1)=0;同理g(2)=0;依次递推,g(3),g(4),g(5)等,
例如:g(6)={#(1,5),#(2,4)}={g(1)+g(5),g(2)+g(4)}=g(2,0);
所以G(6)={1,3,4,5,6...},所以g(6)=1;
此题的求法,具体参见我的博客的最下面求f(n)的值:http://www.cnblogs.com/hsqdboke/archive/2012/04/20/2459796.html
博弈SG函数的更多相关文章
- S-Nim HDU 1536 博弈 sg函数
		S-Nim HDU 1536 博弈 sg函数 题意 首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之 ... 
- hdu 3032(博弈sg函数)
		题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办 ... 
- HDU-4678 Mine 博弈SG函数
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678 题意就不说了,太长了... 这个应该算简单博弈吧.先求联通分量,把空白区域边上的数字个数全部求出 ... 
- (转)博弈  SG函数
		此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ... 
- 尼姆博弈+SG函数
		博弈这个东西真的很费脑诶.. 尼姆博奕(Nim Game):游戏者轮流从一堆棋子(或者任何道具)中取走一个或者多个,最后不能再取的就是输家.当指定相应数量时,一堆这样的棋子称作一个尼姆堆 当n堆棋子的 ... 
- 【转】博弈—SG函数
		转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ... 
- HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)
		Fibonacci again and again Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ... 
- Light OJ 1199  - Partitioning Game (博弈sg函数)
		D - Partitioning Game Time Limit:4000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ... 
- LightOJ 1315 - Game of Hyper Knights(博弈sg函数)
		G - Game of Hyper Knights Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & ... 
- Light OJ 1296 - Again Stone Game (博弈sg函数递推)
		F - Again Stone Game Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ... 
随机推荐
- kubernetes API Server安全
			用户访问API Server(以下简称Server),K8S的安全检查步骤:认证和授权. 认证解决用户是谁的问题,就是验证用户名密码;授权解决用户能做什么的问题,就是检查该用户是否拥有权限访问请求的资 ... 
- JAVA之接口与抽象类区别
			1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ... 
- ubuntu16.04  ssh服无法远程连接解决办法
			1.安装ssh服务sudo apt-get install openssh-server 2.修改配置文件sudo vi /etc/ssh/sshd_config#PermitRootLogin wi ... 
- 使用JMeter录制手机App脚本
			Apache JMeter是100%的Java桌面应用程序,用于对软件做压力测试.它最初被设计用于Web应用测试,但后来扩展到其他测试领域.现如今这款软件越来越受到测试人员的青睐,相比于LoadRun ... 
- Android学习(十八)Toast的使用
			一.什么是Toast 1.Toast是一种提供给用户简洁提示信息的视图. 2.该视图以浮于应用程序之上的形式呈现给用户, Toast提示界面不获取焦点,在不影响用户使用的情况下,给用户某些提示. 3. ... 
- BZOJ 4216 Pig 分块乱搞
			题意:id=4216">链接 方法:分块以节约空间. 解析: 这题坑的地方就是他仅仅有3M的内存限制,假设我们开longlong前缀和是必死的. 所以考虑缩小这个long long数组 ... 
- 【Excle数据透视表】如何快速选定数据透视表的汇总行并添加绿色底纹
			数据透视表创建好之后,如何批量将汇总行的底色修改为绿色呢?目标效果图如下: 解决方案 "启用选定内容"选取所有汇总行 单击任意汇总字段(如:北京 汇总)→选择→启用选定内容→开始→ ... 
- How to Start a New Cocos2d-x Game for version 3.0
			This documentation will show you how to use cocos console to create and run a new project. Runtime R ... 
- 【LeetCode】LeetCode——第14题:Longest Common Prefix
			14. Longest Common Prefix My Submissions Question Editorial Solution Total Accepted: 97052 Total Sub ... 
- Android提供支持不同屏幕大小的各种方法
			1 http://blog.csdn.net/guolin_blog/article/details/8830286 (手机平板,通过large-layout来区分两条布局文件) 2 http:// ... 
