博弈论之SG函数

算法学习笔记(博弈论中的SG函数) 定义SG函数:对于状态x和它的所有k个后继状态y1​y2​...yk​SGxmexSGy1​SGy2​...SGyk​)}mex函数的值表示不属于集合的最小非负整数)现在对所有起点的SG函数值做异或和,若异或和为0,则这个状态为必败状态。若不为0,则为必败状态。现给出证明:当一个状态没有后继状态时,求mex集合为空集合,SG函数的值为0。即最终态的SG函数值必为0,而对于一个SG函数值不为0。 阅读详情

下面的所有知识均属博弈论范畴。


SG ⁡ \operatorname{SG} SG 函数

Nim ⁡ \operatorname{Nim} Nim 博弈

在介绍 SG ⁡ \operatorname{SG} SG 函数前,我们先介绍一种经典的博弈—— Nim ⁡ \operatorname{Nim} Nim 博弈,并从中获得一定的启发。

  • 问题:有 n n n 堆石子,第 i i i 堆石子里面有 A i A_i Ai​ 枚石子,每人每次可从任意且至多一堆石子里取出任意多枚石子扔掉,可以取完,不能不取,最后无石子可取的人判负。假如甲是先手,且告诉你这 n n n 堆石子的数量,他想知道是否存在先手必胜的策略。

  • 结论:若 xor ⁡ i = 1 n A i ≠ 0 \operatorname{xor}_{i = 1}^n A_i \ne 0 xori=1n​Ai​​=0,先手必胜,否则后手必胜。

我们发现,当甲做完最后一步操作,将所有石子取完时,甲就赢了。此时,说明每堆石子均为 0 0 0 是一个必胜态。

所以,甲要进行的操作一定要使得自己最终一定要到达必胜态,并且对方永远不可能到达必胜态。

可以发现,如果甲操作后 xor ⁡ i = 1 n A i = 0 \operatorname{xor}_{i = 1}^n A_i = 0 xori=1n​Ai​=0,那么对方操作一次一定会使得 xor ⁡ i = 1 n A i ≠ 0 \operatorname{xor}_{i = 1}^n A_i \ne 0 xori=1n​Ai​​=0。

所以,甲只要保持自己每次操作后 xor ⁡ i = 1 n A i = 0 \operatorname{xor}_{i = 1}^n A_i = 0 xori=1n​Ai​=0,就会使得对方永远到达不了必胜态,同时若干次操作后甲一定能够到达必胜态(因为石子数只会减少)。

实际上,我们可以称所有 xor ⁡ i = 1 n A i = 0 \operatorname{xor}_{i = 1}^n A_i = 0 xori=1n​Ai​=0 的状态为必胜态,所有 xor ⁡ i = 1 n A i ≠ 0 \operatorname{xor}_{i = 1}^n A_i \ne 0 xori=1n​Ai​​=0 的状态为必负态。

最后一个问题:能不能保证每一次操作都能使得甲从对方操作后形成的必负态走向一个必胜态?答案是能的。

我们假设对方操作完后的必负态为 xor ⁡ i = 1 n A i = x \operatorname{xor}_{i = 1}^n A_i = x xori=1n​Ai​=x,设 x x x 的最高位为 k k k,那么必定存在至少一个 A i A_i Ai​ 满足第 k k k 位为 1 1 1,我们只要任意选择这样的一个 A i A_i Ai​,进行操作 A i ← A i xor ⁡ x A_i \leftarrow A_i \operatorname{xor} x Ai​←Ai​xorx,就能使得甲到达必胜态。

可以发现, A i > A i xor ⁡ x A_i > A_i \operatorname{xor} x Ai​>Ai​xorx,所以这样的操作是合法的。

有向图游戏

可以发现, Nim ⁡ \operatorname{Nim} Nim 游戏满足如下三条定则:

  1. 两名玩家交替行动;
  2. 任意时刻,可以执行的合法行动与轮到哪名玩家无关;
  3. 不能够行动的玩家判负。

满足它们的游戏被称为公平组合游戏。

同时我们还可以发现,如果把所有的状态看作是图上的一个个节点,那么 Nim ⁡ \operatorname{Nim} Nim 博弈的过程非常像一个有向图。

