个人总结的博弈知识
来源:互联网 发布:网络于刷脸是什么字 编辑:程序博客网 时间:2024/06/05 04:01
在古代的时候有一种很有意思的游戏 ,有若干堆东西 ,两个人按一定的规则去取,不同的玩法有不同的输赢方式,有的以最后取完的人为胜利者,有的以最后取完的为输的人。现在让我们来看三种博弈
一.组合博奕: 有一堆东西,两个人按规则取一定的数量,最后取完的为胜利者。
先设任务a先取人物b后取,规定P点为a的必败点,N为a的必胜点,我们可以知道0点一定是P,能达到0点的一定是N
当所有操作都能到达N的为P,所以我们可以写出来三种规则。
1.终点为P 2.可以达到P的是N 3所有操作都能达到N的为P
这样我们就能把这堆东西上的每一个点是P还是N求出来
我们来看一下步骤①.把所有终结标志修改成P ②把所有能达到P的设为N ③把所有操作都能达到N的设为P
④重复二操作直到堆上的所有点都被标记为止
我们先看一个例子吧:有100个石头 每次只能取1到10个 问100这个点事必败点还是必胜点
我们先来分析:0肯定为P那么1到10为N 然后我们可以知道11这个点不管怎么操作都能到N 不管是拿一个石头还是拿10个石头 所有11为P然后因为11为P所以11到21为N以此类推 可以求出100是N还是P。
知道了这个方法巴什博奕自然就解决了。
下面我们来看威佐夫博弈: 有两堆若干个物品,两个人轮流取,每次可以去某一堆若干个或两堆都去一样的数量,最后取光者胜利。
这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示
两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们
称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,
10)、(8,13)、(9,15)、(11,18)、(12,20)。
奇异局势有三条性质:任何一个自然数都包含在一个奇异局势中。
任何一个操作都可以将奇异局势转换为非奇异局势
只要方法正确都可以讲非奇异局势转换成奇异局势。
假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了
奇异局势(0,0);如果a = ak ,b > bk,那么,取走b – bk个物体,即变为奇异局
势;如果 a = ak , b < bk ,则同时从两堆中拿走 ak – ab – ak个物体,变为奇异局
势( ab – ak , ab – ak+ b – ak);如果a > ak ,b= ak + k,则从第一堆中拿走多余
的数量a – ak 即可;如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k)
,从第二堆里面拿走 b – bj 即可;第二种,a=bj (j < k),从第二堆里面拿走 b – a
j 即可。
从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜
;反之,则后拿者取胜。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
ak = [k * (1 + √5)/2],bk = ak + k(k=0,1,2,…,n 方括号表示取整函数)
下面我们再来看nim博弈:
有若干堆物品 ,我们每次可以从一堆中拿出规则的个数,最后取走的为赢家
这种局势与二进制有着密切的关系 我们来考虑(x,y,z)为一种局势
显然(0,0,0)为一种奇异局势 不管谁面对奇异局势都是输的。(0,n,n)也是一种奇异局势
(1,2,3)也是一种奇异局势不管对手怎么取都会成为非奇异局势
计算机里面有一种模二运算1,2,3异或后是0,(0,n,n)异或后也是0,(0.0.0)异或也是0那我们就可知道如果为奇异局势异或一定为0
如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b
< c,我们只要将 c 变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)
b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要将c 变为a(+)b,只要从c中减去c-(
a(+)b即可。
下面我们来看一个游戏:题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根,
可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
我们先定义:三堆火柴如果异或为0那我们把他设为利他态T否则为利己态S
所以我们可以得出几个定理:对于任何S态,总能从一堆火柴中取出若干个使之成为T态
T态,去任何一堆都将成为S态。
S态只要方法正确必胜。
T态只要对方方法正确必输。
我们再来考虑第二个游戏
定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。
定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用T2表示;若充裕堆的堆数等于0,则称为部分利他态,用T0表示。
[定理5]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
[定理6]:S1态,只要方法正确,必胜。
[定理7]:S2态不可转一次变为T0态。
[定理8]:S2态可一次转变为T2态。
[定理9]:T2态,只能转变为S2态或S1态。
[定理10]:S2态,只要方法正确,必胜.
综上所述,必输态有: T2,S0
必胜态: S2,S1,T0.
最后讲两个重要的知识点:SG值和后继点的问题。
一个堆的SG值是什么:就是大于等于0切不等他他的后继点的最小整数。
后继点:就是进行一次操作能达到的点。比如说有100个石子,每次能拿1到10个那么它的后继点是100 - 1,100 - 2,100 - 3,100 - 4,100 - 5,100 - 6,100 - 7,100 - 8,100 - 9,100 - 10;
SG值其实就是求某一个点是P还是N如果SG为0那么就是P,如果SG>0那么久为N,运用SG值我们可以把nim博弈分成几个不同的小游戏然后去求每个堆的
SG值 然后去异或看是否为0来得出最终答案
下面写一个求SG值的模板:
#include<stdio.h>int f[100]; //记录可以取走的数量int hash1[100]; //记录哪个是最小正整数int sg[];//记录每个点的sg值int GET_sg(int x){ for(int i = 1;i < x;i++) { memset(hash1,0,sizeof(hash1)); for(j = 1;j < i;j++) { hash1[sg[i - f[j]]] = 1; } for(j = 0;j < n;j++) { if(hash1[j] == 0) { sg[i] = j; break; } } }}好了大概也就这么多了 ,博弈的进阶还是在于对sg值得理解 ,如果你想成为博弈大神 那么还是需要不断的AC的
这是几道hdu的题,还是很不错的:
ACM课作业:
1001 Brave Game
1002 Good Luck in CET-4 Everybody!
1003 Fibonacci again and again
1004 Rabbit and Grass
1005 Being a Good Boy in Spring Festival
1006 Public Sale
1007 悼念512汶川大地震遇难同胞——选拔志愿者
1008 kiki’s game
1009 Calendar Game
1010 A Multiplication Game
1011 Digital Deletions
1012 S-Nim
当你把这几道题A了之后那么恭喜你 入门了
- 个人总结的博弈知识
- 博弈知识总结
- 个人总结的一些链表知识
- 关于JavaScript知识的个人总结
- 关于Redis的相关知识个人总结
- SQL知识个人总结
- 个人前端知识总结
- 个人学习Linux知识总结
- 个人学习Linux知识总结
- 个人知识管理的一点总结和推荐
- C++程序员需要掌握的知识(个人总结)
- 关于static静态的一些知识(个人总结)
- 三种基础的博弈知识和自己的小总结
- 博弈知识
- 个人电商知识总结 名词总结
- “个人总结”最基础博弈套路,实力山寨
- 三种最基础的博弈知识模型
- 知识和博弈增强的深度学习
- 二叉树的遍历
- sudo echo x >’ 时’Permission denied’
- 自定义NSLog
- java超大文件读写
- How to do research?
- 个人总结的博弈知识
- 3维图像分割显示
- linux 使用alternatives 切换Java版本
- Mysql cluster+heartbeat+ldirector+lvs 集群解决方案
- SQL Server 存储过程
- android Installation error: INSTALL_FAILED_CONTAINER_ERROR
- android Eclipse 点击ctrl键 open declaration;open implementation;open super implementation自动关闭闪退退出
- Android导航中向上和返回(Back)的区别
- 【JAVA基础】正则表达式