博弈论入门笔记

本文介绍了博弈论的基础知识,包括从小学奥数的石子游戏开始,逐步深入到巴什博弈、尼姆博弈、反尼姆博弈、公平组合游戏、SG函数等内容。通过对各种游戏策略的分析,揭示了先手必胜或必败的条件,如尼姆博弈中的异或和策略。文章还探讨了阶梯尼姆、斐波那契博弈和威佐夫博弈,阐述了如何判断游戏的胜负和最优策略。
摘要由CSDN通过智能技术生成

从小学奥数开始

给定一堆石子, 共n个石子,两个玩家轮流取石子, 每次只能拿1个或2个或3个石子. 不能取石子的一方输. 问先手有无必胜策略.

解:

当且仅当n不为4的倍数的时候, 先手有必胜策略.

我们可以将游戏的局面(即当前剩余的石子个数 x x x)分成两类, x%4==0和x%4!=0, 不妨分别称之为P局面(必败局面)和N局面(必胜局面).

当拿到N局面时,玩家可以将N局面改变成P局面; 当拿到P局面的时候, 玩家只能将P局面改成N局面. 最终 x = 0 x=0 x=0这个最终局面落在P局面.

如下图所示:

在这里插入图片描述

巴什博弈(Bash Game)

让我们对上面的小学奥数题进行推广.

给定一堆石子, 共n个. 两个玩家轮流取石子, 每次至少取一个, 至多取m个. 不能取石子的输. 问给定n, m, 先手是否有必胜策略.

解:

当且仅当, n不为(m+1)的倍数时, 先手有必胜策略. 推理过程如上.

尼姆博弈(Nim Game)

给定n堆石子. 每堆石子有 a i a_i ai个石子. 两个玩家轮流取石子. 每回合选定一个堆, 至少取一个石子, 至多把选定的这一堆石子取完. 无法取石子的一方判负. 问, 给定n和数组a, 先手是否有必胜策略.

解:

请先了解异或操作.

直接给出结论: 当且仅当, n堆石子的异或和不等于0时, 先手有必胜策略.

我们考虑上面的小学奥数题, 我们把整个游戏的局面抽象成了两种, 并且让必败局面的后继有且仅有必胜局面.

受到这个的启发, 我们尝试将尼姆博弈的局面也抽象成两种. 即, 石子堆的异或和为0 和 不为0.

让我们称异或和为0时, 为必败局面; 异或和不为0时, 为必胜局面.

我们有以下三点性质:

  1. 最终局面, 即没有石子可取的时候, 所有石子堆的石子数都为0, 所以异或和自然也为0. 也就是说, 最终局面可以被纳入必败局面中.
  2. 石子堆的异或和为0时, 无论在一个石子堆种取多少石子, 异或和都不会为0. 由异或的性质不难得出.
  3. 石子堆的异或和不为0时, 总有一种取法, 使得取完之后异或和为0. 由异或的性质不难得出.

于是, 归纳一下, 我们得出下图:

在这里插入图片描述

Note: 尼姆博弈是十分重要的, 很多博弈都可以转换成尼姆游戏的变形. 实际上, 所有公平组合游戏都可以看成尼姆博弈的变形.

反尼姆博弈(Anti-Nim Game)

给定n堆石子. 每堆石子有 a i a_i ai个石子. 两个玩家轮流取石子. 每回合选定一个堆, 至少取一个石子, 至多把选定的这一堆石子取完. 取到最后一个石子的一方判负. 问, 给定n和数组a, 先手是否有必胜策略.

解:

我们看到反尼姆博弈和尼姆博弈的唯一区别点就是, 最后的胜利条件是相反的.

同样先给出结论再证明:

先手有必胜策略, 当且仅当:

  1. 所有堆的石子数都为1, 且异或和为0.
  2. 或者, 至少有一堆石子数大于1, 且异或和不为0

条件1的正确性是显然的, 当条件1成立的时候, 场上有偶数堆石子数为1的石子, 一人一个, 自然先手获胜.

对于条件2, 也就是至少有一堆石子数大于1, 我们分两种情况来讨论

  1. 当异或和不为0时: 若还有两堆石子数目大于1, 我们把异或和变为0; 若只有一堆石子数目大于1, 我们总可以使得场上只剩下奇数堆的1.
  2. 当异或和为0时, 无论怎么取, 异或和总不为0. 注意, 由异或的性质可得 ,异或和为0时, 至少有两堆石子数目大于1.

状态转移如下图所示:

在这里插入图片描述

公平组合游戏

当且仅当下列条件全部满足的时候, 是公平组合游戏:

  1. 游戏有两个人参与, 两人轮流做出决策, 双方都知道游戏的完整信息.
  2. 任意一个游戏者在某一个确定状态下可以做出的决策集合只与当前状态有关, 与游戏者无关.
  3. 游戏中的一个状态不可以多次抵达, 游戏以玩家无法移动结束.
  4. 游戏一定在有限步内结束, 没有平局.

