zoukankan      html  css  js  c++  java
  • 博弈论整理

    博弈论整理

    1. ( ext{Nim}) 游戏

    (n) 堆石子,每次可以从其中任意一堆石子中取出若干块石子(可以取完),不能不取。

    最后无石子可取者为输家。假设两人都按最优情况走,问是否先手必胜。

    为了计算这个问题,我们对这些状态定义 ( ext{position}),设 ( ext{N-position}) 表示先手必胜状态,( ext{P-position}) 表示先手必败状态

    我们再定义某状态的后继状态为这个状态取走一些石子之后达到的新状态

    那么显然,( ext{N-position}) 的后继状态一定有一个是 ( ext{P-position}),而 ( ext{P-position}) 的后继状态全是 ( ext{N-position})

    有了这两种定义,我们再来观察 ( ext{Nim}) 游戏:显然,(0) 枚石子是一个 ( ext{P-position}),接着,(1,2,dots,inf) 枚石子都是 ( ext{N-position})

    2. ( ext{SG}) 函数

    (SG(x)) 表示 (x) 个石子的函数值,当且仅当 (x) 个石子对应的状态为必败态 ((P))(SG(x)=0)

    也就是说,当前状态为必胜态时,(SG(x)>0)

    ( ext{SG}) 函数的公式:(SG(x)=mex {SG(S)})

    其中 (mex) 表示一个集合中没有出现的最小自然数,(S) 表示 (x) 状态的所有后继状态的集合

    ( ext{SG}) 函数的作用是为了应对多堆石子的情况:

    一堆石子的 ( ext{SG}) 值为每堆石子的 ( ext{SG}) 的异或和

    证明如下:

    局面为 (S>0) 时,设 (S={a_1} oplus {a_2} oplus dots oplus {a_n}=d),假设 (d) 的二进制最高位为 (k),那么一定存在至少一个 (a_i)(k) 位为 (1),显然 (a_i oplus d<a_i)(因为异或后第 (k) 位变为 (0)(a_i) 减去 (2^k),而其它位最多加上 (2^k-1))。那么只要将 (a_i) 改变为 (a_i oplus d),异或和变为 (d oplus a_1oplus dots oplus a_n=d oplus d=0)。即 (S>0) 时一定可以走到一个 (T=0) 的状态。

    当游戏为终止局面 (S=0) 时,假设可以将 (a_i) 变为 (a_i'),使 (T)(0)。由于 (S={a_1} oplus {a_2} oplus dots oplus {a_n}=0),即 (a_i=a_1oplus dots oplus a_{i-1} oplus a_{i+1} oplus dots oplus a_n)。同理得 (a_i'=a_i=a_1oplus dots oplus a_{i-1} oplus a_{i+1} oplus dots oplus a_n)。这样 (a_i=a_i'),显然矛盾,所以一个 (S=0) 的状态只能到达 (T>0)

    这样就可以递推求出 ( ext{SG}) 函数的值,并且快速求解一些问题了

    3. ( ext{Anti-SG}) 问题与 ( ext{SJ}) 定理

    所谓 ( ext{Anti-SG}) 问题,指的是最后操作的人失败的问题,普通的 ( ext{SG}) 函数无法应对这样的问题,因为无法确定 (SG(0)) 的函数值

    我们继续考虑 (Nim) 游戏,唯一的区别就是取走最后一个石子的人失败

    如果假定 (SG(0)=0),那么 (SG(1)=mex { SG(0)}) 应该为 (1),然而实际上 (SG(1)) 是必败态,应该为 (0)

    如果假定 (SG(0)=1),那么两堆石子,每一堆均为 (0) 个,此时应该是先手必胜,然而 (SG()= 1 oplus 1 =0),矛盾

    这时候就要用上 ( ext{SJ}) 定理了

    若把 ( ext{SG}) 游戏中的空状态定义为必胜状态,那么状态是先手必胜当且仅当下述条件同时成立或同时不成立:

    1. (SG(S)=0)

    2. (∀x∈S,SG(x)≤1)

    其中,(SG(S)) 是状态的 ( ext{SG}) 值,(SG(x)) 是各子问题的 ( ext{SG}) 值。

    证明如下 ((by rqy))

    首先,终止状态由于满足两个条件,所以必胜。

    其次,证明必败态的后继全是必胜态:

    1. 若满足条件1而不满足2,那么 ( ext{SG}) 值大于 (1) 的一定不止一个(因为异或中小于等于 (1) 的之会影响最后一位,所以前面所有位必须有至少两个数,即至少有两个数大于 (1)),那么,进行一步后 ( ext{SG}) 值一定非零,且还是有大于 (1) 的,即两条件都不满足。

    2. 若满足条件2而不满足条件1,可以发现现在一定只有奇数个 (1) 和若干 (0)。那么现在有两种可能:

      (1)将一个 (1) 变成 (0),或将一个 (0) 变成 (1)(注意,( ext{SG}) 值可以变大,但不会不变),那么条件1得到满足,且条件2仍满足,即为必胜态;

      (2)将一个数变得大于 (1)。此时可发现 ( ext{SG}) 值异或和必不为 (0),所以两条件都不满足,为必胜态。

    最后,证明必胜态至少有一个后继是必败态:

    1. 若两条件都满足,那么必有偶数个 (1) 和若干 (0),此时只需要将一个 (1) 变成 (0),就会使条件1不满足。

    2. 若两条件都不满足,那么:

      (1)若只有一个数大于 (1),那么将其变为 (0) 和变为 (1) 都会满足条件2,且必有一个选择使 ( ext{SG}) 值不为 (0),即为必败态;

      (2)否则,后继必不满足条件2,此时类似于 ( ext{SG}) 定理,必定能使 ( ext{SG}) 值变为 (0),即为必败态。

    证毕。

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/wawawa8/p/9948126.html
Copyright © 2011-2022 走看看