• 博弈进阶


    储备知识:
      贾志豪:《组合游戏略述——浅谈SG游戏的若干拓展及变形》

         http://wenku.baidu.com/view/25540742a8956bec0975e3a8.html

      王晓珂:《 解析一类组合游戏》

      核心策略:归纳,分解,转化 组合游戏

    以下题目如阶梯般一步步揭开博弈神秘的面纱~^~,也是对博弈由浅入深的一步步学习之路

    从Nim小博弈开始 :尼姆博弈

    取石子游戏即著名的 nim 游戏,游戏规则如下:
      桌子上有 N 堆石子,游戏者轮流取石子。
      每次只能从一堆中取出任意数目的石子,但不能不取。
      取走最后一个石子者胜。
    这道题每一堆石子的 SG 函数值很显然为该堆石子的数目,根据 SG 函数的特点,最后所有
    堆石子的 SG 函数的和
        SG=SG1^SG2……SGn
    最后,先手胜当且仅当该值不为 0
    尼姆博弈介绍

      1.理解SG函数,熟悉异或xor(^)操作

        题目:hdu2176:取(m堆)石子游戏

    #include<stdio.h>
    int a[210000];
    int main()
    {
        int m,ans;
        int i;
        while(scanf("%d",&m)!=EOF&&m)
        {
            ans=0;
            for(i=0;i<m;i++)
            {
                scanf("%d",&a[i]);
                ans^=a[i];
            }
            if(ans)
            {
                printf("Yes
    ");
                //printf("#%d
    ",ans);
                for(i=0;i<m;i++)
                {
                    int tmp=ans^a[i];//^tmp之后会为0
                    if(a[i]>=tmp)
                    {
                        printf("%d %d
    ",a[i],tmp);
                    }
                }
            }
            else printf("No
    ");
        }
        return 0;
    }
    View Code

        结论:sg[x]==0,当且仅当x为必败状态(SG,与Anti-SG游戏区别)。

      2.Anti-SG 游戏和 SJ 定理

         [定义](anti-nim 游戏)

         桌子上有 N 堆石子,游戏者轮流取石子。
         每次只能从一堆中取出任意数目的石子,但不能不取。
         取走最后一个石子者败。
        [结论]
        先手必胜当且仅当:
        (1)所有堆的石子数都为 1 且游戏的 SG 值为 0;
        (2)有些堆的石子数大于 1 且游戏的 SG 值不为 0。

        题目:hdu 1907: John 

    #include<stdio.h>
    int main()
    {
        int t,n,x,flag,ans;
        int i,j;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            flag=1;
            ans=0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&x);
                ans^=x;
                if(x>1)flag=0;
            }
            if((flag&&!ans)||(ans&&!flag))printf("John
    ");
            else printf("Brother
    ");
        }
        return 0;
    }
    View Code

     一般的Anti-SG游戏:

        [定义]
         Anti-SG 游戏规定,决策集合为空的游戏者赢。
         Anti-SG 其他规则与 SG 游戏相同。
        [定理](SJ 定理)
        对于任意一个 Anti-SG 游戏,如果我们规定当局面中所有的单一游
        戏的 SG 值为 0 时,游戏结束,则先手必胜当且仅当:      

        (1)游戏的 SG 函数不为 0 且游戏中某个单一游戏的 SG 函数大于 1;

        (2)游戏的 SG 函数为 0 且游戏中没有单一游戏的 SG 函数大于 1。

     几种组合游戏模型的转化:

      1.Cutting Edges游戏(树)

      规则如下:

         给出一个有 N 个点的树,有一个点作为树的根节点。     

         游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走。

         谁无路可走谁输。
      我们有如下定理:
        叶子节点的 SG 值为 0;中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的异或和。

      练习:hdu 3590  PP and QQ                题解

      

      树中加边形成环的情况:

      题目大意:
         有 N 个局部联通的图。
         Harry 和 Sally 轮流从图中删边,删去一条边后,不与根节点相
          连的部分将被移走。Sally 为先手。
         图是通过从基础树中加一些边得到的。
         所有形成的环保证不共用边,且只与基础树有一个公共点。
         谁无路可走谁输

      解决办法(奇偶去环):

          (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的

      两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所
      以它的 SG 值为 1;
        (2) 对于长度为偶数的环,去掉其中任意一个边之后,剩下的
      两个链长度异奇偶,抑或之后的 SG 值不可能为 0,所以它
      的 SG 值为 0;

      

      练习  POJ 3710  Christmas Game         题解

      2.无向图的删边游戏

      无向图的删边游戏:

         一个无相联通图,有一个点作为图的根。
         游戏者轮流从图中删去边, 删去一条边后,不与根节点相连的部
          分将被移走。
         谁无路可走谁输。

      一个著名的定理——Fusion Principle

      [定理]
        我们可以对无向图做如下改动:将图中的任意一个偶环缩成一个新
        点,任意一个奇环缩成一个新点加一个新边;所有连到原先环上的边全
        部改为与新点相连。这样的改动不会影响图的 SG 值。

       3.翻硬币游戏

      一般的翻硬币游戏的规则是这样的:

         N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开
        始对硬币按 1 到 N 编号。
         游戏者根据某些约束翻硬币(如:每次只能翻一或两枚,或者每
        次只能翻连续的几枚),但他所翻动的硬币中,最右边的必须是
        从正面翻到反面。
         谁不能翻谁输。
      这样的结论: 局面的 SG 值为局面中每个正面朝上的棋子单一存在
      时的 SG 值的异或和

      $$补充翻硬币游戏约束条件¥¥

       4.Every-SG游戏

        何为Every-SG游戏???

        有N个单一游戏,游戏者轮流进行决策;

        游戏者的决策必须满足:

        对于所有还没有结束的单一游戏,游戏者必须对该单一游戏进行一步操作;

        无路可走者输

      

      贪心策略:

        对于某一个单一游戏,如果当前是先手必胜局,

        那么先手不会放弃游戏的胜利!!! 那么,

        游戏者需要做的,就是让自己可以取得胜利的游戏尽可能长的玩下去,

        让自己不能取得胜利的游戏尽可能短的玩下去!!!

      解决方法:

         对于SG值为0的点,我们需要知道最少几步能将游戏带入终止状态 ;

         对于SG值不为0的点,我们需要知道最多几步游戏会被带入终止状态 ;

         以上两个值,我们都用step来表示

      结论:

        先手必胜当且仅当step值最大的单一游戏为先手必胜游戏

      思考:

        step值最大的既有先手必胜游戏,又有先手必败游戏时,是否意味着平局???

  • 相关阅读:
    每天都感觉很疲劳
    如果你决定要自己营销
    昨天忘记写日记了,今天补充一下!
    终于不用再去北仑了
    良好的程序架构
    最近的天气反复无常
    就这么着
    C# Socket 入门3 UPD
    让程序只启动一次 Mutex
    C# Socket 入门2
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3352161.html
Copyright © 2020-2023  润新知