算法合集之《从“k倍动态减法游戏”出发探究一类组合游戏问题》

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在著名的 Nim 游戏中 S ( x) (T ( x) k ) (其中 k 是 Nim 中数的组数) ,在经典的 Green Hackenpush 中 S ( x) (2 T ( x ) ) 。 鉴于上面得出的 S(x)D(x)T(x)的相互数量关系,本文将选择 T(e)(e 表示初始 状态)这个游戏结束所需的最少时间作为衡量算法时间复杂度的尺度,正如一般 以输入时间这一程序运行的最少时间作为程序的运行标准一样。 而且,在一些问题中,游戏状态的描述的规模 D(x)(这很有可能就是输入 文件的规模,因为输入文件应当包含且只包含游戏规则描述以及初始状态描述, 例如下面的“k 倍动态减法游戏”中,整数 k 是游戏规则描述,整数 S 是初始条件 描述)可能很小,但 T(e)很大时,程序运行时间与输入规模的相对关系就意义不
1.3.衡量解决组合游戏的算法的时间的尺度
作为信息学的问题,算法的时间效率至关重要。对于一般的信息学问题,算 法的时间复杂度是依据程序运行时间相对于输入文件规模增长的增长来衡量的。 这一衡量尺度对于游戏论问题当然是适用的,但是对于游戏论问题,特别是涉及 到前面提出的第三类交互式问题的时候,本文也会采用下面的衡量方式。 首先,所有当前状态的直接或间接的后继状态的数量 S(x)、描述当前状态所 必需的数据规模 D(x)、最坏情况下结束游戏的回合数 T(x)都可以衡量一个游戏 的复杂程度, 因此程序运行时间的增长与此三者之一的增长速度的关系,也可以 衡量一个算法的时间复杂度的尺度。 其次, 一方面由于对当前状态的描述必须能是的当前状态能区别于其它状态 (特别的,包括他的所有直接的或间接的后继状态) ,所以 D( x) (log S ( x)) 。 另 一 方 面 , 由 于 表 达 游 戏 的 图 是 有 向 无 环 的 , 所 以 对 任 意 y f ( x) 都 有
共 44 页-第 6 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
步骤 3:找到所有的未定状态中,可以一步到达 P 状态的状态,都设置为 N 状态。 步骤 4:若上两步中没有产生新的 P 状态或 N 状态,程序结束,否则回到步 骤 2。 上面这个算法是解决一切游戏论问题的普遍方法。不难发现,对于游戏 G(V,E),这个算法的时间复杂度是 O(|E|)。 但是,这个算法的普遍适应性,意味着它时间效率不高。对于“k 倍动态减 法游戏”而言,|E|= (S 3 ) ,T(e)= (S) ,所以这个算法相对于 T(e)是立方阶的, 并不十分优秀。在 2002 年的集训队论文中提出的对于一般的 k 的算法正是这个 O(S3)的动态规划方案,接下去本文将在此基础上,获得一个相对于 T(e)线性的 算法。
共 44 页-第 7 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
四.基于动态规划的算法优化
4.1.基于单调性的方法 4.1.1. “k 倍动态减法游戏”的状态单调性
在 “k 倍 动 态 减 法 游 戏 ” , 状 态 (m,n) 是 关 于 n 单 调 的 。 即 , 若 记
共 44 页-第 3 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
大了。 对于第(3)类交互式问题而言,O(T(e))-O(1)的在线算法是最理想的。
1.4.游戏论问题对于信息学竞赛的普遍意义
游戏论题目的考察兼顾了动态规划的基本算法原理, 和各种分析手段的灵活 应用, 是一类没有固定公式的综合型问题。 这也正是游戏论越来越受欢迎的原因。 近些年,尤其最近一年,关于游戏论的问题在国际各大竞赛,各题库网站上屡见 不鲜。因此,游戏可以说已经成为信息学竞赛新热点。
共 44 页-第 5 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
三.基本理论——NP 状态定理;基本方法——动态规划
3.1.N 状态 P 状态的概念:
所谓 N 状态,是指当前即将操作的玩家有必胜策略(N 来源于 Next player wins.) 。 所谓 P 状态, 是指先前刚操作完的玩家有必胜策略 (P 来源于 Previous player wins.) 。 这里用一个简单的捡石子游戏(Take-Away Game)来说明这两个概念: 有两个游戏者:A 和 B。有 21 颗石子。两人轮流捡走石子,每次可取 1、2 或 3 颗。A 先取。取走最后一颗石子的人获胜,即没有石子可取的人算输。 如果操作完剩下 0 颗石子,那刚才操作的人就胜了,所以 0 是 P 状态。如果 剩下 1、2 或 3 颗石子,那么接下来取的人就能获胜,这是 N 状态;如果剩下 4 颗,那么无论接下来的人怎么取,都会出现前面这种情况,所以接下来取的人一 定会输,所以 4 是 P 状态;如果剩下 5、6 或 7 颗石子,那么接下来取的人只要 使得剩下 4 颗石子,他就能获胜。0,4,8,12,……都是 P 状态。 可以发现规律,当且仅当剩余石子为 4 的倍数时是 P 状态。现在有 21 颗石 子,所以是 N 在状态,所以 A 必胜。
3.2.NP 状态定理:
定理: P 状态是“胜利终止状态”或者它的一切后继都为 N 状态, N 状态是“失 败终止状态”或拥有至少一个后继是 P 状态。
3.3.通式的动态规划解法
根据上面的定理,可以利用动态规划求得每个状态是 P 状态还是 N 状态。 具体的实现方法,可以按照图的拓扑逆序倒推(常用方法) ,也可以从初状态出 发进行记忆化搜索(这个留在后面讨论) 。用递推实现,我们不难设计出下面算 法: 步骤 1:把所有“胜利终止状态”标记为 P 状态,“失败终止状态”标记为 N 状 态。 步骤 2:找到所有的未定状态中,所有后继都被确定是 N 状态的状态,设置 为 P 状态。
关 键 字
NP 状态、单调性、SG 函数、 “Nim 和” 、 “Nim 积” 、对称性分析、贪 心分析、时间复杂度分析
共 44 页-第 1 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
一.引言
1.1.组合游戏的定义
“游戏”这个词包含的范围很广,像“石头剪刀布” “斗地主” “军旗” “象 棋” “Nim 游戏”等等。但是,一个游戏,作为组合游戏,必须具有以下特征: 1:双人游戏。 2:双方轮流操作。即,组合游戏不包含双方同时进行的操作。 3:在游戏中的任意一个时刻,当前玩家可以选择的操作,是一个有限的确 定的集合。即,组合游戏不包含随机化的操作。 4:信息完全。即,在游戏中的任意时刻,游戏中的任意一方都知道游戏的 初始状态,以及从“游戏开始”到“当前”为止的双方的所有的历史操作,没有 任何的保密。 5:游戏中的某一些状态被规定为“胜利终止状态”,到达这些状态的玩家 获胜 (即对方把胜利终止状态交给你的话, 你就输了) ; 某一些状态被规定为“失 败终止状态”,到达这些状态的玩家失败。本文只讨论,有限次操作后能分出胜 负的那一类组合游戏,这一类游戏中将没有“平局”的情况。由于平局的情况是 复杂的,本文不讨论。例如, “中国象棋” “围棋”都是经典的组合游戏,但不属 于本文讨论范围。 所以,像“推箱子”这样的单人游戏,不属于组合游戏;像“石头剪刀布” 这样包含同时操作的游戏,不属于组合游戏;像“飞行棋” “大富翁”这样包含 掷色子的随机行为的游戏不属于组合游戏;像“斗地主” “军旗”这样的对自己 当前状态保密的游戏,不属于组合游戏。 所以总结起来, 对于一个组合游戏, 一般可以用 f: XP(x)来描述游戏规则。 其中 X 表示状态集,P(x)表示 X 的子集簇。f(x)就表示玩家可以从 x 出发一步操 作后到达的状态的集合。我们称任一个 y f ( x) ,y 是 x 的一个后继。也就是说, 本文讨论的组合游戏可以被理解成一个有向无环图 G=(V,E),图的点集 V=X,边 集 E=(xy| y f ( x) )。
1.2.组合游戏需要解决的问题
由于组合游戏是一个双方博弈的游戏, 所以对于一个游戏的研究一般需要回
共 44 页-第 2 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
答两个问题:谁有必胜策略?必胜策略是什么? 而在信息竞赛学的问题中需要解决的问题,也与此相对应,分三个层次: (1)判断谁有必胜策略; (2)寻找单回合的必胜选择; (3)维护多回合的必胜选择(交互题涉及) 。
1(if _(m, n) _ is _ an _ N position ) NP(m,n)= ,NP(m,n)关于 n 单调不减。 0(if _(m, n) _ is _ a _ P position )
这是因为若正整数 m0、n0 使得 NP(m0,n0)=1,则对于任意 n>n0,m=m0 都有 NP(m,n)=1。这是因为,状态(m0,n0)时玩家可以完成的操作,在状态(m,n)也允许 操作(这利用了 n>n0) ,且到达相同的状态(这利用 m=m0)。
S ( x) S ( y) 1 ,所以 S ( x) (T ( x)) 。有很多例子中, S ( x) (T ( x)) ,下文中
将会提及的“捡石子游戏”就是一个这样的例子;但是,在更多的游戏中
S ( x) (T ( x)) ,例如在本文主要讨论的“k 倍动态减法游戏”, S ( x) (T ( x) 2 ) ,
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题


