写在前面:很早之前我就想写一写博弈论的学习记录了。本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所以我是从NIM游戏这个例子开始的。

Nim游戏

Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下为ICG)。

条件

满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素; 4、如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。

以上内容来自百度百科

简单的一个Nim游戏的例子:

现在共有N堆石子,每堆石子分别有a1,a2,a3...an个,现在两名玩家轮流取石子,一次可以取一堆石子当中的任意数量(可以取完,但不能不取),无法取走石子时,当前玩家判负。

比方说:

现在有:   1 2 3这三堆石子,甲 乙 两名玩家,甲先手

甲可以直接取完第一堆石子,乙取完第二堆,然后甲再取完第三堆。乙不能取,判负。

甲可以直接取完第一堆,但乙只取第二堆中的一个,甲再取第三堆中的两个,乙这是只能取走两堆当中的任意一个,甲取走最后一个。乙不能取,判负。

解决办法:

将每堆石子用二进制表示:如3 7 5 6表示为 0011 0111 0101 0110四个数字

然后将它们异或起来:

0011^0111^0101^0110=0111

假设所有石子都取完了,那么他们异或起来为:

0000^0000^0000^0000=0000

对于0011^0111^0101^0110=0111这种情况,如果能够通过一种取法,使得剩下的所有数异或起来等于零,而且对于所有数异或起来不为零这种情况,只要取,就一定会变成异或起来不为零的情况,那么我就是必胜的。

                   你在说什么?

意思就是:我的回合,在当前局面下,我可以留给你一个异或起来等于零的局面,而你不能给我留一个异或起来等于零的局面,那么在值逐步减小的回合当中,留给你的只能是每堆石子都为0的局面。

接下来就是怎么去证明对吧:

设当前局面为a1,a2,a3...an。且a1^a2^...^an=x(异或起来不为0的情况),其中最大值为ai

那么原式可表示为ai^y=x。此时,x和ai的最高位肯定都为1,那么ai^x肯定小于ai,那么我们一定可以用一种取法,使得ai变成ai^x,则取走石子之后,当前局面异或和为0。

若a1^a2^a3^...^an=0

那么无论取走任意一堆的任意数量,都会带来当前这堆石子数量二进制的位的改变,从而导致全局异或起来不为0

那么久满足了我们之前所说的条件,从而得到结论:

对于任意一个局面A{a1,a2,a3,a4,...,an}若a1^a2^a3^...^an的值不为零,则先手必胜

若a1^a2^a3^..^an的值为零,则先手必败。

我们再在这个简单粗暴的结论上衍生一下:

