Game Theory In Competitive Programming|Part2(原创)

2024-05-06 19:44

本文主要是介绍Game Theory In Competitive Programming|Part2(原创),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一个Part部分,我们介绍了Bash game、Nim game、Misere Nim game 这三个游戏的玩法、必胜策略,以及必胜策略的证明,并介绍了有关必胜态以及必败态的两条定理,接下来我们会以Part1为基础,深挖其中的理论。

文章目录

    • 1、Grundy Numbers/Numbers and Mex的引入
          • 定义Mex
          • 定义运算Mex(set)
    • 2、Sprague-Grundy Theorem
          • Sprague-Grundy Theorem是什么
          • 应用S-G Theorem
    • 3、Practice
          • Game1
          • Game2
          • Game2.1
          • Game3

1、Grundy Numbers/Numbers and Mex的引入

G r u n d y N u m b e r s Grundy Numbers GrundyNumbers 是一种在组合游戏理论中用来分析游戏局势的数学概念。

它主要用于判断在一些特定游戏中,当前局面对先手玩家是有利的还是不利的。

具体地说,给定一个游戏状态或局面, G r u n d y Grundy Grundy数能表示这个局面的胜负情况。

定义如下:

1、如果一个局面是终止局面,其 G r u n d y Grundy Grundy数为 0 0 0

2、对于非终止局面,其 G r u n d y Grundy Grundy数定义为所有可能的下一步局面的 G r u n d y Grundy Grundy​数中最小未出现的非负整数。

设当前状态为 S S S,其进行一次合法操作后的可能状态集合为: { S 1 , S 2 , . . . S k } \lbrace S_1,S_2,...S_k\rbrace {S1,S2,...Sk}

则有: G r u n d y ( S ) = M e x ( { G r u n d y ( S 1 ) , G r u n d y ( S 2 ) , . . . , G r u n d y ( S k ) } ) Grundy(S)=Mex(\lbrace Grundy(S_1),Grundy(S_2),...,Grundy(S_k)\rbrace) Grundy(S)=Mex({Grundy(S1),Grundy(S2),...,Grundy(Sk)})

定义Mex

集合中未出现的最小非负整数。

定义运算Mex(set)

求出集合中未出现的最小非负整数。

列表观察:

Mex(set)结果
Mex( ∅ \emptyset )0
Mex({1,2,3})0
Mex({0,2,3,4})1
Mex({0,1,2,3,4,…, w w w}) w + 1 w+1 w+1

下面用几个简单的游戏来验证 G r u n d y Grundy Grundy数:

Game1

题目:

有一堆数量为 n n n的石子,两个人轮流操作,每次操作可以取走任意数量的石子(不能不取)。

取走最后一个石子的玩家获胜。

列表观察 0 ∼ 10 0\sim10 010​的Grundy Numbers:

G r u n d y ( 0 ) = M e x ( ∅ ) = 0 Grundy(0)=Mex(\empty)=0 Grundy(0)=Mex()=0

G r u n d y ( 1 ) = M e x ( { G r u n d y ( 0 ) } ) = 1 Grundy(1)=Mex(\lbrace Grundy(0)\rbrace)=1 Grundy(1)=Mex({Grundy(0)})=1

G r u n d y ( 2 ) = M e x ( { G r u n d y ( 0 ) , G r u n d y ( 1 ) } ) = 2 Grundy(2)=Mex(\lbrace Grundy(0),Grundy(1)\rbrace)=2 Grundy(2)=Mex({Grundy(0),Grundy(1)})=2

. . . ... ...

G r u n d y ( n ) = M e x ( { G r u n d y ( n − 1 ) , . . . , G r u n d y ( 0 ) } ) = n Grundy(n)=Mex(\lbrace Grundy(n-1),...,Grundy(0)\rbrace)=n Grundy(n)=Mex({Grundy(n1),...,Grundy(0)})=n

N0123456789
Grundy(N)0123456789

观察到,只有 n = 0 n=0 n=0的时候Grundy Numbers = 0 , 所以 n = 0 n=0 n=0的时候先手必败。

否则先手必胜。

这显然和我们的结论是一样的。


Game2

题目:

