zoukankan      html  css  js  c++  java
  • 【知识点】博弈论

    SG函数:

    对于任何一个公平博弈游戏,我们都可以把每个局面看作一个顶点u,向它的子局面v连一条边,将整个游戏抽象成一张有向图。

    对于一个非负整数集合S,我们定义$mex(S)$表示最小的不属于这个集合的非负整数。

    对于一张有向无环图的每个顶点u,定义$SG(u)=mex({SG(v)})$,那么$SG(u)=0leftrightarrow u点是必败态$。

    如果一个游戏可以分成若干个子游戏,那么整个游戏的SG值等于每个子游戏SG值的异或和。(注意子游戏和子局面是不同的)

    Bash博弈:

    问题:一堆物品,n个,两个人轮流取,每次能取$[1,m]$个物品,没法操作的输,问先手是否必胜。

    结论:如果物品是$m+1$的倍数则先手必败,否则先手取$n\%(m+1)$个,然后后手取x先手跟着取$m+1-x$即可。

    Bash博弈升级版:

    问题:一堆物品,n个,两个人轮流取,每次能取$S={a_{1},a_{2},cdots,a_{m}}$个物品,没法操作的输,问先手是否必胜。

    结论:显然没结论,直接用SG函数dp即可。

    Nim博弈:

    问题:n堆物品,每堆$a_{i}$个,两个人轮流取,每次能从任意一个非空堆中取任意多个物品,没法操作的输,问先手是否必胜。

    结论:令$SG(A)=a_{1}oplus a_{2}oplus cdots oplus a_{n}$,则$SG(A)=0$时先手必败,否则必胜。

    证明:

    可以直接采用SG函数的定义和性质证明,或者我们需要证明以下三个引理:

    1. 对于任何一个状态A满足$SG(A)>0$,它一定能转移到至少一个状态B满足$SG(B)=0$;
    2. 对于任何一个状态A满足$SG(A)=0$,它一定不能转移到任何一个状态B满足$SG(B)=0$;
    3. $SG({emptyset})=0$。

    引理3显然得证。 

    考虑引理1,它等价于对于任意$a_{1}oplus a_{2}oplus cdots a_{i} cdots oplus a_{n}=k$,存在一个i满足将$a_{i}$减少至$a'_{i}$后,有$a_{1}oplus a_{2}oplus cdots a'_{i} cdots oplus a_{n}=0$。

    构造一种方案即可。考虑取k的最高位p,找到一个在p这一位为1的$a_{i}$(显然一定存在),显然$a_{i}oplus k<a_{i}$。

    那么将$a_{i}$替换成$a_{i}oplus k$,由异或的自反性可以验证其满足条件,得证。

    考虑引理2,使用反证法,若存在$a_{i} ightarrow a'_{i}$满足条件,则$a_{1}oplus a_{2}oplus cdots a_{i} cdots oplus a_{n}=a_{1}oplus a_{2}oplus cdots a'_{i} cdots oplus a_{n}$。

    左右消去其他项,得到$a_{i}=a'_{i}$,实际上没有操作,于是假设不成立,得证。

    阶梯博弈:

    问题:n个台阶,每个台阶上$a_{i}$个物品,两人轮流操作,每次将若干个物品从某个台阶下移一级,最低0级,没法操作的输,问先手是否必胜。

    结论:等价于拿出所有奇数台阶做Nim博弈,将奇数级的物品移到偶数级等价于拿走这些物品。

    证明:在博弈过程中如果出现了将偶数级的物品移到奇数级上的情况(显然该操作是必败方做的),另一方只需要将这些物品继续下移即可回到原Nim问题。

    反Nim博弈:

    问题:n堆物品,每堆$a_{i}$个,两个人轮流取,每次能从任意一个非空堆中取任意多个物品,最后一个操作的输,问先手是否必胜。

    结论:令$SG(A)=a_{1}oplus a_{2}oplus cdots oplus a_{n}$,当所有堆都只有1个物品时,若$SG(A)=0$则先手必胜;当至少有一堆多于1个物品时,若$SG(A) eq 0$则先手必胜。

    证明:显然每个子问题的$SG(x)=[x eq 1]$,但在所有x都等于1时需要特判。

    Moore's NimK:

    问题:n堆物品,每堆$a_{i}$个,两个人轮流取,每次选定至多k个非空堆,每堆取任意多个物品,没法操作的输,问先手是否必胜。

    结论:令$num_{p}$为所有$a_{i}$在二进制下p这一位1的个数之和对$(k+1)$取模的结果,则$num_{p}$均等于0时先手必败,否则必胜。

    证明:

    这个问题是划分不了子问题的,我们需要换一种思路证明。

    显然每次操作对于任意p均可将$num_{p}$增加或减少$[1,k]$范围内任意值。

    • 那么对于一个必胜态,一定存在一种方案转移到必败态。
    • 对于一个必败态,需要将$num_{p}$增加或减少$k+1$才能转移到必败态,显然不可能。

    树上博弈:

    问题:一棵有根树,两人轮流操作,每次选一个非根点删掉以它为根的子树。无法操作者输。

    结论:叶子节点SG值为0,其他节点的SG值为所有儿子SG值+1的异或和。

    证明:不会,见https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html

  • 相关阅读:
    恢复ubuntu和windows的双引导
    手把手教你做MVC3中的完美分页控件
    201521123024 《Java程序设计》第5周学习总结
    201521123024 《Java程序设计》第1周学习总结
    201521123024 《Java程序设计》第6周学习总结
    201521123024 《Java程序设计》第2周学习总结
    201521123024 《Java程序设计》第4周学习总结
    201521123024《Java程序设计》第3周学习总结
    201521123024《Java程序设计》第7周学习总结
    201521123024《Java程序设计》第8周学习总结
  • 原文地址:https://www.cnblogs.com/YSFAC/p/13233401.html
Copyright © 2011-2022 走看看