开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
概念
广义博弈论
博弈论,又称为对策论(Game Theory)、赛局理论等,既是现代数学的一个新分支,也是运筹学的一个重要学科。
博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。
博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。生物学家使用博弈理论来理解和预测进化论的某些结果。
基本定义
博弈论是二人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜的目的。
海盗分金
5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。
假设每个海盗都足够聪明
,请问最后的每个海盗能分多少金币?
算法-博弈论
博弈论是算法中的一个很重要的理论,但是属于狭义的博弈论:
- 两名选手,交替进行预先规定好的操作
- 在任何情况下,合法操作只取决于情况本身,与选手无关
- 游戏失败的最终判定往往是选手无法进行合法操作了
- 博弈论的前提是双方足够聪明,即我们默认游戏双方都绝对理智,总会做出最利于自己的选择
本文主要讨论狭义博弈论,即算法中的博弈论。
经典博弈问题
巴什博弈(Bash Game)
一堆n个物品,两个人轮流从中取出1~m个,最后取光者胜(不能继续取的人输)。
同余定理:n=k∗(m+1)+r,先者拿走r个,那么后者无论拿走1 m个先者只要的数目使和为m+1,那么先手必赢。反之若n=k∗(m+1),那么先手无论怎样都会输。
if (n % (m + 1)) return false;
else return true;
斐波那契博弈(Fibonacci Nim Game)
一堆石子有n个,两人轮流取,先取者第一次可以去任意多个,但是不能取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜。
同样是一个规律:先手胜当且仅当n不是斐波那契数。
f[0] = f[1] = 1;
for (int i = 0; f[i - 1] < n; i++)
{
f[i] = f[i - 1] + f[i - 2];
if (f[i] == n) return true;
}
return false;
威佐夫博弈(Wythoff Game)
有两堆各若干物品,两个人轮流从任意一堆中至少取出一个或者从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜。
这里的必输局势:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
满足关系 a=floor((b-a)*1.618)
(floor表示向下取整,没找到向下取整符号),差值比为黄金分割比。
double r = (sqrt(5) + 1) / 2;
int d = abs(a - b) * r;
if (d != min(a, b)) return true;
else false;
详细可参考我的另一篇文章:算法题随记 chess(威佐夫博弈)
尼姆博弈(Nimm Game)
有n堆物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜。
假如有3堆物品(a,b,c) (0,0,0)状态时先手是一个必输局势因为没有东西可取,(0,n,n) 状态时也是必输局势只要后者在另一堆取得物品与前者一样多时那么前者也就是必输局势。慢分析(1,2,3)也是一个必输局势。如果我们将其转化为二进制形式并通过异或运算(^)我们会发现:
0001^0010^0011=0000
通过验证所有的堆数量累^后只要为0就都是必输局势,所以我们就只要记住这个规则:将n堆物品数量全部异或后结果为0先手必败,否则必胜。
int res = 0;
for (int i = 1; i <= n; i++)
res ^= arr[i];
if (res) return true;
else return false;
问:但是,实际问题中不可能给出如此标准的博弈模型,对于更加一般的博弈问题,我们该如何求解呢?
答:通过SG函数转换为尼姆博弈。
SG函数
首先给出一种ICG博弈游戏模型,给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿着有向边进行移动,无法移动者判负。
将ICG问题进行转化:任何一个ICG都可以通过把每个局面看作一个顶点,对每个局面和它的子局面连一条有向边来抽象这个“有向图游戏”。
于是我们将ICG问题转化为上述这个游戏,再通过寻找这个游戏的一般解法来处理ICG问题。
首先定义mex(minimal excludant)运算,这是定义于一个集合的运算,表示最小的不属于这个集合的最小非负整数。例如mex{0,1,2,4}=3,mex{2,3,4}=0,mex{}=0.
SG函数(Sprague-Grundy):对于一个给定的有向无环图,定义关于这个图的每个顶点的SG函数如下:
SG函数的求法:
- 找出必败态
- 找出当前所有状态的前驱结点
- 根据定义计算结点SG值
- 重复上述步骤,直到整棵树建立完成
SG定理
我们可以定义有向图游戏的和。设G1,G2,...Gn为n个“有向图”游戏的和(Sum),游戏G的移动规则是:任选一个子游戏Gi并移动上面的棋子。SG定理就是:sg(G)=sg(G1)∧sg(G2)∧....∧sg(Gn)。也就是说,游戏的SG函数值就是它的所有子游戏的SG函数值的异或。
因此,当我们面对n个不同游组成的游戏时,只需要求出每个游戏的SG函数值,把这些SG值都看作Nim的石子堆,然后依照找Nim游戏的必胜策略的方法来找这个游戏的必胜策略。