组合游戏是指,信息完全轮流操作的双人游戏。本文将从一个游戏——k 倍 动态减法游戏(k-based dynamic subtraction game)的解答出发,讨论游戏中的一 个重要分支——组合游戏, 并探讨解决这一类的问题的高效方法。探索的过程力 求兼顾游戏论中的普遍真理以及问题的独特性质。 作为一篇信息学的论文, 本文将着重讨论与组合游戏有关的相关算法和这些 算法时间复杂性分析, 而不是游戏论中的一些经典的理论、典型的游戏实例或者 一些存在性的证明。 “k 倍动态减法游戏”在 k 为一般正实数的情况,在 2002 年的国家集训队 论文中已经给出 O(S3)的算法,本文将在第 4.1 节给出一个优化到 O(S)的算法。 “Nim 积”运算是利用 SG 函数解决游戏论问题的必要工具之一。本文将在 第 4.4.5 节给出一个 O(log2x)的计算“Nim 积”的算法。 2008 年的 BOI(Baltic Olympiad in Informatics)中 knight 一题就是游戏论问 题,官方解答给出了 O(n3)的算法,但没有给出算法时间复杂度的证明。本文在 第 5 章提出了对这个 O(n3)的上界的质疑,并举出了质疑的确实依据,举出反例 证明了官方解答时间复杂度估计的错误之处。 同时, 本文经过对算法进一步优化, 得到了一个 O(n2)的算法。 上面这些内容都是原创的独立研究成果。
共 44 页-第 wenku.baidu.com 页
NOI2009 冬令营论文
从“k 倍动态减法游戏”出发探究一类组合游戏问题
二.问题的提出
k 倍动态减法游戏:有一个整数 S(>=2) ,先行者在 S 上减掉一个数 x,至 少是 1,但小于 S。之后双方轮流把 S 减掉一个正整数,但都不能超过先前一回 合对方减掉的数的 k 倍,减到 0 的一方获胜。问:谁有必胜策论。 根据引言部分游戏论的理论,把这个游戏抽象成数学模型,可以用一个有序 数对(m,n)来表示状态,表示当前 S 剩下 m,当前回合操作者最多可以减去 n,于 是初始状态为(S,S-1)。 对于 k=1 或 2 的情况,2002 年国家集训队的论文中已给出结论。当 k=1, 当且仅当 S 是 2 的幂次时,后手胜。当 k=2,当且仅当 S 是一个费波纳切数时, 后手胜。显然这两个判定的时间复杂度都是 O(logS),如果考虑高精度计算的话 时间复杂度是 O(log2S)。若要更进一步,找到必胜策略,并且在整个游戏过程中 维护它,这里先略去,后面会同一般的 k 的情况一起讨论。
相关文档
最新文档