SG函数

个人理解:SG函数是人们在研究博弈论的道路上迈出的重要一步,它把许多杂乱无章的博弈游戏通过某种规则结合在了一起,使得一类普遍的博弈问题得到了解决。

从SG函数开始,我们不再是单纯的同过找规律等方法去解决博弈问题,而是需要学习一些博弈论中基本的定理,来找到他们的共同特点

那么就先介绍几个最基本的定理(也可以叫常识)吧

基本定理

ICG游戏

1.游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。

2.当有一人无法做出决策时游戏结束,无法做出决策的人输。无论二者如何做出决策,游戏可以在有限步内结束。

3.游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。

满足上述条件的问题我们称之为ICG游戏,ICG游戏属于组合游戏

最典型的nim游戏,就是一种ICG游戏

必胜态与必败态

定义P-position与N-position

P-position:必败态(简记为P),即Previous-position,你可以直观的认为处于这种状态的人一定会输

N-position:必胜态(简记为N),即Next-position,你可以直观的理解为处于这种状态的人一定会赢

这仅仅是最直观的定义

更严谨的定义为:

  1. 无法移动的状态(即terminal-position)为P
  2. 可以移动到P的局面为N
  3. 所有移动都会进入N的局面为P

DAG(有向无环图)中的博弈

在正式研究\(SG\)函数之前,我们先来研究一下DAG中的博弈

给定一张有向无环图,在起始定点有一枚棋子,两个顶尖聪明的人交替移动这枚棋子,不能移动的人算输

不要小看这个游戏,事实上,所有ICG问题都可以抽象为这种游戏(即把初始局面看做顶点,把从一个状态可以到另一个状态之间连边)

SG函数

下面我们来正式研究一下SG(Sprague-Grundy)函数

首先定义mex运算,这是一种集合中的运算,它表示最小的不属于集合的非负整数

例如\(mex\{1,2,3\}=0\),\(mex\{0,2\}=1\),\(mex\{0,1,2,3\}=4\),\(mex\{\}=0\)

对于给定的有向无环图,定义每个点的SG函数为

\(SG(x)=mex \{\ SG(y)\ |\ x \ can\ go\ to\ y \}\)

然而单单一个这样的空洞的函数是解决不了问题的,我们需要分析一下它的性质

  • 所有汇点的\(SG\)函数为\(0\)

这个性质比较显然,因为汇点的所有后继状态都是空集

  • 当\(SG(x)=0\)时,该节点为必败点

由\(SG\)函数的性质易知该节点的所有后继节点\(SG\)值均不为\(0\)

满足必败态的定义

  • 当$SG(x)\neq 0 $,该节点为必胜点

由\(SG\)函数的定义可知该节点的后继节点中一定有一个节点\(SG=0\)

满足必胜态的定义

这样我们通过最基本的\(SG\)值的定义,我们就可以判断出一个状态是必胜态还是必败态

这个问题实际上就是我们前面讲的巴什博奕

如果这个问题再复杂一点呢?

当这个棋盘上有\(n\)个棋子的时候呢?

其实它们的分析思路是一样的

当\(SG(x)=k\)时,它表明后继状态中含有\(SG(y)=1 \dots k-1\)

也就是说,我们从\(k\)可以转移到\(1 \dots k-1\)中的任何一个状态,而当前共有\(n\)个棋子。

这会让你想到什么?

nim取石子游戏!

那我们是不是也可以推出:

如果在nim游戏中的\(n\)堆石子的\(SG\)值异或和不为\(0\)就说明先手必胜呢?

这是肯定的,因为当你打出nim游戏的\(SG\)值表时就会发现,\(SG_{nim}(x)=x\)

是不是很神奇?

SG定理

SG函数的应用远远不止和巴什博奕与nim游戏有关,我们回过头来考虑能否把SG函数推广开来

类比nim取石子游戏的思路,我们可不可以大胆设想:

游戏的和的SG值是他们的SG值的xor

暂且不管这个结论对不对,我们设想一下,假如这个结论对的话,会有什么后果.

我们可以将ICG问题对应到DAG上,然后直接通过SG函数之间的转移而解决几乎全部的问题

是不是很令人兴奋?

更令人兴奋的是,这个定理是正确的!

什么?证明?

如果你是一个追求完美的人可以看这里

如果你像我一样连线性代数都不知道是什么的话大概就是从DAG上归纳一下就好了吧

SG定理的应用

SG定理的应用非常的广泛,几乎所有的博弈类问题都有它的影子,本文仅仅是简单的介绍一下这个定理,更深层次的应用以后会补充的

上面提到了SG函数,那么SG函数的值是怎么计算的呢?

很简单,我们直接通过\(mex\)运算的定义就可以计算了

int F[MAXN];//可以转移的状态集合,一般题目会给出
int S[MAXN];//表示该点可以转移到的状态有哪些
int SG[MAXN];//该点的SG值
void GetSG()
{
for(int i=1;i<=N;i++)//枚举DAG中所有点
{
memset(S,0,sizeof(S));//初始化
for(int j=1;j<=limit&&F[j]<=i;j++)//limit表示转移的集合的大小
S[SG[i-F[j]]]=1;
for(int j=1;;j++)
if(!S[j])
{SG[i]=i;break;}//根据定义计算SG函数
}
}

