博弈论中组合游戏模型的算法浅析

本文深入探讨了博弈论中的组合游戏模型,重点讲解了NP态理论、SG函数以及Sprague-Grundy(SG)定理。通过实例分析了游戏状态的转换,并展示了如何利用SG函数高效解决复杂游戏的必胜策略问题。
摘要由CSDN通过智能技术生成

博弈论中组合游戏模型的算法浅析

引言

博弈论(Game Theory),又称对策论,或赛局理论,顾名思义,它是研究多个个体或团队之间在特定条件制约下的对局中利用相关方的策略。即,在某特定游戏规则下,参与者在行动之前所准备好的一套完整的行动方案。

博弈论既是现代数学的一个分支,也是运筹学的一个学科.

组合游戏(Combinatorial Games),该类游戏通常有如下特点:

  1. 游戏有两个参与者,二者轮流做出决策,且二者的决策都对自己最有利。
  2. 当有一人无法做出决策时游戏结束,且判无法做出决策的人负。无论二者如何做出决策,游戏均可在有限步内结,
  3. 游戏的某一个状态不可以再次到达,游戏不会出现平局的局面。
  4. 任意一个参与者在某一个确定状态可以做出的决策集合只与当前状态有关,而与参与者无关。

NP态理论

我们先引入一个概念--------NP态理论

  • P-position:先手必败态。
  • N-position:先手必胜态。

性质如下:

  1. 决策集合为空的局面是P-position
  2. 可以移动到P-position的局面是N-position
  3. 任何决策均只能移动到N-position的局面是P-position

我们先看一道题,是我第一次接触到组合游戏,也是第一次接触到博弈论的题。
题目链接:pb的游戏

游戏内容是这样的:pb先手将给出的自然数分割,割成两个非零自然数,这两个数之和等于原数,之后由zs选择留下这两个数中的一个进行分割,之后再由pb进行选择分割,如此重复。

游戏规则非常简单,我们知道一个简单的结论:

奇数=奇数+偶数 偶数=偶数+偶数 or 偶数=奇数+奇数

分析如下: 对于数字N,

  • N = 1 N=1 N=1时, N N N不可再被分割,此时拿到N的参与者的局面为P-position,先手必败。
  • N = 2 N=2 N=2时,N只能被分割为(1,1),将局面移动到了P-position,根据性质,当前 N = 2 N=2 N=2的局面为N-position,先手必胜。
  • N > 2 N>2 N>2 N N N为偶数时,那么我只需要将其拆成 a + b a+b a+b a a a b b b均为小于N的奇数,那么我的对手无论选择 a a a还是 b b b,都必然会拆出一个偶数,而我只要选择那个偶数,就又回到了 N N N为偶数的情况,因此,我选择的数永远是偶数,对手选择的数只能是奇数,选择 N = 2 N=2 N=2的机会永远在我这里, N N N为偶数的局面为N-position,先手必胜。
  • N > 2 N>2 N>2 N N N为奇数时,那么我将其拆成 a + b , a , b a+b,a,b a+bab中必然有一个是偶数,即对于奇数 N N N,无论我如何选择均会移动到N-position。因此,N为奇数的局面为P-position,先手必败。

综上, N N N为奇数,先手必败; N N N为偶数,先手必胜。
代码如下:

#include <cstdio>
int main()
{
    int n,a
    scanf("%d", &n);
    while (n--)
    {
        scanf("%d", &a);
        if (a & 1)//判断奇偶,奇数的话先手的pb必败,偶数的话先手的pb必胜,这里使用位运算加快速度,简化书写
            printf("zs wins\n");
        else
            printf("pb wins\n");
    }
    return 0;
}

这道题非常简单,可以很容易就判断出NP状态对应的局面分别是什么。但对稍微复杂一点的情况,如Nim游戏,其对应的状态集合非常大,直接使用NP状态理论求解时非常复杂,或者虽然可以求解,但效率也是极低的,因为需要对判断每一个局面是N-position还是P-position,即使可以用动态规划或记忆化搜索来进行优化,也很难优化到令人满意的程度。

那么,对于此类问题,有没有一个通用且效率高的算法呢?

这就需要用到博弈论中极为重要的工具———SG函数和SG定理。我们先不加证明的引入这两个概念。

SG函数

首先定义 m e x = ( m i n i m a l e x c l u d a n t ) mex=(minimal excludant) mex=(minimalexcludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如, m e x { 0 , 1 , 2 , 4 } = 3 、 m e x { 2 , 3 , 5 } = 0 、 m e x { 0 } = 1 mex\{0,1,2,4 \}=3、mex\{ 2,3,5\}=0、mex\{0 \}=1 mex{ 0,1,2,4}=3mex{ 2,3,5}=0mex{ 0}=1

对于任意状态 x x x , 定义 S G ( x ) = m e x ( S ) SG(x) = mex(S) SG(x)=mex(S),其中 S S S x x x 后继状态的SG函数值的集合。如 x x x 有三个后继状态分别为 a , b , c a,b,c a,b,c,那么 S G ( x ) = m e x { S G ( a ) , S G ( b ) , S G ( c ) } SG(x) = mex\{ SG(a),SG(b),SG(c)\}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值