绪论
博弈论又被称为对策论,既是现代数学的一个新分支,也是运筹学的一个重要学科。
博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。
ICG(公平组合游戏)
在算法竞赛中出现的博弈论往往是ICG(公平组合游戏 Impartial Combinatorial Games)的,这类题目有如下特征:
①有两名选手:
②两名选手交替进行,每次一步,每步都是在有限的合法集合中选取一种进行;
③在任何情况下,合法操作只取决于情况本身,与选手无关
④游戏的败北条件为:当某位选手需要进行操作时,当前没有任何可以执行的合法操作,则该选手败北。
经典的ICG博弈(四个):
一.巴什博奕(Bash Game)
问题:
一堆n个物品,两个人轮流从中取出(1~m)个,最后取光着胜(或者不能继续取的人输)
应用知识:
根据同余定理:将n改写为以下形式,n=K*(m+1)+r;(r为余数)
结论:
n=K*(m+1)+r(r为余数),如果先取者拿走r个,那么后者无论拿走(1~m)多少个,先手者只要所拿的数目的和为m+1个,那么先手就必赢(因为这样取最后一定会剩下m+1个,后者无论取多少个,先手都会是最后那个取光的人)。
反之,若n=K*(m+1),(即如果没有余数r)那么先者不管怎样都会输。
算法模板:
if(n%(m+1)) return false;
else return true;
二.威佐夫博弈(Wythoff game)
问题:
有两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取出同样多的物品,规定每次至少取一个,至多不限,最后取光着胜利。
应用知识:
利用黄金分割比:把一条线段分割为两部分,使较大部分与全长的比值等于较小部分与较大的比值,则这个比值即为黄金分割。其比值是**(√5-1):2**,近似值为0.618
结论:
首先求出差值,若差值*黄金分割比==最小值的话后手赢,否则先手赢。
算法模板:
double r=(sqrt(5.0)+1)/2; //首先求出黄金分割比 ,浮点型
int d=abs(a-b)*r; //用差值的绝对值乘上黄金分割比
if(d!=min(a,b)) return true; //若这个数不等于他们两个的最小值,先手获胜
else return false; //否则,后手胜
注意:
注意这里的黄金的分割比用的浮点型double,而差值*黄金分割比用的是整型,这里可能就会存在精度丢失的问题,所以需要注意精度问题,即问题中所给出的两堆石子的范围,如果两堆石子的范围相当大的话,需要通过高精度来计算这个double。