博弈论的研究对象是一类游戏,有特定的模型。html
好像有个专门的名词叫作Impartial Combinatorial Games(简称ICG)函数
大概的定义以下:spa
整个游戏能够抽象成一个DAG;.net
每一个点都表明游戏过程当中的某个决策状态(特殊的,出度为0的点是游戏的终止状态);htm
每条边都表示能够从某个状态,通过直接的一次操做,转移到另外一个状态。对象
有两个玩家,从指定的某个状态开始,依次执行操做,谁先由于当前到达了终止状态而没法操做的人输。blog
由于是DAG,因此必定会转移到终止状态的。游戏
问题就是,从某状态开始,先手必胜仍是后手必胜?get
举个栗子——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或者记忆化搜索就能够快速解决了。
博弈论所涉及到的更多的游戏,会把若干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是不能解决问题的。
那怎么办?那确定是有规律啊!一眼看不出规律怎么办?可别忘了打表啊!
固然,打表也是有技巧的。至于如何如何,蒟蒻也说不出什么门道来,仍是多刷题为上上策。
#题目