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. create-react-app创建的项目中registerServiceWorker.js文件的作用

    使用React官方的脚手架工具create-react-app创建的项目,目录中会存在registerServiceWorker.js这个文件,这个文件的作用是什么呢? 这个文件可以使用也可以不使用, ...

  2. Edge-assisted Traffic Engineering and applications in the IoT

    物联网中边缘辅助的流量工程和应用 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文.由于时间仓促,且笔 ...

  3. 带parent指针的successor求解

    题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点(不存在重复数据).树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 如果当前节点有右孩子,则下一个节点是右孩子中 ...

  4. FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据

    如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...

  5. [Swift]LeetCode375. 猜数字大小 II | Guess Number Higher or Lower II

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  6. [Swift]LeetCode957. N天后的牢房 | Prison Cells After N Days

    There are 8 prison cells in a row, and each cell is either occupied or vacant. Each day, whether the ...

  7. [Swift]LeetCode965. 单值二叉树 | Univalued Binary Tree

    A binary tree is univalued if every node in the tree has the same value. Return true if and only if ...

  8. Hystrix概念设计

    1. Hystrix概念设计 1.1. 大纲 1.2. 基本的容错模式 1.3. 断路器模式 1.4. 舱壁隔离模式 1.5. 容错理念 凡事依赖都可能失败 凡事资源都有限制 网络并不可靠 延迟是应用 ...

  9. shell cut 应用实战

    简介: cut是一个强大文本处理工具,它可以将文本按列进行划分的文本处理.cut命令逐行读入文本,然后按列划分字段并进行提取.输出等操作. 命令格式: cut [option] filename ca ...

  10. python中的None

    python中的None python中的None就相较于Java中的Null.python中就没有所谓的NULL.网络上很多的时候说的"python的Null"这个说法本身就是不 ...