来一道裸题

题解

博弈论进阶之SG函数的更多相关文章

  1. 博弈论基础之sg函数与nim

    在算法竞赛中,博弈论题目往往是以icg.通俗的说就是两人交替操作,每步都各自合法,合法性与选手无关,只与游戏有关.往往我们需要求解在某一个游戏或几个游戏中的某个状态下,先手或后手谁会胜利的问题.就比如 ...

  2. 博弈论初步(SG函数)

    讲解见此博客https://blog.csdn.net/strangedbly/article/details/51137432 理解Nim博弈,基于Nim博弈理解SG函数的含义和作用. 学习求解SG ...

  3. 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans

    一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...

  4. 【博弈论】【SG函数】【找规律】Gym - 101147A - The game of Osho

    以后这种题还是不能空想,必须打个表看看,规律还是比较好找的……具体是啥看代码.用SG函数暴力的部分就不放了. #include<cstdio> using namespace std; i ...

  5. 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头

    仅有距根节点为奇数距离的节点的石子被移走对答案有贡献,∵即使偶数的石子被移走,迟早会被再移到奇数,而奇数被移走后,不一定能够在移到偶数(到根了). 最多移L个:石子数模(L+1),比较显然,也可以自己 ...

  6. 【博弈论】【SG函数】poj2311 Cutting Game

    由于异或运算满足结合律,我们把当前状态的SG函数定义为 它所能切割成的所有纸片对的两两异或和之外的最小非负整数. #include<cstdio> #include<set> ...

  7. 【博弈论】【SG函数】hdu1848 Fibonacci again and again

    某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数. 有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态. 不论SG值增加与否,我们都可以 ...

  8. 博弈论中的SG函数

    SG函数的定义: g(x) = mex ( sg(y) |y是x的后继结点 ) 其中mex(x)(x是一个自然是集合)函数是x关于自然数集合的补集中的最小值,比如x={0,1,2,4,6} 则mex( ...

  9. POJ 3553 Light Switching Game 博弈论 nim积 sg函数

    http://poj.org/problem?id=3533 变成三维的nim积..前面hdu那个算二维nim积的题的函数都不用改,多nim积一次就过了...longlong似乎不必要但是还是加上了 ...

随机推荐

  1. 调研一类软件的发展演变( 1000-2000 words, in Chinese)

    WARING:大量个人观点,可靠性突出一个没有. 随着时代的发展,科技的用途也在发生着改变.最初,计算机是高端科学家用来计算导弹路线.模拟核弹爆炸用的,而现在计算机更多是平凡百姓家的一台娱乐设备.当今 ...

  2. 【前端性能】Web 动画帧率(FPS)计算

    我们知道,动画其实是由一帧一帧的图像构成的.有 Web 动画那么就会存在该动画在播放运行时的帧率.而帧率在不同设备不同情况下又是不一样的. 有的时候,一些复杂或者重要动画,我们需要实时监控它们的帧率, ...

  3. Spring Boot 实现 RabbitMQ 延迟消费和延迟重试队列

    本文主要摘录自:详细介绍Spring Boot + RabbitMQ实现延迟队列 并增加了自己的一些理解,记录下来,以便日后查阅. 项目源码: spring-boot-rabbitmq-delay-q ...

  4. Roslyn还出现这么低级的错误,不应该呀!

    前几天对Dora.Interception作了简单的重构,想提供C#脚本来定义Interception Policy,毫无疑问微软提供的编译平台Roslyn使C#脚本化提供了支持.但是没有想到随便尝试 ...

  5. HTTP/2 资料汇总

    随着今年 5 月 14 日 HTTP/2 协议正式版的发布,越来越多的网站开始部署 HTTP/2 了.我对 HTTP 协议一直都比较有兴趣,本文汇总一些关于 HTTP/2 的资料以及我写过的文章,会持 ...

  6. flex弹性布局心得

    概述 最近做项目用flex重构了一下网页中的布局,顺便学习了一下flex弹性布局,感觉超级强大,有一些心得,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: Solved by Flexbo ...

  7. [Swift]LeetCode174. 地下城游戏 | Dungeon Game

    The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...

  8. [Swift]LeetCode672. 灯泡开关 Ⅱ | Bulb Switcher II

    There is a room with n lights which are turned on initially and 4 buttons on the wall. After perform ...

  9. 十分钟通过 NPM 创建一个命令行工具

    大过年的,要不要写点代码压压惊?来花十分钟学一下怎么通过 NPM 构建一个命令行工具. 写了一个小 demo,用于代替 touch 的创建文件命令 touchme ,可以创建自带“佛祖保佑”注释的文件 ...

  10. docker常用指令01

    1.进入交互式界面 docker run (--name=xx命名)-i -t ubuntu /bin/bash docker run --name=con1 -i -t ubuntu /bin/ba ...