所以,我们完全可以把 Nim ⁡ \operatorname{Nim} Nim 游戏转化为:

  • 在初始节点摆一枚棋子,两人轮流拿棋子在有向图上移动一条边,无法移动的人判负。

这种游戏被称为有向图游戏。

上述内容证明了:如果把状态看作节点,所有的公平组合游戏都能够转化为有向图游戏。

正文—— SG ⁡ \operatorname{SG} SG 函数

我们把先手必胜的节点称为必胜态,反之称为必负态。

那么在这个有向图中,终点显然为必负态,因为在这里无法移动。

否则,我们该如何判定一个状态是否为必胜态或必负态呢?

这里就要用到 SG ⁡ \operatorname{SG} SG 函数了。注意:它只能够在有向图游戏中使用。

对于终点,我们设它为 T T T。像这样的必负态,我们设它的 SG ⁡ ( T ) = 0 \operatorname{SG}(T) = 0 SG(T)=0。

如果一个节点 U U U 存在后继节点 V V V 的 SG ⁡ ( V ) = 0 \operatorname{SG}(V) = 0 SG(V)=0,那么我们可以选择走这个状态,把这个必负态抛给对手。所以, U U U 节点即为必胜态,有 SG ⁡ ( U ) > 0 \operatorname{SG}(U) > 0 SG(U)>0。

反之,如果一个节点 U U U 不存在后继节点 V V V 的 SG ⁡ ( V ) = 0 \operatorname{SG}(V) = 0 SG(V)=0,那么这个节点无论怎么走都将给对方抛一个必胜态,所以 SG ⁡ ( U ) = 0 \operatorname{SG}(U) = 0 SG(U)=0。

把以上两条公式结合起来,就有:
SG ⁡ ( U ) = mex ⁡ { SG ⁡ ( V ) } \operatorname{SG}(U) = \operatorname{mex} \{\operatorname{SG}(V)\} SG(U)=mex{SG(V)}
其中 mex ⁡ \operatorname{mex} mex 表示的是集合中没有出现过的最小非负整数。

由此,我们只要从终点 T T T 开始,把整个有向图每一个节点的 SG ⁡ ( U ) \operatorname{SG}(U) SG(U) 推出来,那么起点 S S S 的 SG ⁡ ( S ) \operatorname{SG}(S) SG(S) 即决定了整个有向图游戏先手是必胜还是必负。

SG ⁡ \operatorname{SG} SG 定理

并不是每一个公平组合游戏都能够转化为一个有向图游戏 ,因为可以有多个。

如果一个游戏存在多个有向图游戏,那么整个游戏的 SG ⁡ ( G ) \operatorname{SG}(G) SG(G) 等于每一个有向图游戏的 SG ⁡ ( S k ) \operatorname{SG}(S_k) SG(Sk​) 的异或和。

即:
SG ⁡ ( G ) = xor ⁡ k = 1 n SG ⁡ ( S i ) \operatorname{SG}(G) = \operatorname{xor}_{k = 1}^n \operatorname{SG}(S_i) SG(G)=xork=1n​SG(Si​)
这被称为 SG ⁡ \operatorname{SG} SG 定理,它给了我们把整个游戏进行分治的可能。证明略去,因为笔者不是很会。

由此,我们可以将 Nim ⁡ \operatorname{Nim} Nim 博弈转化为 n n n 个有向图游戏,那么每一堆石子都代表了一个有向图游戏。可以推出,第 i i i 堆的 SG ⁡ \operatorname{SG} SG 函数值即为 A i A_i Ai​,那么总的答案即为 xor ⁡ k = 1 n A i \operatorname{xor}_{k = 1}^n A_i xork=1n​Ai​。


比较好像的博弈论动态规划 ,不过笔者第一眼认为是贪心然后就狂吃 WA。

设状态 f i , j f_{i, j} fi,j​ 表示当前数对为 ( i , j ) (i, j) (i,j) 时我们的选择。注意 i i i 的特点是只含有 2 , 3 2,3 2,3 这两个质因子,所以可以预处理出所有合法的 i i i 进行一定的状态压缩。

