对SG函数(Sprague-Garundy函数)及其应用的简单解释与证明
前置知识:Nim博弈(还没接触过的可以顺便学一学把模板题做了,本文求简洁,不再解释此知识)
参考文章:博弈论 SG函数(需要更详细的解释的可去此处)
正文:
提出问题:给定多个有向无环图,每个图有一个起始顶点,起始顶点上有一枚棋子,两名选手交替地选择一个图将其上的那枚棋子沿有向边进行移动,无法移动者判负。
接下来分析一个图的情况:
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继 }。
我们令各个结点x的值为g(x)。 例如:
可推得g(x)有如下性质:
(1)当g(x)=0,其后继结点都非0;
(2)当g(x)>0,其后继结点中都存在所有0~g(x)-1的点;
起始结点为0的情况,先手将使棋子走向一个非0结点,则后手必能使棋子继续走向一个为0的结点。先手者无可奈何,无法使棋子结点值改变。
(若先手必胜,先手不必在这里走;若后手必胜,先手也无法改变什么,局势尽在后手掌握之中。于是该情况可以不予理会了。)
起始结点为k(k>0)的情况,先手能使棋子走向0 ~ k-1值任意一个结点。
(如果存在值大于k的后继结点,先手走向该后继结点结点后,后手能继续走向该后继结点的一个值也为k的后继结点,所以先手者无法使棋子结点值变大,只能使其走向0 ~ k-1值的结点。若先手必胜,不会走大于k的点;若后手必胜,先手也无法改变什么,局势尽在后手掌控之中。于是该情况可以不予理会了。)
即可转化为Nim博弈问题,从k个石子的堆里取石子,使堆中石子数变为0~k-1。
`Conclusion(Nim博弈):记每个堆的初始结点值为t(i),则if t(1)^t(2)^...^t(x) = 0 : 先手必败; else 先手必胜`;
此类似问题都可用SG函数解决,其实际上是个解决问题的工具。
对SG函数(Sprague-Garundy函数)及其应用的简单解释与证明相关推荐
- Excel函数词典(483个函数说明 Excel函数公式Excel小技巧
Excel函数词典(483个函数说明 Excel函数公式Excel小技巧 函数 类别 属性 新函数 说明 语法 BETADIST 兼容性函数 被替换 BETA.DIST 返回累积 beta 概率密度函 ...
- render函数和redirect函数的区别+反向解析
render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象) request对象:----->所有的请求 ...
- Python day10 global关键字、函数递归、匿名函数、map函数的用法详解
1.global关键字 引用全局变量,在局部全局变量改变,也会改变,global相当于指针,将地址指向全局变量的name name='littlepage'def littepage():global ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]
1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...
- Go 学习笔记(15)— 函数(01)[函数定义、函数特点、多值返回、实参形参、变长参数,函数作为参数调用]
1. 函数定义 Go 语言最少有个 main() 函数.函数声明告诉了编译器函数的名称,返回类型和参数. func funcName(parameter_list)(result_list) {fun ...
- MySQL 学习笔记(3)— 字符串函数、数值函数、日期时间函数、流程函数、聚集函数以及分组数据
1. 字符串函数 MySQL 的常用函数包括字符串函数.数值函数.日期时间函数.流程函数等. SELECT ascii("abc"),char(97),concat("h ...
- 经常可能会用到的【函数节流和函数防抖】记录下,做下区分
今天突然被人问到,函数节流和函数防抖的区别是什么, 结果我脑子一热直接举了个滚动条的粟子说是优化高频率执行的手段,就记得自己是用setTimeout来实现的. 完了区别是什么??哪个是哪个都蒙B了 回 ...
- c语言随机数生成0 99函数,C语言生成随机数的函数、延时函数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面C语言代码使用了生成随机数的函数.延时函数.请大家仔细观察其显示效果. 从以下代码,我们可以得出一个重要的结论:当上述两类函数被放入循环时,应作出一定 ...
最新文章
- 安装 Windows8 后值得做的十多项简单优化,让Win8速度快上加快!
- DirectFB实例1--加载一幅图片
- 原生Android12,Android 12原生设计曝光 网友看了惊呼神似iOS
- [云炬创业管理笔记]第四章把握创业机会测试3
- CentOS7服务去Nginx使用-安装
- 二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
- leetcode167. 两数之和 II - 输入有序数组(二分查找)
- swagger2如何测试单个文件或者多文件上传
- PLSQL 循环游标 cursor loop fetch into
- 用C#编写一个进程外的COM组件示例代码讲解
- python sorted list 元组 多列排序
- 土壤有机质空间分布数据
- android 高德amap开发一(地图创建)
- CAD/CAM编程排料软件提高钣金制造业竞争力
- matlab线性规划系列之基础解题
- Windows,Ubuntu双系统卸载ubuntu(记录)
- 快捷指令 python_有没有硬核的iOS快捷指令推荐(实用性)?
- 风变编程python离线版_如何看待风变编程的Python网课
- Java 性能调优 (JVM CPU IO Memery)
- python爬取京东一款手机的评论