上面讨论的巴什博弈, 尼姆博弈, 反尼姆博弈都是公平组合游戏.

有的同学可能有疑惑, 上面的三种博弈模型中, 同一个状态被多次到达了, 貌似违反了一个状态不能多次到达的定义.

其实不是的, 上面的状态实际上是某一群特定状态的集合. 例如在巴什博弈中, n = 13 n=13 n=13是一个确定状态, 而 n % ( m + 1 ) = 0 n\%(m+1)=0 n%(m+1)=0是一类特定状态.

公平组合游戏都可以用 S G SG SG函数求解,因此又称为 S G SG SG组合游戏。

SG函数

下面介绍公平组合游戏中的一个非常有用的工具——SG函数。

SG函数是对博弈中的每个状态(节点)的评估函数,定义如下:

s g ( v ) = m e x { s g ( u ) ∣ 状 态 u 是 状 态 v 的 后 继 } sg(v) = mex \{sg(u)|状态u是状态v的后继\} sg(v)=mex{ sg(u)uv}

其中 m e x ( S ) mex(S) mex(S)函数的意义为,不属于集合 S S S的最小非负数。

当且仅当,某个状态的SG函数为0时,该状态必败。

这看起来十分地抽象,我们不妨以SG函数来分析我们熟悉的Nim博弈看看。

再探Nim博弈

我们首先来考虑特殊形况下的尼姆博弈——只有一堆石子的尼姆博弈。

当我们有一堆石子,记这一堆石子的总数为 a 1 a_1 a1。我们可以发现,这一堆石子的后继是 { 0 , 1 , 2 , . . . , a 1 − 1 } \{0,1,2,...,a_1-1\} { 0,1,2,...,a11},不难发现单堆石子的SG函数就是该堆石子的石子数。

接着,我们给出一个定理:

SG定理:

如果一个游戏等价于,若干个公平组合游戏同时进行且每次只能对某个公平组合游戏进行单次操作,那么,该游戏的某个局面的SG函数等于其所有子游戏的SG函数的异或和。

根据SG定理,我们不妨将一般的尼姆博弈看作若干个只有一堆石子的尼姆博弈,这时整个游戏的SG函数等于所有堆石子数的异或和。

于是,我们从SG函数的角度将Nim游戏又推了一遍。

我的理解是:SG函数就是将一个公平组合游戏抽象成Nim游戏的工具。

阶梯尼姆

问题引入:

A和B喜欢玩博弈游戏。他们在一个阶梯上的层阶都放上了若干个石子( ≥ 0 \ge 0 0)。现在A和B轮流进行以下操作:选定阶梯上的任意一层,然后移动至少一个石子到相邻的较低层。无法进行操作(所有的石子都被移动到了地板上)的人输掉游戏。给定一个初始状态,问谁赢?(试求 O ( n ) O(n) O(n)的算法)

例,给定五个层的阶梯,从高到低分别由5,4,3,2,1个石子,如下图。

在这里插入图片描述

分析:

这个问题可以通过适当的变形成为尼姆博弈。

考虑必胜策略如下:

当奇数层的石子数的异或和不为0时,先手胜。

这是因为如果奇数层的石子数的异或和不为0时,先手可以一步使得其为0。

如果遇到奇数层石子数的异或和为0时,不论是加(将偶数层的石子移到奇数层),还是减(将奇数层的石子移到偶数层或者地面),都不能做到维持石子数的异或和为0.

不难看出这是和尼姆游戏一个概念的东西。

例题:

POJ1704

简述:

A和B玩游戏。在一个 1 ∗ n 1*n 1n的棋盘上共有m个棋子,A和B轮流进行操作:选择一个棋子,并向又移动,不允许跨过任何棋子和移出棋盘。

分析:

我们把每个棋子目前所能走的步数单独拿出来做为一个数组b,不难看出,进行一次操作就是将前一枚棋子可走的步数让渡给下一枚棋子,这是标准的阶梯尼姆。

于是我们通过适当变形即可将本题化为阶梯尼姆。

代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 2005;
int a[N];
void solve()
{
   
    int n; scanf("%d",&n);
    for(int i = 1; i <= n; i++) scanf("%d", a+i);
    sort(a+1, a+n+1);
    for(int i = n; i; i--) a[i] = a[i] - a[i-1] - 1;
    int sum = 0;
    for(int i = n; i > 0; i -= 2) sum ^= a[i];
    if(sum == 0) printf("Bob will win\n"); // 先手败
    else printf("Georgia will win\n"); //先手胜
}
int main()
{
   
    int T; scanf("%d",&T);
    while(T--) solve();
    // system("pause");
}

斐波那契博弈

问题引入:

取石子

1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".

分析:

观察发现,当n为斐波那契数时,先手必败。

证明如下:

设n为第i位斐波那契数,记为 f i f_i fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值