我们可以通过 SG ⁡ \operatorname{SG} SG 函数预处理出所有的必胜态和必败态。当然,这里不需要严格的 mex ⁡ \operatorname{mex} mex 操作,只要判断是否为必胜态或者必败态即可,这也是大多数 SG ⁡ \operatorname{SG} SG 函数题的套路。

可以发现,当 i + j < n i + j < n i+j<n 并且三种操作中存在一种操作使得操作后的 i ′ + j ′ ≥ n i'+j' \ge n i′+j′≥n,那么我们可以直接进行这个操作,使得数对变为 ( i ′ , j ′ ) (i', j') (i′,j′),这样对手会恰好进行一个 1 1 1 操作,然后输掉游戏。因此,满足上述条件的 ( i , j ) (i, j) (i,j) 为必胜态, f i , j = 1 f_{i, j} = 1 fi,j​=1。

否则,我们模仿 SG ⁡ \operatorname{SG} SG 函数的运算法则,如果三个操作中存在一个操作使得操作后的 ( i ′ , j ′ ) (i', j') (i′,j′) 为必败态,那么我们可以把这个必败态抛给对手。换言之,此时的 ( i , j ) (i, j) (i,j) 为必胜态, f i , j = 1 f_{i, j} = 1 fi,j​=1。

如果上述条件均不满足,那么 ( i , j ) (i, j) (i,j) 为必败态, f i , j = 0 f_{i, j}=0 fi,j​=0。

在 _opt ⁡ \operatorname{\_opt} _opt 函数中,我们每次选择一个必败态,将其抛给对手即可。

代码:

#define MAXN 30005

int cnt, mp[MAXN], seq[MAXN], f[MAXN >> 8][MAXN];

bool Flag = false;

inline void Init(int n)
{
	for(register int i = 1; i < n; i++)
	{
		int t = i;
		while(t % 2 == 0) t /= 2;
		while(t % 3 == 0) t /= 3;
		if(t == 1) seq[cnt] = i, mp[i] = cnt++;
	}
	for(register int yi = n - 1; yi >= 0; yi--)
	{
		for(register int t = cnt - 1; t >= 0; t--)
		{
			int xi = seq[t];
			if(xi + yi >= n) continue;
			if(xi + yi + 1 >= n || xi * 2 + yi >= n || xi * 3 + yi >= n) f[t][yi] = 1;
			else if(!f[mp[1]][xi + yi] || !f[mp[xi * 2]][yi] || !f[mp[xi * 3]][yi]) f[t][yi] = 1;
		}
	}
	return;
}

extern "C" int _opt(int n, int xi, int yi)
{
	if(!Flag) Init(n), Flag = true;
	if(xi + yi + 1 >= n || !f[mp[1]][xi + yi]) return 1;
	if(xi * 2 + yi >= n || !f[mp[xi * 2]][yi]) return 2;
	if(xi * 3 + yi >= n || !f[mp[xi * 3]][yi]) return 3;
}

T o   B e   C o n t i n u e d ⋯ ⋯ \mathit{To~Be~Continued\cdots\cdots} To Be Continued⋯⋯

博弈论 sg函数 对于一个给定的组合游戏,其sg函数G(n)是一个非负整数,用于表示游戏位置n的"输赢状态";两个游戏位置的sg函数值相同,意味着从这两个位置开始,对于任何一个玩家来说,都存在相同的赢或输的策略。 阅读详情

相关推荐

博弈论 随记(SG函数)

博弈论 随记 博弈论 1. 简单博弈     正推/反推。纸上画画直观图(ven图,条形图等),找必胜区间和必败区间。一般此类问题都有同余的必胜点。 HDU4764 /**/ 2. Nim游戏     有若干堆石子,每堆石子的数量ai都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此

Strangedbly 5877

2.18博弈论SG函数

总结来说,SG为0表示当前局面是一个必败态,而非0的SG值表示当前局面是一个必胜态。这是根据博弈论中SG函数的定义和理论推导得出的。自己走的是SG不为0的点,那么对手就必须从这个点开始往下继续走了,而不能重复了必败态的后继状态要么没有,即最底层,要么就是必胜态,因为不能连续走两步,必胜的后面必然是必败;同理,必胜的后面至少得有一个必败态,如果后面都是必胜态的话,那么此时为必败态就是底层叶子结点表示结尾,一定是必败态,往上紧邻的一定是必胜态。

