您当前的位置: 首页 >  算法

博弈论算法常见模型整理

Lusfiee 发布时间:2022-07-09 23:56:24 ,浏览量:3

博弈论

文章目录
  • 博弈论
    • 一、内容简介
    • 二、前置概念
      • 1.ICG
      • 2.博弈图
      • 3.P点、N点
      • 4.mex函数
    • 三、前置定理
    • 四、四大经典组合游戏
      • 1.Nim游戏
      • 2.Bash游戏
      • 3.Wythoff游戏
      • 4.Fibonacci游戏
    • 五、SG函数
      • 1.SG函数
      • 2.SG定理
      • 3.简单应用
    • 六、SG游戏及拓展
      • 1. A n t i − S G Anti-SG Anti−SG 游戏
      • 2. M u l t i − S G Multi-SG Multi−SG 游戏
      • 3. E v e r y − S G Every-SG Every−SG 游戏
      • 4.翻硬币游戏
      • 5.无向图删边游戏
    • 七、致谢与感悟

一、内容简介

本文主要介绍算法竞赛中常常出现的博弈论模型,包括:

  1. 4个经典组合游戏
  2. SG函数
  3. SG游戏及拓展
二、前置概念

进一步学习需要了解一些前置概念

  1. ICG
  2. 博弈图
  3. P点、N点
  4. mex函数
1.ICG

ICG全称为“公平组合游戏”,我们下面讨论的博弈游戏均建立在ICG的基础上,那么什么是ICG呢,它需要满足以下条件:

  • 由两名玩家交替行动
  • 对任意局面,接下来可执行的行动仅与局面有关(玩家平等)
  • 游戏以玩家无法行动为结束,且无平局

那么称此游戏为“公平组合游戏”

2.博弈图

我们可以看到,整个过程是各个状态的集合,且状态间可以到达,那么我们可以将这个博弈过程抽象为一张图,称为博弈图,这个游戏我们也称之为有向图游戏

那么这个图是一个有向无环图,图中有唯一的起点,可能有多个终点,两名玩家的交替行动可认为是图上的有向边,所有出度为0的节点便是终点

对于这个图,每个节点存储如下信息:{弈盘信息x,先手信息p,…}等

同时有如下结论:任何一个公平组合游戏均可以转化为有向图游戏

3.P点、N点

P点和N点是博弈里面两个及其重要的概念

  • 先手必胜状态:先手行动后,可以将一个必败状态留给后手
  • 先手必败状态:先手无论如何行动,只能将必胜状态留给后手
  • 必败点(P点):前一个选手取胜,当前选手将败的节点(previous)
  • 必胜点(N点):下一个选手将败,当前选手取胜的节点(next)
4.mex函数

mex函数是一个建立在集合上的整数函数,即 m e x : S N ↦ N mex: S_N \mapsto N mex:SN​↦N ,它的定义域是一个非负整数集, m e x mex mex代表这个集合里最小未出现的非负整数,举几个例子: m e x ( { 1 , 2 , 3 } ) = 0 mex(\{1,2,3\})=0 mex({1,2,3})=0, m e x ( { 0 , 1 , 2 } ) = 3 mex(\{0,1,2\})=3 mex({0,1,2})=3, m e x ( { 0 , 2 , 3 } ) = 1 mex(\{0,2,3\})=1 mex({0,2,3})=1,等等

三、前置定理

定理一:没有后继状态的状态是必败状态

定理二:一个状态是必胜状态 ⇔ \Harr ⇔ 它至少存在一个向必败状态的转移

定理三:一个状态是必败状态 ⇔ \Harr ⇔ 它所有后继状态均为必胜状态

四、四大经典组合游戏 1.Nim游戏

给定 N N N 堆物品,第 i i i堆物品有 A i A_i Ai​ 个。

两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。

取走最后一件物品者获胜。

问先手是否必胜。

Nim博弈是最经典的博弈之一,许多博弈均可转化为Nim博弈,我们给出结论:

先手必胜 ⇔ \Harr ⇔ A 1 ⊕ A 2 ⊕ A 3 . . . ⊕ A n ≠ 0 A_1\oplus A_2\oplus A_3...\oplus A_n\ne0 A1​⊕A2​⊕A3​...⊕An​​=0

