zoukankan      html  css  js  c++  java
  • 【笔记】博弈论

    博弈论

    公平组合游戏 ICG

    定义

    • 游戏有两个人参加,二者轮流做出决策,双方均知道游戏的完整信息;
    • 任意一个游戏者在某一确定状态可以作出的决策集合只与当前的状态有关,而与游戏者无关;
    • 游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束。
    • 在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关。

    大部分棋类游戏都不是公平那个组合游戏,因为双方都不能使用对方的棋子。-oi-wiki

    Nim 游戏

    曾经有个地方出现了这样的一个小游戏,摆出三堆硬币,这三堆分别包含三枚,五枚,七枚硬币。二人轮流行动,每次可以任选一堆,从中取走任意多枚硬币,但是不能不取。取走最后一名硬币者获得胜利。

    把这个玩意化简为更一般的形式 :

    给定 (n) 堆物品,第 (i) 堆物品有 (a_i) 个。两个玩家轮流行动,每次可以任意选择一堆,取走任意多个物品,可把一堆取光,但是不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手能否获胜。

    这种游戏称之为 ( ext{Nim}) 博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取哪种行动,都会输掉游戏,则该局面称为必败

    所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对手面临必败场面,则优先采取该行动。同时这样的局面也被称为必胜。我们讨论的博弈一般都只是考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。( ext{Nim}) 游戏不存在平局,只有先手必胜先手必败的两种情况。

    定理

    ( ext{Nim}) 和 :

    ( ext{Nim}) 游戏通过画博弈图,我们可以在 (O(prod_{i = 1} ^ n a_i)) 的时间里求出该局面是否为先手必赢。

    但是这样的时间复杂度实在太高,我们就有了下面这种方式。

    ( ext{Nim}) 游戏先手必胜,当且仅当 (a_1 ext{xor} a_2 ext{xor} cdots ext{xor} a_n ot= 0)

    至于证明,感觉自己没怎么看懂,详见 (Link)

    博弈图

    如果将每一个状态视为一个节点,再从每个状态向后继状态连边,就可以得到一个博弈图,也就是说每次做出一个决策就像是从一个旧的状态转移到一个新的状态,也就是在两个节点的有向边上面转移。

    还有,一般博弈图都是 ( ext{DAG}),否则会陷入死循环。

    基本定理

    我们能够推出下面的三条定理 :

    • 没有后继状态的状态是必败状态。
    • 一个状态是必胜状态当且仅当存在至少一个必败状态为它的后继状态。
    • 一个状态是必败状态当且仅当它的所有后继状态均为必胜状态。

    对于定理 1,如果游戏进行不下去了,那么这个玩家就输掉了游戏。

    对于定理 2,如果该状态至少有一个后继状态为必败状态,那么玩家可以通过操作到该必败状态;此时对手的状态为一个必败状态,对手必定是失败,而相反地,自己就获得了胜利。

    对于定理三,如果不存在一个后继状态为必败状态,那么无论如何,玩家只能操作到必胜状态;此时对手的状态为一个必胜状态,对手必然胜利,自己就输掉了游戏。

    如果博弈图是个有向无环图,则通过这三个定理,我们可以绘出博一图的情况下用 (O(N + M)) 的时间 (其中 (N) 为状态种数,(M) 为边数)得出每个状态是必胜状态还是必败状态。

    有向图和 SG 函数

    有向图游戏是一个经典的博弈游戏——实际上,大部分的公平组合游戏都可以转换为有向图游戏。

    在一个有向无环图中,只有一个起点,上面有一个棋子,两个玩家轮流沿着有向边推动棋子,不能走的玩家判负。

    定义 ( ext{mex}) 函数的值为不属于集合 (S) 中的最小的非负整数,即 :

    [ ext{mex}(S) = min{x} (x otin S,x in N) ]

    我们设两个集合 (A = {0,1,4,6},B = {0,2,6,5})

    所以 ( ext{mex}(A) = 2, ext{mex}(B) = 1, ext{mex}({}) = 0)

    对于状态 (x) 和它的所有 (k) 个后继状态 (y_1,y_2,y_3,cdots,y_k),定义 (SG) 函数 :

    [SG(x) = ext{mex}{SG(y_1),SG(y_2),SG(y_3),cdots,SG(y_k)} ]

    而对于由 (n) 个有向图游戏组成的组合游戏,设他们的起点分别为 (s_1,s_2,cdots,s_n),则有定理,当且仅当 (SG(s_1) igoplus SG(s_2) igoplus cdots igoplus SG(s_n) ot= 0) 时,这个游戏是先手必胜的。

    这一个定理被称作 (SG) 定理。

    定理简述

    有向图游戏的某个局面必胜,当且仅当该局面必胜。当且仅当该局面对应的节点的 (SG) 函数值大于 0。

    有向图游戏的某个局面必败,当且仅当该局面必胜。当且仅当该局面对应的节点的 (SG) 函数值等于 0。

    简单证明

    在一个没有出边的节点上,棋子不能够移动,它的 (SG) 值为 0,对应必败局面。

    若一个节点的某个后继结点 (SG) 值为 0,在 ( ext{mex}) 运算后,该节点的 (SG) 值大于 0。这等价于,若一个局面的后继局面中存在必败局面,则当前局面为必胜局面。

    若一个节点的后继结点 (SG) 值均不为 0,在 ( ext{mex}) 运算后,该节点的 (SG) 值为 0。这等价于,若一个局面的后继局面全部都是必胜局面,则当前的局面为必败局面。

    Nim 游戏转化为有向图游戏

    我们可以将一个拥有 (x) 个物品的堆视为节点 (x),则当且仅当 (y < x) 时,节点 (x) 可以到达节点 (y),此时从 (x)(y) 连接一条有向边。

    那么,由 (n) 个堆组成的 ( ext{Nim}) 游戏,就可以视为 (n) 个有向图游戏了。

    根据上面的推论,可以得出 (SG(x) = x)。在根据 (SG) 定理,就可以得出 ( ext{Nim}) 和的结论了。

  • 相关阅读:
    关于局域网内IIS部署网站,本机可访问,而网内其他用户无法访问问题的解决方法
    spark出现task不能序列化错误的解决方法
    Ganglia安装
    Hadoop自定义JobTracker和NameNode管理页面
    如何编写自定义hive UDF函数
    HighChart利用servlet导出中文PNG图片乱码问题解决
    sparkR介绍及安装
    在Linux中安装redmine
    在Ubuntu14.10中部署Hadoop2.6.0单节点伪分布集群
    【转】Spark on Yarn遇到的几个问题
  • 原文地址:https://www.cnblogs.com/Ti-despair/p/14801389.html
Copyright © 2011-2022 走看看