m0_73553411的博客 2712

HDU 1848 浅谈组合游戏博弈论及SG函数MEX推导SG定理

世界真的很大 今天考试考了博弈论,发现对于博弈论除了原版的nim游戏之外就什么都不会了 对于作为其基础的SG函数及定理也是完全不了解,这样是不得行的 要通过不断地刷题,总结,得出一套博弈论的题的做题思路才好 看题先:description:任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n

BerryKanry的博客 2169

sg函数(博弈论)

sg函数

m0_50597984的博客 703

博弈论 | 详解搞定组合博弈问题的SG函数

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天这篇是算法与数据结构专题的第27篇文章,我们继续深入博弈论问题。今天我们要介绍博弈论当中非常重要的一个定理和函数,通过它我们可以解决许多看起来杂乱无章的博弈问题,使得我们可以轻松地解决一大类博弈问题。 有了SG函数和SG定理,我们不再是单纯地通过构思、分析和找规律去解决问题了。并且我们之前学过的巴什博奕、威佐夫博弈以及Nim博弈都可以使用SG函数来解决,相当于我们找到了这一大类问题的通解。下面,我们来看几个基本定理和基本概念。 基本定理

TechFlow的博客 847

kaggle项目:纽约出租车行程时间NYC Taxi Trip Duration

纽约出租车形成时间预测(NYC Taxi Trip Duration)是Kaggle中的一个Playground竞赛。比赛数据集基于2016年纽约市黄色出租车行程记录数据,需要建立一个模型,根据单个行程属性,预测测试集中每次行程的持续时间。Kaggle项目模型XGBoost,评价指标RMSLE。

weixin_42113929的博客 2790

博弈论之数学理论学习笔记

学习笔记] (博弈论)Nim游戏和SG函数_nim博弈-优快云博客后面二、三有完全转载情况,主要是迫不及待去刷题了。

2401_87338545的博客 1191

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1091

博弈论-SG函数和SG定理

1.SG函数和SG定理是一个十分神奇的东西,有了它,绝大部分的博弈都可以被统一到这个上面,都可以使用SG函数解决。是一种解决博弈问题的十分方便的手段。 2.首先给出一些基本的定义:mex运算,这个是作用在集合上的运算,具体的含义就是:找出不属于当前集合最小的非负整数,可能你有点晕,我们看几个例子。mex{1,2,3}=0;为什么?因为自然数从0开始,不属于这个集合最小的非负整数就是0了,再例如m...

YG爱木木 3568

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

【浅读论文-红外和可见光图像融合-CNN】Infrared and Visible Image Fusion using a Deep Learning Framework

1.这篇是2018年ICPR会议上发表的一篇文章1。博主个人觉得这算比较早期在VIF(红外光和可见光图像融合)中加入了深度学习这一模型的论文。2.这篇文章并不是完全使用深度学习的模型,模型主体在图像分解和融合仍然采用传统的方法,只有其中一个分支在特征提取和重建方面用到了VGG网络。3.论文地址4.代码地址本文提出了基于深度学习框架的一种新算法。本文提出使用下述论文中Image fusion with guided filtering2中的分解方法将源图像分解为基本部分和细节内容。

一枚博鼠的博客 1708

博弈论——SG函数

有向图游戏,SG函数,SG定理

m0_73693552的博客 503

RAG系统中Reranker模型选型实战

本文详细介绍了RAG系统中Reranker模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Reranker模型API

herosunly的博客 17万+

博弈论详解 2(SG函数 和 SG定理)

博弈论详解后续,对通用的必胜策略和必胜条件进行分析,深入了解博弈论

2401_84512298的博客 2574

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3008

生物分子仿真软件:AMBER_(17).AMBER在核酸研究中的应用

在使用AMBER进行核酸分子动力学模拟之前,需要对核酸系统进行详细的准备。这包括构建初始结构、添加溶剂分子、中和电荷等步骤。以下将详细介绍这些步骤。

kkchenjj的博客 504

博弈论-SG函数

