zoukankan      html  css  js  c++  java
  • 博弈论中的Nim博弈

    瞎扯

     (orzorz) (cdx) 聚聚给我们讲了博弈论。我要没学上了,祝各位新年快乐。现在让我讲课我都不知道讲什么,我会的东西大家都会,太菜了太菜了。
     
     马上就要回去上文化课了,今明还是收下尾再稍微开一波多项式吧,不然万一文化课上自闭了被锤自闭了站教室外面没课听了还能有事情做……所以把这两天学到的东西稍微整理一下,以后再慢慢完善好了。
     
     发现博弈论的题目还是 (Nim) 博弈和其他的比较多。这次就先简单整理一些 (Nim) 博弈的类型和东西吧,主要是以某博客里搜来的一串题目为引导。因为是整理,所以就写一些自己的理解,不会说的很详细了……
     

    Bash 博弈

     一类经典而基础的博弈问题。
     
     两个人玩游戏,有一堆石子,每次仅从一堆中取且可以取 (1 ~ m) 个,无子可取者为负,问谁有必胜策略。
     
     引入了 (N) (先手必胜)状态和 (P) (先手必败)状态的概念,在博弈论问题中,显然最终状态是一个让当前状态先手无路可走的 (P) 状态。这样根据定义,能转移到此状态的状态就是 (N) 状态,常用这样的逆推方法,推到起手为止。
     
     而经过观察与推算,这样的问题常常是存在可总结的规律的,经过这样的总结往往可以使时空复杂度大幅度降低以致到常数级别。
     
     例如对于本题,可以从简单的状态入手,当石子数为 (0) 时为一个 (P) 状态,则石子数为 ([1, m]) 时是 (N) 状态,因为总可以一次拿完。而石子数为 (m + 1) 时,先手无论如何操作,后手总可以拿完剩下的石子,故是一个 (P) 状态。继续向前推发现,当石子数为 (m + 1) 的倍数时,与上述情况是相同的,先手必败;否则,先手总可以让后手处于上述状态,后手必败。
     

    Bash 博弈 II

     一类经典而基础的博弈问题的加强版。
     
     两个人玩游戏,有一堆石子,事先给定一个数集 (S),每次仅从一堆中取且可以取的石子的数量 (x in S),无子可取者为负,问谁有必胜策略。
     
     显然可以用与前面一个问题相同的方法找规律求解,但有可能十分麻烦。如何抽象地让计算机去做这件事情或者打出表找规律呢?可以引入一个函数 (SG(u) = mex{ SG(v) }),其中 (u) 为当前局面,(v) 表示后继局面,以方便表示状态。
     

    SG 函数

     上面提到了 (SG) 函数,这是博弈论中重要的概念和工具。
     
     (SG) 函数主要利用了其定义以判断当前的胜负状态。往往最终局面的 (SG) 函数值被设为 (0),且当 (SG) 函数值为 (0) 时当前局面被认为是 (P) 状态,反之是一个 (N) 状态。这个结论是巧妙地和定义结合在一起的,因为若 (forall SG(v) e 0),则 (SG(u) = 0),对应了 (P) 状态的后继状态都是 (N) 状态;若 (exists SG(v) = 0),则 (SG(u) e 0),对应了一个 (N) 状态总有一个后继状态是 (P) 状态。
     
     (SG) 函数的用途很广,而且有着十分神奇的性质,后面会提到。
     

    DAG 与博弈

     这一类问题中,(SG) 函数的用法显而易见,也有很多很多问题可以转化为此类问题。
     
     在这一类问题中,前驱与后继状态清晰明了,而且往往没有显然的规律,以至于出题人会给你充足的时间让你把各种起手的状态处理一遍。这时就要用到 (SG) 函数了,而且很显然是让你把起手时的 (SG) 函数值推出来存下来 …… 于是就可以将其他的一些问题也对应到 (DAG) 上,然后直接通过 (SG) 函数之间的转移而解决几乎全部的问题。
     

    Nim 博弈

     又是一类经典而基础的博弈问题的最初版本。
     
     两个人玩游戏,有 (n) 堆石子,每次操作可以选一堆石子xjb拿,最少拿一颗,无子可取者为负。
     
     介绍一个 (SG) 定理:游戏的和的 (SG) 值是各个子游戏的 (SG) 值的 (xor)
     
     知道了以上结论,想到 (Nim) 游戏实际上可以分为 (n)(Bash) 游戏,而 (Bash) 游戏若可以无限取子,则以当前局面剩余石子数为状态,(SG(x) = x)。所以这个题目的答案即为各个堆石子数的异或值,若值为 (0),先手必败,否则先手总有方案使得下一局面异或值为 (0),后手必败。
     
     不仅仅是 (Nim) 游戏,(SG) 定理是可以推而广之的。
     

    对称博弈

     一类博弈问题的套路 (好像不属于 Nim 博弈)
     
     这类模型可以直接写出结论:若先手有着在第一步就取胜的方法,则先手胜;否则后手可以通过一定的操作将局面分成无法互相影响的相同的两部分,这样,先手做什么操作,后手就在另一部分上做相同的操作,所以最后一步一定是后手做的,此时先手必败。
     

    阶梯博弈

     (Nim) 博弈的直接变种一,有着类似的特性且广泛出现 (以下三种博弈的相关证明)
     
     对于这一类模型,通常情况下只有两两之间的状态可以决定局面的胜负。我们可以将每两堆石子绑定在一起,若石子堆数为奇数,则将 (0) 位置与第 (1) 堆绑定在一起。而石子数可以是两堆间距离,可以是能够转移的数量等。
     
     把所有奇数阶梯看成 (N) 堆石子做 (Nim)。把石子从奇数堆移动到偶数堆可以理解为拿走石子,就相当于几个奇数堆的石子在做 (Nim)。存在必胜态的一方只要一直保持奇数堆不变,就可以跟着另一方把偶数堆的石子最终移动到 (0),所以偶数堆的移动不会影响奇数堆做 (Nim) 博弈的过程。
     

    反 Nim 博弈

     (Anti-Nim)(Nim) 博弈的直接变种二,已经是有些分析难度的模型了。
     
     两个人玩游戏,有 (n) 堆石子,每次操作可以选一堆石子最少拿一颗,最后取子者为负。
     
     一个状态为必胜态,当且仅当所有堆的石子个数为 (1),且 (xor\_sum = 0);或至少有一堆的石子个数大于 (1),且 (xor\_sum e 0)
     
     当所有堆石子数均为 (1) 时,胜负态与奇偶数相关;当仅有一堆石子数不为 (1) 时,先手总存在将其转化为前一种情况的必胜态的方案;当有多堆石子数不为 (1) 时,可以分类讨论以证明。
     

    Moore's Nimk

     (Nim) 博弈的直接变种三,变得更麻烦起来了。
     
     两个人玩游戏,有 (n) 堆石子,每次操作可以选不超过 (k) 堆石子取任意多个,最少拿一颗,无子可取者为负。
     
     把 (n) 堆石子的石子数用二进制表示,统计每个二进制位上 (1) 的个数,若每一位上 (1) 的个数 (mod (k+1)) 全部为 (0),则必败,否则必胜,可以如下证明。
     
     全为 (0) 的局面是必败态。
     
     在某一次移动中,至少有一堆被改变,也就是说至少有一个二进制位被改变。由于最多只能改变 (k) 堆石子,所以对于任何一个二进制位,(1) 的个数至多改变 (k)。而若原 (i)(1) 的总数为 (k+1) 的整数倍,所以改变之后必然不是 (k+1) 的整数倍。故在 (P) 状态下一次操作的结果必然是 (N) 状态。
     
     任何 (N) 状态,总能使其变成 (P) 状态,即总有一种方法让所有二进制位上的 (1) 的数量都恢复到 (k+1) 的整数倍。
     

    树上博弈

     又是 (Nim) 的变种,不过已经看不太出来了呢。
     
     一棵树,有一个点作为树的根节点。游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走,谁无法移动谁输。
     
     叶子节点的 (SG) 值为 (0),中间节点的 (SG) 值为它的所有子节点的 (SG) 值加(1) 后的异或和。
     

    图上博弈

     和树上博弈类似的东西,只是多了一点技巧而已。
     
     一个无向联通图,有一个点作为图的根节点。游戏者轮流从图中删去边,删去一条边后,不与根节点相连的部分将被移走,谁无法移动谁输。
     
     对于这个模型,有一个著名的 (Fusion Principle) 定理。可以对无向图做如下改动:将图中的任意一个偶环缩成一个新点,任意一个奇环缩成一个新点加一个新边,所有连到原先环上的边全部改为与新点相连。这样的改动不会影响图的 (SG) 值。
     
     
     就先这么多吧……有没有 (dalao) 补充啊 (orz),后排膜一下 (Attack) 大爷 (orz)
     
     —— 我知道有些人是爱我的,但我好像缺乏爱人的能力。  《人間失格》

  • 相关阅读:
    RadAsm使用
    如何从外网访问内网
    装SQL server 2008问题解决
    820
    大三学生经验之谈
    ROM与RAM知识
    java mybatis学习一
    java Sprint boot 学习之一
    java读取配置到Hash表里
    数组乱序算法
  • 原文地址:https://www.cnblogs.com/nanjoqin/p/10211576.html
Copyright © 2011-2022 走看看