zoukankan      html  css  js  c++  java
  • 博弈

    先占个坑 等做了题再慢慢添加东西

    先来个干货 大神的博弈小结

    做个笔记:

    规定: 利己状态定义为T(非奇异局势)

              利他状态定义为S(奇异局势)

    重要结论: T可转化为(S,T),S只能转化为(T) 非奇异局势一定可以转化为奇异局势和非奇异局势,而奇异局势只能转化为非奇异局势

     博弈类题目小结(HDU,POJ,ZOJ)

    经典博弈:

    1.Bash Game 巴什博弈

    有一堆数量为n的石子 2个人轮流取m(m>=1&&m<=n)个石子,取完者获胜

    我们可以很容易的找到一个必败态 (下文必胜必败都是针对先手)即n=m+1时

    因为无论先手取多少石子,后手都可以取完

    然后我们可以假设一个必败态 n=(m+1)*k(k=1,2,3....)

    证明:

    当k=1时显然成立

    当k=2时,无论先手取多少石块,后手都可以使状态达到n=m+1 即k=1的状态

    当k=3时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*2 即k=2时的状态

    。。。

    当k=x时,无论先手取多少石块,后手都可以使状态达到n=(m+1)*(x-1) 即k=x-1的状态

    证毕,假设成立

    由此我们可以得到一个结论 即 在Bash Game中

    n=(m+1)*k(k=1,2,3...)先手必败

    n=(m+1)*k+s(k=1,2,3...1=<s<=m) 先手必胜

    2.Wythoff Game 威佐夫博弈(转自Demon

    有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取完者得胜。这种情况下是颇为复杂的。

    可以用两个数(a[k],b[k])(ps:(a[k]≤b[k])k为一个自然数)表示两堆物品的数量。如果该数量为奇异局势,那么先手输;

     前几个奇异局势如下:(0,0,)、(1,2)、(3,5)、(4,7)、(6,10)······起始值a[0]=b[0]=0;k=0;

    可以看出a[k]是在之前未出现过的最小自然数,而b[k] = a[k]+k,k代表出现的第几个奇异局势;

     性质:

     1.任何自然数都包含在一个且仅有一个的奇异局势中。

     证明:若(a[k],b[k])为一个奇异局势,因为b[k]=a[k]+k,a[k]>a[k-1]  =》  b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].

     2.任何操作都会将奇异局势变成非奇异局势

     由性质1可知,即使是同时减少,两个数的差值不变,所以不可能成为其他奇异局势的差,因此也是非奇异局势;

     3.可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;

    结论:两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

    那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?

    我们有如下公式:a表示第一堆的个数,b表示第二堆的个数,c表示二者之差,当然a必须小于b;

    再找规律的话我们会发现,a= c* 1.618 

    而1.618 = (sqrt(5)+ 1) /  2 。

    大家都知道0.618是黄金分割率。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!

    HDU1527

    AC代码 直接用1.618会wa 不知道为什么 还是用 (sqrt(5.0)+1.0)/2.0;

     1 #include "stdio.h"
     2 #include "cmath"
     3 #define min(a,b) a < b ? a : b
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int a,b,c,m;
     9     while(scanf("%d%d",&a,&b)!=EOF)
    10     {
    11         m=min(a,b);
    12         int p=(int)(abs(a-b)*(sqrt(5.0)+1.0)/2.0);
    13         printf("%d
    ",m==p ? 0 : 1);
    14     }
    15     return 0;
    16 }
    View Code

    3.Nimm Game 尼姆博弈

    n堆石块 每堆xi块 每次可以取走一堆的任意块 或者同时取走2堆的数量相同的石头

    这里可以用异或大家都知道 可是为什么可以用异或 在这里讨论一下

    先了解一下异或运算--

    异或又称做没有进位的加法 故名思意 例如二进制 1+1 = 10 不进位 则 1+1=(1) 0 == 0 ,1+0=1,0+1=1,0+0=0;

    那么在尼姆博弈里异或 的意义是什么呢?

    又异或性质可知,一个数异或本身等于0,也就是2个相同的数异或和为0,任意数异或0等于它本身

    也就是说,在尼姆博弈里,如果出现了2个相同数量的石堆,那么他们之间异或等于0,也就是可以理解为2堆数量相同的石堆无论数量多少对博弈的结果没有影响 

    如果还不太理解我们可以这样理解;

    假设有n堆石块,且这n堆石块数量各不同,现在加入2堆数量相同的石块

    现在单独讨论这2堆石块,假设在第一堆中 A为先手,且A最终拿完这一堆(无论中间过程怎么拿),然后在另一堆中变成了B为先手,显然在这一堆中B最终能拿完这一堆

    现在回到整个博弈,B拿完第二堆的时候A变成了先手,是不是回到了最开始,感觉很神奇?其实不,仔细想一想是可以想明白的

    同理出现过偶数堆的都对结果没有影响

  • 相关阅读:
    CentOS6.5 [ERROR] /usr/libexec/mysqld: Can't create/write to file '/var/lib/mysqld/mysqld.pid' (Errcode: 2)
    linux防火墙
    Linux磁盘分区与LVM详解
    LVM分区扩展空间
    linux 分区方法(超过2T的硬盘)
    linux异常处理:selinux配置错误导致无法重启
    linux网卡配置文件
    Zabbix4.0系统clone、mass update使用
    Zabbix系统配置日志监控告警--关键字触发
    Zabbix4.0系统配置事件通知
  • 原文地址:https://www.cnblogs.com/max88888888/p/6016914.html
Copyright © 2011-2022 走看看