- 3
- 0
- 约3.43千字
- 约 33页
- 2017-03-23 发布于江苏
- 举报
组合博弈入门预习版
ACM程序设计 李悦乔 组合博弈入门 (Simple Game Theory) 本课思路 第一部分 简单取子游戏 什么是组合游戏—— 有两个玩家; 游戏的操作状态是一个有限的集合(比如:限定大小的棋盘); 游戏双方轮流操作; 双方的每次操作必须符合游戏规定; 当一方不能将游戏继续进行的时候,游戏结束,同时,对方为获胜方; 无论如何操作,游戏总能在有限次操作后结束; 概念: P点 N点 有些地方叫必败点必胜点 P点 :前一个选手(Previous player)将取胜的位置称为必败点。 N点 :下一个选手(Next player)将取胜的位置称为必胜点。 P/N点属性 (1) 所有终结点是P点;(如果不是,转化之) (2) 从任何(N点)操作,至少有一种方法可以进入(P点); (3)无论如何操作, 从(P点)都只能进入(N点). 取子游戏算法实现—— 步骤1:将所有终结位置标记为(P点); 步骤2: 将所有一步操作能进入(P点)的位置标记为(N点) 步骤3:如果从某个点开始的所有一步操作都只能进入(N点) ,则将该点标记为(P点) ; 步骤4: 如果在步骤3未能找到新的(P点),则算法终止;否则,返回到步骤2。 实战练习(P/N态) 第二部分 Nim游戏 Nim游戏简介 有两个玩家; 有三堆扑克牌(比如:可以分别是 5,7,9张); 游戏双方轮流操作; 玩家的每次操作是选择其中某一堆牌,然后从中取走任意张; 最后一次取牌的一方为获胜方; 初步分析 (0, 0, 0) 引入概念:Nim-Sum 定义: 假设 (xm · · · x0)2 和(ym · · · y0)2 的nim-sum是(zm · · · z0)2,则我们表示成 (xm · · · x0)2 ⊕ (ym · · · y0)2 = (zm · · · z0)2, 这里,zk = xk + yk (mod 2)(k=0…m). 定理一: 对于nim游戏的某个位置(x1,x2,x3),当且仅当它各部分的nim-sum等于0时(即x1⊕x2⊕x3=0),则当前位于(P点)。 定理一的证明…… 思考(1): 有了定理一,如果判断某个游戏的先手是输还是赢? 思考(2): 对于必胜点,如何判断有几种可行的操作方案? 实例分析(HDOJ_1850) Being a Good Boy in Spring Festival 第三部分 Graph Game S-G函数 What is the graph game ? (1) 有向无环图 (2) 玩家1先移动,起点是x0 (3) 两个玩家轮流移动 (4) 对于顶点x, 玩家能够移动到的顶点集记为F(x). (5) 不能移动的玩家会输掉游戏 例: 王道:Sprague-Grundy函数 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、 mex{2,3,5}=0、mex{}=0。 王道:Sprague-Grundy函数 定义: 一个图的Sprague-Grundy函数(X,F)是定义在X上的非负函数g(x),并且满足: g(x) = mex{g(y) : y∈F(x)} SG值的重要性 P-点: 即令 g(x) = 0 的 x 点! N-点: 即令 g(x) 0 的 x 点! 实战练习(SG值) 第四部分 Sums of Combinatorial Games What is so-called ——“Sums of Combinatorial Games”? 定理二 假设游戏 Gi的SG函数是gi, i=1,…,n, 则 G = G1 + … + Gn 的 SG函数是 g(x1,…,xn) = g1(x1)⊕…⊕gn(xn). 应用: 假设有三个取子游戏叠加. 第一个: 最多可取 3 子并且共有 9 子. 第二个: 最多可取 5 子并且共有 10 子. 第三个: 最多可取 7 子并且共有 14 子. g(9, 10, 14) =? 实例分析 (HDOJ_1850) Being a Good Boy in Spring Festival (HDOJ_1536) S-Nim 附:参考源码(HDOJ-1536) #includestdio.h#includestring.h#includealgorithmusing namespace std;int k,a[100],f[10001];int mex(int p){? int i,t;? ? bool g[101]={0};? ? for(i=0;ik;i++)? ? {
原创力文档

文档评论(0)