SG函数定义:SG(x) = mes(S),mes为集合运算,表示集合中没出现的最小非负整数。
其中S为SG(x)的所有后继状态的SG函数值的集合,这是一个递推的运算式子,可知终态SG(t) = 0,因为终态t的后继状态是一个空集。
公平的组合游戏,如取石子游戏,如果将状态和后继状态抽象出来建图,构成的是一个DAG图。
什么是博弈的状态:如下一盘棋时,当前的棋局就是一个状态,你的决策:移动哪个棋子,会使得棋局进入另外一个状态。取石子游戏中,当前剩余的石子数就是一个状态,当你拿掉某一堆石子中的某几颗石子后,就会进入下一个状态,下一个状态称为当前状态的后继状态。可知组合游戏的状态图一定是一个DAG图,无论如何博弈进行,游戏最终会走向一个终态,而终态没有后继状态。
必败态和必胜态概念:
在组合游戏博弈中存在必败态和必胜态的这样的概念,对于游戏的所有可能状态,每一个状态都是必败态或必胜态。只要采取最优的决策,处于必胜态的人可以永远处于必胜态。
必败态:当前状态的所有后继状态都是必胜态,则当前状态是必败状态。
必胜态:当前状态中有一个后继状态是必败态,则当前状态是必胜状态。
假设游戏的两人都绝顶聪明,游戏过程中状态的变化就是:必胜态 -> 必败态 -> 必胜态…,交替出现的场景(不够聪明的情况可能会连续出现必胜态)。
显然终态是必败态,可以采用逆推的方式推出其他的状态是必败态还是必胜态,以判断当前状态是先手赢还是后手赢。(竞赛中可以通过打表来求得当前状态的性质)
单个游戏很容易求得必败态和必胜态,多个游戏呢?首先介绍一下游戏和(多个游戏组合的游戏)
什么是多个游戏组合的游戏?例如取石子游戏,如果只有一堆石子,就是单个的游戏,如果有n堆石子,就是多个的游戏和(每一堆都是一个游戏)。
这里要用到SG函数了,来看下SG函数的作用:
SG函数的作用:SG函数取值为0当且仅当当前状态为必败态。终态SG函数值显然是0,其它状态可以用递推的方式求出,对于每一个状态枚举所有的后继状态。
SG函数要借助SG定理才能发挥它的作用,对于单个组合游戏,可以直接求得当前状态是必胜态还是必败态,而对于多个组合游戏组合的组合游戏,有SG定理:游戏和的SG函数值等于各子游戏SG函数的NIM和(NIM和表示异或和)。
例如有3堆石子的取石子游戏:当前状态x,y,z 的sg函数值为 sg[x] ^ sg[y] ^ sg[z]