【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并

这篇具有很好参考价值的文章主要介绍了【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇文章我们讲了两种经典的博弈模型:《【ACM博弈论】SG函数入门(1):从巴什博奕到尼姆游戏》,这一节我们开始讲解SG函数。

🎈 作者:Eriktse
🎈 简介:19岁,211计算机在读,现役ACM银牌选手🏆力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)🚀
🎈 阅读原文获得更好阅读体验:https://www.eriktse.com/algorithm/1111.html

在了解SG函数之前,我们需要知道博弈图。

博弈图

就比如Bash博弈,当n=7,m=3时,我们可以画出如下的博弈图。

我们可以发现,每一个点都有至多2个后继状态(即出点),这个是可以通过Bash推出来的。

其他博弈题大多也可以类似的推出一个这样的图。

SG函数

SG函数可以理解为一个用于表示博弈图中节点状态的一个函数。同时sg(x) = n还表示节点x的出点构成一个集合{y | 0 <= sg(y) <= n - 1},也就是说x可以到达所有sg小于它自己的sg的点。

就比如上图,我们规定必败态的sg = 0,必胜态的sg != 0。于是我们可以知道sg(0) = 0,然后往回推。

sg函数转移方程

\[sg(x) = mex({y | y \in out[x]}) \]

说人话就是x的sg是其所有出点的sg构成的集合做mex运算,mex表示集合中最小的没出现过的自然数

代码一般为:

int mex(set<int>& st)
{
	for(int i = 0;; ++ i)
		if(st.find(i) == st.end())//如果找不到i
			return i;
}

于是我们可以推出上面这个博弈图的所有点的sg函数。

注意是根据所有出点推出当前点,只有所有出点都确定了,当前点的sg才能确定,有点像建反图然后topo,但是一般我们会直接写一个记忆化搜索然后打表找规律。在处理带环的图时需要具体情况具体分析。

上面这张图我们很容易找出规律,就是0 1 2 0 1 2....

子游戏的合并

Nim定理:全局结果等于子游戏SG的异或和。

我们昨天学过Nim博弈,他是有n堆石子,每次可以选一堆拿走若干个。那么我们可以将子游戏看做是一堆石子每堆石子的个数是 (sg) 个,然后取走若干个石子类比为将sg转移到更小的sg

现在我们就可以解决一些抽象的博弈问题了。

做题一般思路

一般是三步:找出SG转移方程,打表找规律,子游戏合并。

为什么需要打表找规律呢,因为一般题目给的数据会很大,且一般会有较强的规律性,打表找到规律就行无需证明,证明对于竞赛来说太奢侈了,而且没太大意义。

例题:AtCoder Beginner Contest 297 - Constrained Nim 2

先写一个_sg()函数用于打表:

int _sg(int x)
{
	if(x == 0)return 0;
	set<int> st;
	for(int i = max(0ll, x - r);i <= x - l; ++ i)st.insert(_sg(i));
	for(int i = 0; ; ++ i )if(st.find(i) == st.end())return i;
}

我们随机输入一些数据,打个表,得到如下结果:


我们发现这个在l,r给定的情况下,sg(x)的值非常有规律,可以用下面这个表达式直接表达:

int sg(int x)
{
	return x % (l + r) / l;
}

最后把所有子游戏的sg异或起来就是最终答案。

AC代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 9;

int a[N], l, r;

int sgk(int x)
{
	if(x == 0)return 0;
	set<int> st;
	for(int i = max(0ll, x - r);i <= x - l; ++ i)st.insert(sgk(i));
	for(int i = 0; ; ++ i )if(st.find(i) == st.end())return i;
}

int sg(int x)
{
	return x % (l + r) / l;
}

signed main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	int n;cin >> n >> l >> r;
	for(int i = 1;i <= n; ++ i)cin >> a[i];
	// for(int i = 0;i <= 20; ++ i)
		// cout << "sg(" << i << ") = " << sgk(i) << " = " << sg(i) << '\n';
	int ans = 0;
	for(int i = 1;i <= n; ++ i)ans ^= sg(a[i]);
	if(ans)cout << "First" << '\n';
	else cout << "Second" << '\n';
	
	return 0;
}

