zoukankan      html  css  js  c++  java
  • 博弈论总结

    博弈论总结

    博弈论大约分为两类:
    一是披着一个博弈的外衣,其实是DP,或者图论的题
    二是通过把一个新的游戏转化成原有的模型,用SG值去做

    (忽略掉极大极小搜索...)

    博弈论的基本思想是模仿棋:即我做能抵消掉对手操作影响的操作,以维护我的必胜状态

    三类基础的博弈

    Nim 游戏

    桌子上有N堆石子ai,游戏者轮流取石子。
    每次只能从一堆中取出任意数目的石子,但不能不取。
    取走最后一个石子者胜。

    先手必败:a1 ^ a2 ^ ... ^ an=0

    数学归纳法证明:

    1. 最终状态异或和为0。

    2. 对于任意一个必胜态(异或和不为0),存在一个必败后继状态(异或和为0)。

    Bash 游戏

    只有一堆n个物品,两个人轮流从这堆物品中取物,规
    定每次至少取一个,最多取m个。最后取光者得胜。

    显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)* r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1) * (r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

    这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。

    Wythoff 游戏

    有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

    这种博弈和黄金分割扯上了关系

    Matrix67的这篇讲解很好

    公平组合游戏(ICG)

    定义

    游戏有两个人参与,二者轮流做出决策。且这两个人的决策都对自己最有利。
    当有一人无法做出决策时游戏结束,无法做出决策的人输。无论二者如何做出决策,游戏可以在有限步内结束。
    游戏中的同一个状态不可能多次抵达。且游戏不会有平局出现。
    任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关。
    OI中的博弈主要都是这类游戏
    以上三种游戏都是ICG

    有向无环图

    ICG游戏可以转化成有向无环图,一个状态是一个点,一个决策是一条边.

    终止状态出度为0.

    必胜态与必败态

    如果用1代表必胜态,0代表必败态

    当前状态必胜:当且仅当后继状态存在0

    当前状态必败:当且仅当后继状态没有0

    SG函数

    Sprague-Grundy

    (SG(u)=mex{SG(v):v是u的后继状态})

    mex(minimal excludant)是定义在整数集合上的操作。它的自变量是任意整数集合,函数值是不属于该集合的最小自然数。

    必败态的SG为0

    数学归纳法证明:

    1. 最终状态SG=0。

    2. 对于任意一个必胜态SG≠0,存在一个后继态SG=0

    3. 对于任意一个必败态SG=0,不存在一个后继态SG=0

    和Nim游戏类似,SG的变化类比成取石子

    SG函数的意义在于提供了一个可以量化ICG的工具

    游戏的和

    考虑任意多个同时进行的ICG,这些ICG的和是这样一个ICG,在它进行的过程中,游戏者可以任意挑选其中的一个单一游戏进行决策,最终,没有办法进行决策的人输。

    游戏等价

    ICG a 与 ICG b 等价
    当且仅当对于任意一个 ICG c 来说, a + b 与 a + c 的胜负性相同
    等价的游戏的SG值相等

    SG定理

    注意SG定理应用的前提:每个子游戏都是独立的

    若局面X由若干个子游戏 X1 , X2 ... Xn 构成,则SG(x)=SG(X1) ^ SG(X2) ^ ... ^ SG(Xn)

    数学归纳法证明:

    1. 最终局面成立
    2. ∀X,所有后继局面可以取到SG(X1)⊕SG(X2)⊕...⊕SG(Xn)−1,取不到SG(X1)⊕SG(X2)⊕...⊕SG(Xn)

    SG与Nim游戏转化:

    每一个简单SG-组合游戏都可以完全等效成一堆数目为K的石子,其中K 为该简单游戏的SG 函数值。这样的等效是充要的。

    在我们每次只能进行一步操作的情况下,对于任何的游戏的和,我们若将其中的任一单一SG-组合游戏换成数目为它的SG 值的一堆石子,

    该单一SG-组合游戏的规则变成取石子游戏的规则(可以任意取,甚至取完),则游戏的和的胜负情况不变。

    Anti-SG

    Anti-SG游戏规定,决策集合为空的游戏者赢。

    Anti-SG其他规则与SG游戏相同。

    SJ定理 (详见贾志涛论文)

    规定所有单一游戏SG=0时游戏结束(这个前提非常重要,这是SJ定理成立的前提)

    先手必胜:

    1. SG≠0, 某个单一游戏SG>1

    2. SG=0, 没有单一游戏SG>1

    数学归纳法证明

    1. 所有的终止局面为先手必胜局。

    2. 游戏中的任何一个先手必败局一定只能够转移到先手必胜局

    3. 游戏中的任何一个先手必胜局一定能够转移到至少一个先手必败局

    Anti - Nim

    其实是Anti - AG的一个子集,但是因为易于理解,单独考虑

    Anti - Nim 有如下规律:
    1.当每堆石子都只有一个的时候, SG = 0 先手必胜
    2.当存在不只有一个的石子的时候, SG != 0 时 先手必胜

    证明:

    第一条显然

    第二条,当只有一堆石子多于一个的时候,先手总可以根据剩下的只有一个石子的堆数,选择把这一堆拿成 1 个或 0 个,从而使只有一个的石子堆的堆数为偶数

    当有多堆石子的时候, 等价于两堆多于一个,剩下的只有一个的石子堆如果是奇数 ,等价为一个,偶数等价为 0 个
    如果SG值不为 0 ,先手总可以操控使对方拿到最后一个:
    分别考虑有没有多出的一个石子
    这里有代码:
    http://www.cnblogs.com/Mr-WolframsMgcBox/p/8513637.html

    Multi-SG

    Multi-SG游戏规定,在符合拓扑原则的前提下,一个单一游戏的后继可以为多个单一游戏

    Multi-SG其他规则与SG游戏相同。

    仍然可以使用SG函数,后继为多个单一游戏的,这个后继的SG值为多个单一游戏SG的异或和

    take & break 模型

    这是一个经典的Multi - SG问题
    暴力算SG值即可
    王晓珂的论文中的第一个例题就用到了这个转化
    http://www.cnblogs.com/Mr-WolframsMgcBox/p/8506344.html

    Every-SG

    Every-SG 游戏规定,对于还没有结束的单一游戏,游戏者必须对该游戏进行一步决策,最后一个结束的游戏的胜负即为和游戏的胜负

    Every-SG 游戏的其他规则与普通SG 游戏相同

    贪心:先手必胜的尽量长,先手必败的尽量短

    对于SG值为0的点, 我们需要知道最快几步能将游戏带入终止状态

    对于SG值不为0的点,我们需要知道最慢几步游戏会被带入终止状态

    我们用step函数来表示这个值。

    [step(u)= egin{cases}0,u是终止状态\max{step(v)} + 1, v是u的后继,SG(u) != 0\min{step(v)} + 1, v是u的后继,SG(u) == 0end{cases} ]

    翻硬币游戏:

    N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。

    游戏者根据某些约束翻硬币(如:每次只能翻一或两枚,或者每次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是从正面翻到反面。

    谁不能翻谁输。

    有这样的一个结论:

    局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG值的异或和。(几乎对于所有的翻硬币游戏都有这样的规律,不管是一维二维还是三维,但证明比较麻烦)

    总结的链接:
    http://blog.sina.com.cn/s/blog_8f06da99010125ol.html

    阶梯Nim

    N个阶梯,限制每次从上一个阶梯移到下一个阶梯

    阶梯Nim只考虑奇数位置进行Nim游戏,因为偶数位置是对称的,我们有平衡的操作

    因为阶梯Nim只能往下移动的特性,很多的游戏可以转化成这种模型

    树上删边游戏

    给出一个N个点的有根树。

    游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走。

    无边可删者输。

    叶子节点的SG值为0,中间节点的SG值为它的所有孩子的SG值加1后的异或和。

    数学归纳法证明

    1. 一个和两个节点显然成立

    2. k个节点根为B的子树G′成立,证明G成立先证明根有一个孩子成立

    树上的一条链可以等效成一堆石子的Nim

    无向图的删边游戏

    一个无相联通图,有一个点作为图的根。

    游戏者轮流从图中删去边,删去一条边后,不与根节点相连的部分将被移走。

    无边可删者输。

    定理:

    我们可以对无向图做如下改动:

    将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边;

    所有连到原先环上的边全部改为与新点相连。

    这样的改动不会影响图的SG值。(证明极其麻烦)

    参考文献:

    五篇国家集训队论文:

    张一飞: 《由感性认识到理性认识——透析一类搏弈游戏的解答过程 》

    王晓珂:《 解析一类组合游戏》

    方展鹏:《浅谈如何解决不平等博弈问题》

    贾志豪:《组合游戏略述——浅谈SG游戏的若干拓展及变形》

    曹钦翔:《从“k倍动态减法游戏”出发 探究一类组合游戏问题》

    转载请注明出处:http://www.cnblogs.com/Mr-WolframsMgcBox/p/8516680.html

  • 相关阅读:
    亲测——pycharm下运行第一个scrapy项目 ©seven_clear
    [转]pycharm的一些快捷键
    一个豆瓣API的使用——拒绝思维定式
    小试牛刀--利用豆瓣API爬取豆瓣电影top250
    Python GUI编程--Tkinter
    多线程详解
    K8S+GitLab-自动化分布式部署ASP.NET Core(一) 部署环境
    初学者浅度剖析eShopOnContainers 里面用到的MediatR .
    通过Task异步加快对数组的运算
    为什么是容器?
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8516680.html
Copyright © 2011-2022 走看看