学习博弈论不得不提一哈SG函数 关于SG函数的一些概念就不多说了 说下我自己的理解 SG函数记录为0的是P状态 不为0记录的是N状态 也是相当于有个周期再循环 P N状态轮番出现 SG模板 #include<iostream> #include<cstring> #include<algorithm> #define maxn 1000 using nam...

Stydwn的博客 641

【软考】数据库系统工程师备考指南(一)

目录一、数据库系统工程师简介二、考试要求三、考试目标四、考试范围(一)信息系统知识(二)数据库系统设计与管理 一、数据库系统工程师简介 数据库系统工程师考试属于全国计算机技术与软件专业技术资格(水平)考试(简称计算机软件水平资格考试)中的一个中级考试。考试不设学历与资历条件,也不论年龄和专业,考生可根据自己的技术水平选择合适的级别合适的资格,但一次考试只能报考一种资格。考试采用笔试形式,考试实行全国统一大纲、统一试题、统一时间、统一标准、统一证书的考试办法。笔试安排在一天之内。 2022 年数据库系统工程

邓邓子的博客 3859

博弈论之sg函数

对于双堆的Nim游戏,设sg(n,m)表示剩余石子数分别为n和m的状态的sg值,则sg(0,0)=0,并且sg(n,0)=sg(0,n)=n。我们发现sg(1,1)=0,而sg(1,2)=sg(2,1)=1,sg(2,2)=0……继续探索可以猜测,当n=m时,sg(n,m)=0,否则sg(n,m)≠0。设sg(m)表示剩余石子数为m的状态的sg值,则显然sg(0)=0,那么sg(1)=1,sg(2)=2……归纳可证sg(n)=n。

imlsp12356的博客 1156

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

博弈论之SG函数——杨子曰数学

博弈论之SG函数——杨子曰数学 首先,我们要知道一个运算——mex(S) 表示的就是不属于集合S的最小的自然数 比如:mex(0,1,4,5)=2mex({0,1,4,5})=2mex(0,1,4,5)=2,mex(2,3,5)=0mex({2,3,5})=0mex(2,3,5)=0之类的 然后你还要知道几个博弈论中应该知道的东西: 一个状态的后继状态,指的是通过一个操作可以从当前状态达到的...

杨子曰:代码是神奇的 602

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

博弈论SG函数

参考: http://www.cnblogs.com/ECJTUACM-873284962/p/6398385.html http://www.cnblogs.com/ECJTUACM-873284962/p/6921829.html 巴什博奕 只有一堆石子,每个人可以从里面取1~m个石子,先取光者胜。 当 n=m+1n = m+1n=m+1先手必败,因为先手无论选什么,都会使其个数小于m。 因...

Link_Ray的博客 723

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

博弈论与SG函数

巴什博奕: 两个顶尖聪明的人在玩游戏,有n个石子,每人可以随便拿1−m个石子,不能拿的人为败者,问谁会胜利 结论: 设当前的石子数为\(n=k∗(m+1)\)即\(n%(m+1)==0\)时先手一定失败 HDU1846 #include<iostream> using namespace std; int main() { int C,N,M; scanf("...

agtvo48266的专栏 182

博弈论基础知识与SG函数

博弈论入门简介要素博弈的类型1.合作博弈 和 非合作博弈2.静态博弈 和 动态博弈3.完全信息博弈 和 不完全信息博弈纳什均衡经典案例一经典案例二四大博弈模型一、巴什博弈二、尼姆博弈 ※SG函数三、斐波那契博弈四,威佐夫博弈SG函数 简介 博弈论,又称为对策论(Game Theory)、赛局理论等。博弈论主要研究公式化的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。 博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。 要素 1.局中人:在一场竞赛或博弈中,每一个有决策权

Lunar Arc的博客 3356

博弈论SG函数入门(HDOJ Java)

通过近几天的学习,对博弈论的入门有一个基本的认识,这里附上做的两道题以及相应的Java AC代码,供读者参考。 另外还有一篇非常值得参考的帖子 非常详细的说明SG函数的相应求法:https://blog.youkuaiyun.com/strangedbly/article/details/51137432 第一题 hdoj 1847 非常简单的SG函数求解 Good Luck in CET-4 E...

BodyCsoulN的博客 567
上一篇: 整除和同余相关理论
下一篇: 线性空间和OI中的线性基
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值