由归纳法其实很容易证得,也可以利用三个前置定理进行证明,但这个等价表达式还是给予我们很多震撼~~(也给予出题人很多灵感)~~

但其实我们不应把Nim游戏看成一个独立游戏,而应该把它看成若干个游戏的和

对每个游戏,先手是否必胜 ⇔ \Harr ⇔ A i ≠ 0 A_i\ne0 Ai​​=0

进而对于这 n n n 个游戏的加和为 A 1 ⊕ A 2 ⊕ A 3 . . . ⊕ A n A_1\oplus A_2\oplus A_3...\oplus A_n A1​⊕A2​⊕A3​...⊕An​

游戏和的概念后续还会继续用到,也是用异或的形式给出表达式,这个表达式很重要

int main(){
    scanf("%d", &n);
    for(int i = 1; i 1 & SG(X)​=0

证明与上述 A n t i − N i m Anti-Nim Anti−Nim 类似

// Luogu P4279 Anti-Nim 模板题
int n, m, t, k;
int a[N];
int main(){
    scanf("%d", &t);
    while(t -- ) {
        scanf("%d", &n);
        int sg = 0, flag = 0;
        for(int i = 1; i  1) flag = 1;
        }
        if((flag == 0 && sg == 0) || (flag == 1 && sg != 0))  puts("John");
        else puts("Brother");
    }
    return 0;
}
2. M u l t i − S G Multi-SG Multi−SG 游戏

有 n n n 堆石子

两个人可以从任意一堆石子中拿任意多个石子,不能不拿

或者可以把一堆数量不少于 2 2 2 石子堆分为两堆不为空的石子堆

无法操作的人失败

问谁有必胜策略

给出结论:

S G ( x ) = { x − 1 , x ≡ 0 ( m o d 4 ) x , x ≡ 1 & 2 ( m o d 4 ) x + 1 , x ≡ 3 ( m o d 4 ) SG(x)=\begin{cases} x-1 ,& x \equiv 0 \pmod 4 \\ x, & x \equiv 1 \&2 \pmod 4 \\ x+1, &x\equiv 3 \pmod 4 \end{cases} SG(x)=⎩⎪⎨⎪⎧​x−1,x,x+1,​x≡0(mod4)x≡1&2(mod4)x≡3(mod4)​

S G ( X ) = ⊕ i = 1 n S G ( x i ) SG(X)=\oplus_{i=1}^n SG(x_i) SG(X)=⊕i=1n​SG(xi​)

具体怎么来的,是依靠 独特的智慧 打表 来的,不过事实上,打表也确实是很重要 博弈类游戏 结论发现来源,不是所有人都有着拉马努金那种高超的直觉和经验

我们再来给出 M u l t i − S G Multi-SG Multi−SG 的准确定义:

M u l t i − S G Multi-SG Multi−SG 游戏规定,在符合拓扑原则的前提下,一个单一游戏的后继可以为 多个单一游戏 。

M u l t i − S G Multi-SG Multi−SG 其他规则与 S G SG SG 游戏相同。

那么它有如下性质:

  • 一个后继状态的SG值 为 后继状态中所能衍生出的所有独立游戏的异或和

举个简单的例子: S G ( 3 ) SG(3) SG(3) 的后继状态有 { ( 0 ) , ( 1 ) , ( 2 ) , ( 1 , 2 ) } \{(0),(1),(2),(1,2)\} {(0),(1),(2),(1,2)} 也就是这堆有 3 3 3 个石子的石子堆,可以拿走或者分开等四种情况,他们的 S G SG SG 值分别为 $ { 0 , m e x { 0 } = 1 , m e x { 0 , 1 } = 2 , m e x { 0 , 1 , 2 } = 3 }$,因此 $SG(3)=mex{0,1,2,3}=4 $

int n, a[N], sg[N]; // hdu 3032 Multi-Nim 模板
int main(){
    int t, scanf("%d", &t);
    while(t -- ) {
        int ans = 0;
        scanf("%d", &n);
        for(int i = 1; i             
关注
打赏
1688896170
查看更多评论
0.3424s