最初有一堆数量为 15 15 15的石子,选手甲、乙交替操作,每次操作需要从石子堆中拿走不超过 3 3 3个石子。

甲先手操作,取走最后一个石子的选手获胜。请问最终谁获胜?

只需要求解出每个状态的Grundy数即可。

G r u n d y ( 0 ) = M e x ( ∅ ) = 0. Grundy(0) = Mex(\empty) = 0. Grundy(0)=Mex()=0.

G r u n d y ( 1 ) = M e x ( { G r u n d y ( 0 ) } ) = 1. Grundy(1) = Mex(\lbrace Grundy(0)\rbrace) = 1. Grundy(1)=Mex({Grundy(0)})=1.

G r u n d y ( 2 ) = M e x ( { G r u n d y ( 0 ) , G r u n d y ( 1 ) } ) = 2. Grundy(2)=Mex(\lbrace Grundy(0),Grundy(1)\rbrace)=2. Grundy(2)=Mex({Grundy(0),Grundy(1)})=2.

G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) , G r u n d y ( 1 ) , G r u n d y ( 0 ) } ) = 3 Grundy(3)=Mex(\lbrace Grundy(2),Grundy(1),Grundy(0)\rbrace) = 3 Grundy(3)=Mex({Grundy(2),Grundy(1),Grundy(0)})=3

G r u n d y ( 4 ) = M e x ( { G r u n d y ( 3 ) , G r u n d y ( 2 ) , G r u n d y ( 1 ) } ) = 0 Grundy(4)=Mex(\lbrace Grundy(3),Grundy(2),Grundy(1)\rbrace)=0 Grundy(4)=Mex({Grundy(3),Grundy(2),Grundy(1)})=0

. . . ... ...

G r u n d y ( 15 ) = M e x ( { G r u n d y ( 14 ) , G r u n d y ( 13 ) , G r u n d y ( 12 ) } ) = 3 Grundy(15)=Mex(\lbrace Grundy(14) ,Grundy(13),Grundy(12)\rbrace)=3 Grundy(15)=Mex({Grundy(14),Grundy(13),Grundy(12)})=3

在这个游戏中,如果把 15 15 15换成 n n n也是一样能够求解的,我们可以通过线性递推的方式求解出Grundy(n).

如果 G r u n d y ( n ) = 0 Grundy(n)=0 Grundy(n)=0​即代表这是一个必败态。

N012345678
Grundy(N)012301230

这显然符合 B a s h g a m e Bash \:game Bashgame的结论。


Game3

题目:

最初有一堆数量为 10 10 10的石子,选手甲、乙交替操作,每次操作可以将石子的数量除以2、3、6,并向下取整。

甲先手操作,最后一次操作的人获胜。请问最终谁获胜?

G r u n d y ( 0 ) = 0 Grundy(0)=0 Grundy(0)=0.

G r u n d y ( 1 ) = M e x ( { G r u n d y ( [ 1 2 ] ) , G r u n d y ( [ 1 3 ] ) , G r u n d y ( [ 1 6 ] ) } ) = M e x ( { 0 , 0 , 0 } ) = 1 Grundy(1)=Mex(\lbrace Grundy([\frac{1}{2}]),Grundy([\frac{1}{3}]),Grundy([\frac{1}{6}])\rbrace) = Mex(\lbrace0,0,0\rbrace)=1 Grundy(1)=Mex({Grundy([21]),Grundy([31]),Grundy([61])})=Mex({0,0,0})=1

G r u n d y ( 2 ) = M e x ( { G r u n d y ( [ 2 2 ] ) , G r u n d y ( [ 2 3 ] ) , G r u n d y ( [ 2 6 ) ] } ) = M e x ( { 1 , 0 , 0 } ) = 2 Grundy(2)=Mex(\lbrace Grundy([\frac{2}{2}]),Grundy([\frac{2}{3}]),Grundy([\frac{2}{6})]\rbrace) = Mex(\lbrace1,0,0\rbrace)=2 Grundy(2)=Mex({Grundy([22]),Grundy([32]),Grundy([62)]})=Mex({1,0,0})=2

