博弈论
来源:互联网 发布:js仿ios日期选择器 编辑:程序博客网 时间:2024/06/06 06:53
巴什博奕(Bash Game)
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜.
威佐夫博奕(Wythoff Game)
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
尼姆博奕(Nimm Game)
有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
一、必败点(P点)和必胜点( N点)
必败点(P点):前一个选手将取胜的位置,意思是说当某人位于P点时,此人必败。
必胜点(N点):下一个选手将取胜的位置,意思是说当某人位于N点时,此人必胜。
二、必败(必胜)点属性
① 所有终结点是必败点(P点);
②从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);
③无论如何操作, 从必败点(P点)都只能进入必胜点(N点)。
三、状态标记的步骤
步骤1:将所有终结位置标记为必败点(P点);
步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)
步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;
步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。
四、Graph Games & Sprague-Grundy Function
可以用一个有向无环图(From)来表示游戏的状态:
由上面的“二、必胜/败点属性”,我们可以归纳出:
①一个没有出度的点是P状态点;
②一个点是P状态当且仅当该点任何后继都是N状态;
③一个点是N状态当且仅当该点存在后继是P状态。
Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数,节点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数。设mem为求得这个最小自然数的函数,同时,称该最小自然数为最小排斥值。
P状态点的Grundy值为0。
令N = {0, 1, 2, 3, …} 为自然数的集合,S为一个有限子集,且S ⊂ N;
则:mex S = min (N S)。
先将所有P点的Grundy值都标记为0;
N1:因为后继只有0,所以Grundy值为1;
N2:因为后继有0、1(N1),所以Grundy(N2)=mem(Grundy(N1),0)=2;
N3:因为后继有0、2(N2),所以Grundy(N3)=mem(Grundy(N2),0)=3。
记点v的Grundy值为g(v),令图为G(v,e),则Sprague-Grundy函数满足两个重要性质:
①点v是一个P-状态当且仅当g(v)=0
②如果G = G1 + G2 且 v = v1v2 是G的一个状态,那么g(v) 为g(v1) 和 g(v2) 在二进制下的异或:即g(v) = g(v1) ⊕ g(v2)。运算⊕也称作nim和。
自己整理的Nim游戏中求SG值的模板函数:
int x,k,a[MAXN];//x是总数,k是a中元素的个数,a是可以取的数目bool sg[MAXN];//SG值void solve(){ sg[0]=false; for(int j=1; j<=x; ++j) { sg[j]=false; for(int i=0; a[i]<=j&&i<k; ++i) if(!sg[j-a[i]]) sg[j]|=!sg[j-a[i]]; } if(sg[x]) puts("Alice");//最后取光的 else puts("Bob");}
N堆:
int n;//n堆int k;//可取情况的数目int x[MAXN];//n堆分别的数目int a[MAXN];//可取情况int sg[MAXN];//等价于Nim中的石子数void solve(){ sg[0]=0;//轮到自己还剩0枚时是必败态 int Max=*max_element(x,x+n); for(int i=1; i<=Max; ++i) { set<int>s;//存储当前所能到达状态的sg值 for(int j=0; j<k; ++j) if(a[j]<=i) s.insert(sg[i-a[j]]); int cnt=0;//寻找当前状态的最小排斥值 while(s.count(cnt)!=0)//返回值为cnt的元素个数 ++cnt; sg[i]=cnt; } int res=0; for(int i=0; i<n; ++i) res^=sg[x[i]]; if(res)puts("Alice");//先手必胜 else puts("Bob");}
以上来自:http://blog.csdn.net/mikasa3/article/details/51366884
各种博弈及题目:http://endless.logdown.com/posts/2014/05/05/find-out-the-winning-strategies-of-the-game-nim-and-grundy-number-notes
博弈知识总结及相应题目:http://www.wutianqi.com/?p=1081
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 【博弈论】
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 博弈论
- 多层感知机(multi-layer perceptron)实现手写体分类(TensorFlow)
- 快速幂
- 基于以太坊实现代币发布
- 让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)
- Maven入门1-在Eclipse中新建Maven Web项目
- 博弈论
- Activiti工作流
- 黑盒测试方法二
- java8 collect操作函数列表
- 线程池
- 创建型-原型模式(prototype)
- B.FRIENDit壁虎忍者GC05电竞椅
- JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解
- 点、线导出含高程值的表格