🎈 本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞👍、收藏⭐、留言💬文章来源地址https://www.toymoban.com/news/detail-410548.html

到了这里,关于【ACM博弈论】SG函数入门(2):博弈树SG函数的转移与子游戏的合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习笔记】博弈论 ---- 非偏博弈

    本篇按照 Qingyu 在省集讲的加入我这个萌新的萌新理解而成。 听了 Qingyu 的博弈论讲解,感觉我之前学过的博弈就是冰山一角。 由于有一些东西没听懂,就主要写写我听懂的部分,没懂得以后再说吧。 所以这篇只是一个入门,关于博弈的一些习题可能会咕咕咕。 几个基本定

    2024年02月07日
    浏览(56)
  • 博弈论 | 斐波那契博弈

    博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到

    2024年02月12日
    浏览(43)
  • 汤姆·齐格弗里德《纳什均衡与博弈论》笔记(7)博弈论与概率论

    第十一章 帕斯卡的赌注——博弈、概率、信息与无知 在与费马就这个问题的通信过程中,帕斯卡创造出了概率论。另外,帕斯卡在进行严谨的宗教反思中,得出了 概率 这个概念,它在此几百年后,成为一个关键的、对博弈论的提出有重要意义的数学概念。 帕斯卡观察到,

    2024年01月25日
    浏览(52)
  • 博弈论-策略式博弈矩阵、扩展式博弈树 习题 [HBU]

    目录 前言: 题目与求解 11.请将“田忌赛马”的博弈过程用策略式(博弈矩阵)和扩展式(博弈树)分别进行表示,并用文字分别详细表述。 34.两个朋友在一起划拳喝酒,每个人有4个纯策略:杠子、老虎、鸡和虫子。 输赢规则是:杠子降老虎,老虎降鸡,鸡降虫子,虫子降

    2024年02月03日
    浏览(49)
  • 【博弈论笔记】第二章 完全信息静态博弈

    此部分博弈论笔记参考自经济博弈论(第四版)/谢识予和老师的PPT,是在平时学习中以及期末备考中整理的,主要注重对本章节知识点的梳理以及重点知识的理解,细节和逻辑部分还不是很完善,可能不太适合初学者阅读(看书应该会理解的更明白O(∩_∩)O哈哈~)。现更新到

    2024年02月10日
    浏览(51)
  • Nim游戏博弈论

    https://www.luogu.com.cn/problem/P2197 甲,乙两个人玩 nim 取石子游戏。 nim 游戏的规则是这样的:地上有 n n n 堆石子(每堆石子数量小于 1 0 4 10^4 1 0 4 ),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了

    2024年02月15日
    浏览(47)
  • 博弈论算法常见模型整理

    本文主要介绍算法竞赛中常常出现的博弈论模型,包括: 4个经典组合游戏 SG函数 SG游戏及拓展 进一步学习需要了解一些前置概念 ICG 博弈图 P点、N点 mex函数 1.ICG ICG全称为“公平组合游戏”,我们下面讨论的博弈游戏均建立在ICG的基础上,那么什么是ICG呢,它需要满足以下条

    2023年04月26日
    浏览(44)
  • 博弈论小课堂:零和博弈(找到双方的平衡点)

    从概率论延伸出来的课题——博弈论,博弈论中最典型的两大类博弈,是“零和博弈”与“非零和博弈”。博弈论所研究的最优化问题有多方参与,因此最优化的策略要考虑对方的行为。 博弈论通常被认为是冯·诺依曼发明的,博弈论从本质上讲,是一套解决最优化问题的方

    2024年02月09日
    浏览(45)
  • 台阶型Nim游戏博弈论

    https://www.acwing.com/problem/content/894/ 现在,有一个 n n n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i i i 级台阶上有 a i a_i a i ​ 个石子( i ≥ 1 i ge 1 i ≥ 1 )。 两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。 已经拿到

    2024年02月14日
    浏览(43)
  • 基于博弈论的频谱分配(MATLAB实现)

    代码: 结果:

    2024年01月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包