G r u n d y ( 3 ) = M e x ( { G r u n d y ( [ 3 2 ] ) , G r u n d y ( [ 3 3 ] ) , G r u n d y ( [ 3 6 ) ] } ) = M e x ( { 1 , 1 , 0 } ) = 2 Grundy(3)=Mex(\lbrace Grundy([\frac{3}{2}]),Grundy([\frac{3}{3}]),Grundy([\frac{3}{6})]\rbrace) = Mex(\lbrace1,1,0\rbrace)=2 Grundy(3)=Mex({Grundy([23]),Grundy([33]),Grundy([63)]})=Mex({1,1,0})=2

G r u n d y ( 4 ) = M e x ( { G r u n d y ( [ 4 2 ] ) , G r u n d y ( [ 4 3 ] ) , G r u n d y ( [ 4 6 ) ] } ) = M e x ( { 2 , 1 , 0 } ) = 3 Grundy(4)=Mex(\lbrace Grundy([\frac{4}{2}]),Grundy([\frac{4}{3}]),Grundy([\frac{4}{6})]\rbrace) = Mex(\lbrace2,1,0\rbrace)=3 Grundy(4)=Mex({Grundy([24]),Grundy([34]),Grundy([64)]})=Mex({2,1,0})=3

. . . ... ...

G r u n d y ( 6 ) = M e x ( { G r u n d y ( [ 6 2 ] ) , G r u n d y ( [ 6 3 ] ) , G r u n d y ( [ 6 6 ) ] } ) = M e x ( { 3 , 2 , 1 } ) = 0 Grundy(6)=Mex(\lbrace Grundy([\frac{6}{2}]),Grundy([\frac{6}{3}]),Grundy([\frac{6}{6})]\rbrace) = Mex(\lbrace3,2,1\rbrace)=0 Grundy(6)=Mex({Grundy([26]),Grundy([36]),Grundy([66)]})=Mex({3,2,1})=0

G r u n d y ( n ) = 0 ( n ≥ 6 ) Grundy(n) =0(n\geq6) Grundy(n)=0(n6)

列表有:

N012345678
Grundy(N)012233000

2、Sprague-Grundy Theorem

Sprague-Grundy Theorem是什么

S − G S-G SG定理 是一个解决类似于 N i m Nim Nim的公平组合游戏的通法。

我们把单个 N i m Nim Nim堆上的游戏对局叫作一个子对局。

S − G S-G SG定理的内容是:假设有 N N N个子对局和两个棋手 A 、 B A、B AB组成的综合对局,

如果 A 、 B A、B AB都按照最优策略下棋,那么在对局开始之前就能判断输赢。

各个子对局的 G r u n d y Grundy Grundy数异或和为 0 0 0,先手必败。

各个子对局的 G r u n d y Grundy Grundy数异或和不为 0 0 0,先手必败。

应用S-G Theorem
  1. 将综合对局分解为一个个子对局。
  2. 对于每一个子对局计算其 G r u n d y Grundy Grundy数。
  3. 计算所有子对局的 G r u n d y Grundy Grundy数的异或和。
  4. 如果异或和为 0 0 0,那么先手必败,否则先手必胜。

3、Practice

Game1

题目:

初始时有三堆石子,每一堆分别有 3 、 4 3、4 34 5 5 5个石子。

甲乙交替操作,每次操作可以取一堆石子中的 1 ∼ 3 1\sim3 13个。

取走最后一个石子的玩家获胜,请问最终谁会获胜?

S − G T h e o r e m : S-G\:Theorem: SGTheorem:

  1. 这个游戏可以分解为3个子游戏,每一个子游戏分别有 3 、 4 、 5 3、4、5 345​个石子。
  2. 可以计算出每个子游戏的 G r u n d y Grundy Grundy数 : 3 、 0 、 1 3、0、1 301
  3. 计算出子游戏 G r u n d y Grundy Grundy数的异或和 : : : 2。
  4. 得出结论:先手必胜。

Game2

题目:

给一个迷宫,迷宫内有空地和障碍物(蓝色格子),棋子在右下角。

甲乙交替操作,每次操作只能将棋子向上或向左移动任意单位长度(不能不移动)。

最后移动的玩家获胜。

