博弈论总结(只会打表,永不证明)(博弈论)

概述

博弈论的研究对象是一类游戏,有特定的模型。

基础模型——先手必胜还是后手必胜?

好像有个专门的名词叫做Impartial Combinatorial Games(简称ICG)

大概的定义如下:

整个游戏可以抽象成一个DAG;

每个点都代表游戏过程中的某个决策状态(特殊的,出度为0的点是游戏的终止状态);

每条边都表示可以从某个状态,经过直接的一次操作,转移到另一个状态。

有两个玩家,从指定的某个状态开始,依次执行操作,谁先因为当前到达了终止状态而无法操作的人输。

因为是DAG,所以一定会转移到终止状态的。

问题就是,从某状态开始,先手必胜还是后手必胜?


举个栗子——Nim游戏的一个变种

有一堆\(n\)个石子,每次可以取\(1-k\)个,当前无法操作的人输,问是否先手存在必胜策略?

对于这种问题,对于以每个状态为起点的情况,我们都会唯一确定是先手必胜还是后手必胜。

这应该是很好想,几乎不用证明的。

可以对每个点标记两种状态N和P,分别表示先手必胜和后手必胜

首先根据定义,终状态为P

然后,所有能直接到达终状态的状态就为N了

进一步推广,如果某点的出边指向的点的集合中,有至少一个点为P,那么这个点为N;否则就为P。

比如对于上面提到的栗子

对每个状态都标号为当前剩余石子数

那么\(0\)是P,\(1-k\)就都是N,\(k+1\)是P。。。。。。

接着就可以推出当且仅当\((k+1)\mid a\)时a是P。

对于这种基础的问题,枚举状态建好图后DP或者记忆化搜索就可以快速解决了。

模型升级——SG函数与SG定理

博弈论所涉及到的更多的游戏,会把若干ICG拼凑在一起,成为一个规模更大的模型。

比如说上面那个Nim游戏变种的升级版——

\(n\)堆石子,每堆\(a_i\)个,每次可以取\(1-k\)个,当前无法操作的人输,问是否先手存在必胜策略?

这时候,如果仍沿用上面的方法求解,我们会发现状态维度很大,时间和空间根本承受不了。

这里介绍SG函数与SG定理,详细证明就算了,我太弱了。

strangedbly巨佬的博客给出了十分易懂的证明,个人力荐。

定义运算\(mex(S)\)(S是一个自然数集合),结果为S中未出现的最小自然数。

定义\(SG(i)\)(i是一个状态,在图中是一个点)为对所有\(i\)可直达状态(在图中与i通过有向边连接的所有点)的SG函数值取mex的值,即。

\[SG(i)=mex({j\mid SG(j),(i,j)\in G}) \]

定义SG定理:点\(i\)为P当且仅当\(SG(i)=0\)

若干ICG(可以不相同)组合在一起的游戏,把每个游戏的SG值异或起来,不为0则先手必胜。


接着对例子分析一下。

可以发现,对于单堆石子来说,剩零个时\(SG\)值为\(0\),剩一个时为\(1\)。。。剩\(k\)个为\(k\),剩\(k+1\)个时因为不能转移到零个,\(SG\)值又变成了\(0\)。。。。。。

这可以说明SG函数对于判断状态为N还是P是非常有效的。

那么对于若干堆石子(即整个升级版游戏)来说,胜负又会如何呢?只要把这若干个\(SG\)值都异或起来就完全OK啦。

实现

简单的ICG可直接通过递推、DP等方法推导出所有点的状态。当然,如果找到规律,可以直接\(O(1)\)判断都说不好。

多个ICG的组合游戏,则一定是离不开SG函数的。

但假如点非常多,或者每个点的后继确定起来非常麻烦的时候,DP是不能解决问题的。

那怎么办?那肯定是有规律啊!一眼看不出规律怎么办?可别忘了打表啊!

当然,打表也是有技巧的。至于如何如何,蒟蒻也说不出什么门道来,还是多刷题为上上策。

题目

posted @ 2018-03-28 17:35  Flash_Hu  阅读(3949)  评论(6编辑  收藏  举报