SG函数(Sprague-Grundy

我们定义一个对于集合的操作mex,这个操作要找到最小的不属于该集合的非负整数。 
如:mex{0,1,2}=3,mex{1,2,3}=0,mex{0,1,3}=2;

那么定义SG(x)=mex(S),其中S是x的后继状态的集合。

对于NIM游戏的任意一堆,把它视作一个独立的游戏,那么对于一个数量为10的石子堆来说,它的后继状态有{0,1,2,...,9}共10种(不能不取石子),那么SG(a10)=10,

SG定理

 游戏和的SG函数等于各个游戏SG函数的Nim和。

证明:同NIM游戏相同,当每个单独游戏的函数值为0时,当前局面为必败局面,所以SG函数的异或和为0

因为S是当前游戏的后继状态集合,那么小于SG函数的任意值都可以通过一种方式去得到。

如:NIM游戏当中,对于10这个单独游戏来说,后继状态为从0到9,都可以通过一种取法得到。

SG函数和NIM游戏可以具有相同的失败或胜利条件,就可以用NIM游戏相同的办法去证明SG定理。

SG定理的应用

有向图博弈:

在一个有向图中,有n枚棋子,两名玩家轮流移动棋子一次,一次能移动任意一个棋子的一步,无法移动的人判负。

看起来在有向图当中,SG函数不是那么好定义了

设有向图终点的状态为0,那么倒着来处理获得每个点的后继状态集合(这难道是。。。拓扑排序!!!)

也就是用拓扑排序从终点开始,逆着有向边进行拓扑排序,当前结点出队时,便可计算这个结点的SG函数值了。

对于一个有向图博弈的局面,只需要用拓扑排序求出当前局面所有棋子的SG函数,再根据SG定理,就可以知道这个局面是必败还是必胜了。

NIM数字游戏 SG函数 有向图博弈 学习记录相关推荐

  1. 组合博弈游戏 - SG函数和SG定理

    转载来自:http://blog.csdn.net/luomingjun12315/article/details/45555495 在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜 ...

  2. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正 ...

  3. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  4. “科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 G 硬币游戏Ⅲ SG函数 /Mutli-SG 游戏 终于补完了……

    这题是Mutli-SG 的变形. 本质还是SG函数. 不考虑算法复杂度来看: 每个局面的SG值等于只有一个硬币的SG值的异或和. 我们这样想:把长度为n的字符串当成n堆石子. 从左往右第i位为1表示第 ...

  5. Unity游戏优化(第2版)学习记录8

    Unity游戏优化[第二版]学习记录8 第8章 掌握内存管理 一.Mono平台 1.垃圾回收 2.内存碎片 3.运行时的垃圾回收 4.多线程的垃圾回收 二.代码编译 三.分析内存 1.分析内存消耗 2 ...

  6. 剪纸游戏 (SG函数)

    给定一张N*M的矩形网格纸,两名玩家轮流行动. 在每一次行动中,可以任选一张矩形网格纸,沿着某一行或某一列的格线,把它剪成两部分. 首先剪出1*1的格纸的玩家获胜. 两名玩家都采取最优策略行动,求先手 ...

  7. bzoj4600 [Sdoi2016]硬币游戏 sg函数+结论

    sg[maxQ][二的次数][三的次数]=前面的都是正面的胜负状态 C不一样的相互独立 首先顺序是不重要的,因为他有一个模仿关系. 比如   9,3是0    必胜策略是 选9翻9 .3 由于是异或, ...

  8. 笨方法学习Python 习题19 函数和变量 ---学习记录

    习题19 函数和变量 #定义cheese_and_crackers函数,参数有括号里的俩 def cheese_and_crackers(cheese_count,boxes_of_crackers) ...

  9. 1588 数字游戏(LOJ10166) 暴力0分 需要记录中间数据的数位DP

    总目录 在线测评地址(ybt) 在线测评地址(LOJ) 1.暴力0分 ybt 未通过 测试点 结果 内存 时间 测试点1 答案错误 612KB 2MS LOJ 暴力0分代码如下: #include & ...

最新文章

  1. python 空dataframe_python 创建一个空dataframe 然后添加行数据的实例
  2. Cell | 分子胶水的兴起
  3. [Spring 深度解析]第1章 Java基础
  4. ubuntu 安装eclipse neon版本
  5. SMMU学习这一篇就够了
  6. 初学者用pycharm创建一个django项目和一个app时需要注意的事项
  7. C语言程序设计 C语言中的时间函数
  8. Java对象的序列化和反序列化(转)
  9. JMeter 入门脚本以发送百度请求为例
  10. Summer training round2 #10(Training 30)
  11. 使用 ADB LogCat 查看在Android真机上 Unity debug.log 输出日志
  12. python动画精灵_【python游戏编程之旅】第六篇---pygame中的Sprite(精灵)模块和加载动画...
  13. ORA-03113:通信通道的文件结尾-完美解决方案
  14. 斗地主系列之牌型大小比较
  15. 电脑如何去除视频水印?
  16. flash rpg网页游戏的成本
  17. JavaScript 教程「2」:注释、输入输出、变量
  18. 基于K-Means的文本聚类
  19. 原始socket实现局域网ARP欺骗
  20. WinIo驱动级键盘模拟编程

热门文章

  1. 【在线应用】篇四:森林砍伐在线遥感监测系统,宏观掌控植被流失量
  2. android10 网络连接受限,移除蓝牙限制 Windows 10 与 Android 手机于同一网络就可连接...
  3. 华春莹、赵立坚纷纷转发的数字人是谁?
  4. 南邮计算机学院在哪里,南邮计算机学院 | 手游网游页游攻略大全
  5. 海洋科学导论ppt_利用开放数据科学保护世界海洋
  6. 计算机进入桌面黑屏怎么办,电脑开机后黑屏怎么办
  7. 在模拟现货黄金中锻炼短线的修养
  8. Java IMEI串号生成规则
  9. Excel公式与函数的应用-Excel学习记录-5.1/2/3/4/5
  10. echarts基本使用参考pink老师笔记