迷宫的初始状态如下图:

在这里插入图片描述

我们可以对每个位置,都求出其 G r u n d y N u m b e r Grundy\: Number GrundyNumber,结果如下图:

在这里插入图片描述

如果初始位置的 G r u n d y Grundy Grundy数是 0 0 0,那么根据 S − G S-G SG定理:先手必输。

如果初始位置的 G r u n d y Grundy Grundy数非 0 0 0,根据 S − G S-G SG定理:先手必胜。


Game2.1

题目:

假如给定三个迷宫,每次操作都能选择一个迷宫,并操纵里面的棋子向上或向下走任意距离。

棋子在右下角,最终无法进行操作的人输。

题中迷宫如图:

在这里插入图片描述

可以求出每个迷宫的 G r u n d y Grundy Grundy数如下图:
在这里插入图片描述

注意到初始状态下,三个子状态的 G r u n d y N u m b e r Grundy\:Number GrundyNumber 异或和为 2 ⨁ 3 ⨁ 3 = 2 2\bigoplus 3\bigoplus 3=2 233=2

所以先手必胜。


Game3

题目:

最初有一个数量为 n n n的石子堆,甲乙轮流进行操作。

每次操作可以选择场上任意一堆石子,并将这堆石子分为石子数量不相同的两堆石子(不能为 0 0 0)。

不能进行操作的人输。

我们假设 n = 8 n=8 n=8,模拟这场游戏来观察规律:

1、 n = 1 n=1 n=1,显然这一堆石子无法继续分, G r u n d y ( 1 ) = 0 Grundy(1)=0 Grundy(1)=0.

2、 n = 2 n=2 n=2,显然这堆石子无法分为数量不相同的两堆石子, G r u n d y ( 2 ) = 0 Grundy(2)=0 Grundy(2)=0.

3、 n = 3 n=3 n=3,这堆石子可以分成 ( 1 , 2 ) (1,2) (1,2) G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) ⨁ G r u n d y ( 1 ) } ) = 1 Grundy(3)=Mex(\lbrace Grundy(2)\bigoplus Grundy(1)\rbrace)=1 Grundy(3)=Mex({Grundy(2)Grundy(1)})=1.​

这也代表着, n = 3 n=3 n=3​的石子可以分裂出两个子游戏

这两个子游戏的胜负会影响父游戏的胜负,所以需要用到 S − G T h e o r e m : S-G\:Theorem: SGTheorem:

一个游戏若是能分解为若干子游戏,那么这个游戏的结果取决于子游戏的 G r u n d y N u m b e r Grundy\: Number GrundyNumber异或和

G r u n d y ( 3 ) = M e x ( { G r u n d y ( 2 ) ⨁ G r u n d y ( 1 ) } ) = 1 Grundy(3)=Mex(\lbrace Grundy(2)\bigoplus Grundy(1)\rbrace)=1 Grundy(3)=Mex({Grundy(2)Grundy(1)})=1

4、 n = 4 n=4 n=4,这堆石子能分成 ( 1 , 3 ) (1,3) (1,3) G r u n d y ( 4 ) = M e x ( { G r u n d y ( 1 ) ⨁ G r u n d y ( 3 ) } ) = 0 Grundy(4)=Mex(\lbrace Grundy(1)\bigoplus Grundy(3) \rbrace)=0 Grundy(4)=Mex({Grundy(1)Grundy(3)})=0

5、 n = 5 n=5 n=5,这堆石子能分成 ( 1 , 4 ) , ( 2 , 3 ) (1,4),(2,3) (1,4),(2,3)

G r u n d y ( 5 ) = M e x ( { G r u n d y ( 1 ) ⨁ G r u n d y ( 4 ) } , { G r u n d y ( 2 ) ⨁ G r u n d y ( 3 ) } ) = M e x ( { 1 , 0 } ) = 2 Grundy(5)=Mex(\lbrace Grundy(1)\bigoplus Grundy(4) \rbrace,\lbrace Grundy(2)\bigoplus Grundy(3) \rbrace)=Mex(\lbrace 1,0 \rbrace)=2 Grundy(5)=Mex({Grundy(1)Grundy(4)},{Grundy(2)Grundy(3)})=Mex({1,0})=2

