博弈论(Nim游戏、有向图游戏之SG函数)
这里写目录标题
- 经典NIM游戏
- Nim游戏属于公平组合游戏ICG
- 有向图游戏(SG函数)
- Mex运算
- SG函数
- 单个有向图(一堆石子)
- 求SG值(记忆化递归)
- 有向图游戏的和 ,(多个有向图(多堆石子)
- 模板题 AcWing 893. 集合-Nim游戏
- 练兵时间到(习题集)
- game(取后可分为两堆 (x^y<=x+y)
- S-Nim + sg函数+博弈+模板(vis数组代替set
- Nim or not Nim?取*或* 分成两堆
- A New Stone Game
- 从最小最简单的情况搞起
- 分析:
- Georgia and Bob
- 思路一:阶梯Nim
- 思路二:SG函数实现n-Nim
- 思路三:普通取数Nim
- JZOJ4178【NOI2015模拟YDC】游戏(阶梯nim游戏)
- jzoj 4024 石子游戏 {筛素数+博弈论(NIM博弈/SG函数)}
- 内存分区
- 待学
- 参考
经典NIM游戏
模板题 AcWing 891. Nim游戏
给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。
我们把这种游戏称为NIM博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取何种行动,都会输掉游戏,则称该局面必败。
所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对面面临必败局面,则优先采取该行动。同时,这样的局面被称为必胜。我们讨论的博弈问题一般都只考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。
NIM博弈不存在平局,只有先手必胜和先手必败两种情况。
定理: NIM博弈先手必胜,当且仅当 A1 ^ A2 ^ … ^ An != 0
Nim游戏属于公平组合游戏ICG
若一个游戏满足:
- 由两名玩家交替行动;
- 在游戏进程的任意时刻,
- 可以执行的合法行动与轮到哪名玩家无关; 不能行动的玩家判负;
则称该游戏为一个公平组合游戏。
NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。
有向图游戏(SG函数)
给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。
(以当前局面作为图中的一个节点,由当前局面可以到达的局面作为当前节点的后继节点,那么整体就可以形成一个图的结构,这样的一个公平组合游戏就形成了一个“有向图游戏”。)
Mex运算
设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,即:
mex(S) = min{x}, x属于自然数,且x不属于S
SG函数
在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,…,yky_1, y_2, …, y_ky1,y2,…,yk,定义SG(x)为x的后继节点 y1,y2,…,yky_1, y_2, …, y_ky1,y2,…,yk 的SG函数值构成的集合再执行mex(S)mex(S)mex(S)运算的结果,即:
SG(x)=mex(SG(y1),SG(y2),…,SG(yk))SG(x) = mex({SG(y_1), SG(y_2), …, SG(y_k)})SG(x)=mex(SG(y1),SG(y2),…,SG(yk))
特别地,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数值,即SG(G)=SG(s)SG(G) = SG(s)SG(G)=SG(s)。
单个有向图(一堆石子)
定理
有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。
有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。
如上图所示,当仅有一堆石子时,如果SG(初始局面对应的点)≠0,先手必胜,为零则必败
原因:
SG值经过了Mex运算,倘若SG(s)不为0,s所有的后继局面对应的点之中,必定有一点SG值为0,
当走到SG值为0的这一点时,根据Mex运算,该点所连接的所有点的值中一定不存在SG值为0的后继局面,只要先手面对的局面的SG值不为0,如此往复,先手一定会走到最后的终点(终止状态的SG的值定义为0)
- 终止状态的SG的值定义为0
- SG值为0的点为必败态,它的后继节点中不存在SG值为0的点
- SG值非0的点为必胜态,它的后继节点中存在一点SG值为0
求SG值(记忆化递归)
#include <set>
const int N=105;
const int M=10005;
int k;
int s[N];//选取数的集合
int n,v;
int f[M];//记忆化递归,记录每个有向图当下局面的SG值
//f存储的是所有可能出现过的局面的sg值,
//因为每个局面的SG值都要由她所有后继局面的SG值决定
int SG(int x){if(f[x]!=-1)return f[x];
//每个局面的sg值都是确定的,如果存储过了,直接返回即可set<int> S;
//只针对当下一个局面,存放这个局面的若干后继局面
//每个局面都会新定义一个set集合 for(int i=0;i<k;i++){//枚举每一个可能的后继局面,把后继局面的SG值放到x对应的set集合中 int ss=s[i];if(x>=ss){S.insert(SG(x-ss));
//先延伸到终点的sg值后,再回溯得出所有数的sg值
//记忆化递归,先求出终点sg值,再从后往前}}for(int i=0;;i++){//选没有出现在 x的后继局面的SG值中的 最小自然数 if(S.count(i)==0){f[x]=i;return f[x];}}
}
有向图游戏的和 ,(多个有向图(多堆石子)
设G1, G2, …, Gm 是m个有向图游戏。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。G被称为有向图游戏G1, G2, …, Gm的和。
有向图游戏的和的SG函数值等于它包含的各个子游戏SG函数值的异或和,即: SG(G) = SG(G1) ^ SG(G2) ^ … ^
SG(G_m)
证明:(同Nim游戏)
1.终止状态为异或和为0的局面,显然是先手必败局面(当最终每一堆石子都无法操作时,每一堆的SG值为0),满足SG定理
2.由各个有向图当下局面的SG异或和不为0,采取类似Nim游戏中的最佳决策,一定可以到异或和为0的状态
异或和x不为0,x必定存在最高位(第k位)的1,必定存在第k位为1的SGi,SGi > SGi ^ x, 让SGi 变为 SGi ^ x
小于SGi的非负整数都属于SGi的后继节点
3.由异或和为0的状态只能到达异或和不为0的状态
本着最佳决策,面对异或和非零的局面,理应在第i个有向图中,将状态由SGi转到 SGi ^ x (各有向图的异或值)从而把异或和为0的局面抛给对手,
可是,对于以下解释,我没懂为啥,将SGi移动到SG值更大的节点 SGi’ 时,另一方一定可以找到和 SGi’相等的另一个有向图且有着SGi 的后继状态???
模板题 AcWing 893. 集合-Nim游戏
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
#include <set>
const int N=105;
const int M=10005;
int k;
int s[N];//选取数的集合
int n,v;
int f[M];//记忆化递归,记录每个有向图当下局面的SG值
//f存储的是所有可能出现过的局面的sg值,
//因为每个局面的SG值都要由她所有后继局面的SG值决定
int SG(int x){if(f[x]!=-1)return f[x];
//每个局面的sg值都是确定的(因为对于确定的石子数,可取的方案只有S数组中存的那几种,石子数相同的状态后续局面一定完全相同,对应的SG值一定相同,如果存储过了,直接返回即可
//
博弈论(Nim游戏、有向图游戏之SG函数)相关推荐
- [博弈论] Nim游戏及SG函数(经典+台阶+集合+拆分)
文章目录 0. 前言 1. Nim 游戏+模板题 2. 台阶 - Nim 游戏+变种题 3. Mex运算与SG函数 4. 集合 - Nim 游戏+变种题 5. 拆分 - Nim 游戏+变种题 0. 前 ...
- 博弈论 Nim游戏与SG函数
普通Nim游戏: 有若干堆石子,两人轮流从中取石子,取走最后一个石子的人为胜利者 我们判断先手必胜还是先手必败就要判断先手面对的局面是必胜态还是必败态 并且普通Nim游戏满足以下性质: 1.无法移动的 ...
- 【数论】博弈论 —— nim游戏
知识点 一 . nim游戏的数学定义 Nim游戏是博弈论中最经典的模型,它又有着十分简单的规则和无比优美的结论 . Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于 ...
- #194-[树链剖分,博弈论] Nim游戏
Description 著名游戏设计师ljh,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策 ...
- 博弈论 ----- Nim游戏
题目: 结论: 假设有三堆石子{3, 4, 5}, 每堆石子分别有3.4.5个石子 把3.4.5分别转为二进制:011.100.101 对011.100.101取异或(对位相同取0,相异取1),011 ...
- Nim游戏入门+SG函数
对于经典的Nim游戏,只需要把每一堆初始状态都异或起来,最后得到的结果非0的为必胜状态,结果为0的为必败状态. 原理:异或的结果非0的状态总能通过一次取物品操作,将此状态转化为结果为0的状态:而异或结 ...
- 题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)
前言 比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ 和dummyummy巨佬一起推了快三个小时的规律 最后去问了真正的巨佬__stdcall __stdcall面带微笑的告诉我们,这是 ...
- NIM数字游戏 SG函数 有向图博弈 学习记录
写在前面:很早之前我就想写一写博弈论的学习记录了.本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所 ...
- 博弈论sg函数——《移旗子游戏》《剪纸游戏》
传送门:移棋子游戏 思路:按照sg函数定义,在这道题里面,不能移动的状态就是终点态,sg值设为0,其余所有的点的sg函数值就是属于其所有后继节点的sg函数值组成的集合里面非集合元素的最小的一个数字,也 ...
最新文章
- mysql8 my 010457_分享一下我在mysql5.6+mysql8数据库安装过程中的一些坑!
- poj3041--Asteroids(二分匹配)[将矩阵行列转化为边]
- Map、Set、List简介
- 成功解决AttributeError: module 'tensorflow' has no attribute 'scalar_summary'
- 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
- 【POJ - 1651】Multiplication Puzzle(区间dp)
- 唐刘之辩:行业知识图谱的schema构建的难点、重点与困惑
- HashSet存储元素保证唯一性的代码及图解
- 《程序设计与数据结构》实验2报告
- Linux环境下实现简单进度条
- 【心里效应】98 个著名的心理效应
- Ubuntu 12.04 设置终端字体为文泉驿
- java文件上传判重姿势浅谈
- git新建账号_Git的安装以及注册账号等操作
- linux 下 scp 的用法
- python已知两条直角边求斜边_Python实现已知三角形两直角边,求斜边--思路,伪代码,优化...
- 2、通过mos管构成的逻辑门电路
- stm32专题二十五:基本定时器原理
- 解决Mac互联网连接问题的方法
- Ubuntu怎么切换为中文版
热门文章
- 爬取豆瓣电影剧情片排行榜
- 2019.01.17【BZOJ4399】 魔法少女LJJ(FHQ_treap)(ODT)
- 数据分析-前置条件(采集、存储、治理)
- 地理信息系统专业考研 GIS专业考研 名词解释大全[转]
- 【Unity】NGUI/UGUI 小地图制作
- ubuntu下命令行输入 sudo: ./xxx.sh:找不到命令
- alc236黑苹果驱动_黑苹果核心显卡驱动教程
- 关于Inter CPU的一些认识
- android 复制asset文件下文件到手机指定路径,手机根目录
- C++各种运行时错误