. . . ... ...

以此类推下去即可。

这篇关于Game Theory In Competitive Programming|Part2(原创)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/965207

相关文章

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

JSP的增删改查part2

增加显示数据库表格cdsn的功能 1. 》》对CdsnDao接口和方法,CdsnService接口和方法进行处理,并增加CdsnServlet用于对新建展示页面进行处理 对cdsnDao接口和方法增加 》》接口 //获取cdsn用户数据列表 public List<cdsn> getCdsnList();》》CdsnDaoImpl增加内容//获得数据库所有数据publ

10400 -Game Show Math

这道题的话利用了暴力深搜,尽管给了20S,但是这样还会超时,所以就需要利用回溯进行减枝,因为是DFS,所以用一个数组vis[i][j]记录是否在状态i时候取到过j值,如果取到过的话,那么直接回溯(往后搜索已经没有意义了,之前到达这个状态的时候是无法得到结果的) 还有需要注意的地方就是题目的要求,每一步的结构都在(-32000,32000)之间,所以需要一步判断,如果在这个范围外直接回溯 最后一

2024高教社杯全国大学生数学建模竞赛B题原创python代码

以下均为python代码。先给大家看看之前文章的部分思路: 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 1 总体分析 题目提供了一个电子产品生产的案例,要求参赛者建立数学模型解决企业在生产过程中的一系列决策问题。以下是对题目的总体分析: 问题一需要企业需要从供应商购买零配件,并且需要设计一个抽样检测方案,来决定是否接受供应商提供的零配件。题目要求设计一个能够尽可能减少检测次

怎样写原创内容才能快速被收录呢?

网站原创文章怎么写才能收录?站长们都知道,文章对SEO的重要性,一篇高质量的原创文章要胜过N篇采集来的文章。那么,我们应该如何根据用户需求写出用户需要的文章呢?下面,曾庆平SEO就为大家讲一下如何写出既符合用户需求,又符合搜索引擎的高质量原创文章。 请牢记,发文章的最终目的是用来解决用户需求而不是一味的满足搜索引擎。请不要为了搜索引擎而刻意的在文章里面大量堆砌关键词,这样做只会让用户感觉文章没

SEO如何提高原创内容输出增量?

对于任何一个网站建设运营而言,我们在一个长周期的运营过程中,在某一个时间点,总会遇到发展瓶颈,比如: 流量停止不前。 百度权重,没有明显变化。 特定关键词排名,长期稳定,不升不降。 这个时候我们就需要思考一个问题,我们该如何推动网站继续前进,是增加品牌影响力,还是持续的拓展更多相关性的栏目,从SEO的角度来讲,我们通常会推荐从横行拓展相关性内容来入手,毕竟这样的运营成本相对是非常低的。

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景  "板凳龙",又称"盘龙",是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色,展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中,人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的"龙"形。这种创新的表演方式不仅展现了民间艺术的智慧,也体现了集体协作的精神。盘龙时,龙头在前领头,龙身和龙尾相随盘旋,整

2024高教社杯全国大学生数学建模竞赛C题原创python代码

2024高教社杯全国大学生数学建模竞赛C题原创python代码 C题题目:农作物的种植策略 思路可以参考我主页之前的文章 以下均为python代码,推荐用anaconda中的notebook当作编译环境 from gurobipy import Modelimport pandas as pdimport gurobipy as gpfrom gurobipy import GR

【原创】java+springboot+mysql企业产品销售管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。 前言: 随着市场机制的日趋完善,商品经济迅猛发展,企业自主权不断增强。在商品经济化的背景下,企业间的竞争日益激烈,销售作为企业获取利润的关键环节,其管理效率和效果直接影响到企

JavaScript基础part2(完结)

JavaScript基础 函数 语法: function 函数名(形参表){代码} 代码中加return语句则可以返回值,默认返回值为undefined 两个相同的函数,后面会覆盖前面 命名规则: 前缀为动词 传参注意事项 实参个数 > 形参个数 ==> 没用上的实参被忽略实参个数 < 形参个数 ==> 没赋予值得形参为undefined 作用域 全局变量在函数体外定义局