Game Theory In Competitive Programming|Part1 (原创)

2024-05-06 00:52

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

Game Theory In Competitive Programming|Part1

在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面,将对博弈论中的一些经典问题进行讨论。

文章目录

  • Game Theory In Competitive Programming|Part1
    • Bash game
    • Nim game
    • Misère Nim game

在这里,我们讨论的是博弈游戏中的一类,即能够找到必胜策略的博弈。

并分析它的通用策略是什么?

Bash game

巴什博弈是一个简单的游戏,我们将通过分析这个游戏来引出我们分析博弈游戏的通用策略

让我们考虑这样一个游戏:

题目:

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

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

分析:

没错,这是一个有必胜策略的游戏。

如果必胜策略不明显的话,不妨手动写出所有的状态来观察规律。

(这是一种常用的解决博弈问题的手段)。

下图为当先手操作时,面对特定的石子数量的时候,游戏最终的结果:

(L:Lose,W:Win)。

石子个数0123456789101112131415
最终结果LWWWLWWWLWWWLWWW

结论:

不难观察出,当石子个数被 4 4 4​整除的时候,先手必败,否则先手必胜。

这是为什么呢?

是因为,几乎所有具有必胜策略的游戏,都遵守两条关于必胜态,必败态的准则:

  • 如果当前状态能转移到必败态,当前状态是必胜态。
  • 如果当前状态只能转移到必胜态,当前状态是必败态。

我们能知道的是, 0 0 0是一个必败态。而先手能一次拿走 1 ∼ 3 1\sim3 13个石子。

故当石子个数为 1 1 1 2 2 2 3 3 3的时候,

这三个状态能转移到必败态,所以它们是必胜态。

于是我们可以抽象出一张图:(黑色是必败点,粉色是必胜点)。

在这里插入图片描述


现在我们将题目改的更普通一点还能得到必胜策略吗?

题目:

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

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

必胜策略:

如果石子的个数是 ( k + 1 ) (k+1) (k+1)​的整数倍,说明先手必败,否则先手必胜。

我们依然能通过画图列表来得到这个结论。

这说明它们是博弈游戏中通用的观察必胜策略的手段。


现在我们考虑另一个游戏来试验这种分析手段是否可行:

题目:

最初有一堆数量为 8 8 8的石子,选手甲、乙交替操作,每次操作可以从石子堆中拿走数量为 x x x的石头,

x x x是当前石子数量的约数,且小于当前石子数量。

甲先手操作,无法取石头的人输。请问最终谁获胜?

分析:

石头数量12345678
最终结果LWLWLWLW

通过列表的方法,我们发现了这样的结论:当石头个数为奇数,先手必败,否则先手必胜。

Nim game

Nim游戏是博弈游戏中的一个重要角色,因为它和其他很多博弈有着相同的特性。

甚至能用相同策略进行解决,我们将重点讨论Nim游戏,Nim游戏的策略推广到其他博弈。

题目:

最初有 n n n堆石子,第 i i i堆石子最初有 x i x_i xi个。

A l i c e 、 B o b Alice、Bob AliceBob轮流操作,每次操作可以选择拿走一堆石子中取任意数量的石子(至少为 1 1 1)。

无法取石子的玩家输掉比赛。

这也是一个具有必胜策略的游戏。

结论:

设每一堆石子最初的数量异或和为: s s s ( s = x 1 ⨁ x 2 ⨁ . . . ⨁ x n ) (s=x_1\bigoplus x_2\bigoplus...\bigoplus x_n) (s=x1x2...xn)

s = 0 s=0 s=0的时候,先手必败,否则先手必胜。

分析:

不妨设 W W W是必胜态, L L L是必败态。

根据之前说的理论:

  • 如果当前状态能转移到必败态,当前状态是必胜态。
  • 如果当前状态只能转移到必胜态,当前状态是必败态。

需要验证 N i m g a m e Nim \:game Nimgame的结论是否符合上述理论:

1、当 s = 0 s=0 s=0时,拿走任意一堆的任意数量的石头,都会使得 s ≠ 0 s\neq0 s=0

2、当 s ≠ 0 s\neq0 s=0时,总有方法拿走某个堆的某个数量的石头,使得 s = 0 s=0 s=0。​

验证:

x 1 , . . . , x n x_1,...,x_n x1,...,xn是移动前的各堆石子数, y 1 , . . . y n y_1,...y_n y1,...yn是移动后各堆石子数。

s = x 1 ⨁ . . . ⨁ x n s=x_1\bigoplus...\bigoplus x_n s=x1...xn t = y 1 ⨁ . . . ⨁ y n t=y_1\bigoplus...\bigoplus y_n t=y1...yn

可以进行等价变换:

t = 0 ⨁ t t=0\bigoplus t t=0t

= s ⨁ s ⨁ t \:\: =s\bigoplus s\bigoplus t =sst

= s ⨁ ( x 1 ⨁ . . . ⨁ x i ⨁ . . . ⨁ x n ) ⨁ ( y 1 ⨁ . . . ⨁ y i ⨁ . . . ⨁ y n ) \:\:\:=s\bigoplus (x_1\bigoplus...\bigoplus x_i\bigoplus...\bigoplus x_n)\bigoplus (y_1\bigoplus...\bigoplus y_i\bigoplus...\bigoplus y_n) =s(x1...xi...xn)(y1...yi...yn)

= s ⨁ ( x 1 ⨁ y 1 ) . . . ( x i ⨁ y i ) . . . ( x n ⨁ y n ) \:\:\:=s\bigoplus(x_1\bigoplus y_1)...(x_i\bigoplus y_i)...(x_n\bigoplus y_n) =s(x1y1)...(xiyi)...(xnyn)

= s ⨁ x i ⨁ y i \:\:\:=s\bigoplus x_i\bigoplus y_i =sxiyi

= s ⨁ x i ⨁ y i \:\:\:=s\bigoplus x_i\bigoplus y_i =sxiyi

x i x_i xi代表的是第 i i i堆在操作前的石子数量, y i y_i yi是操作后的石子数量,因为只操作了一堆,所以其他堆的异或值是 0 0 0​。

理论 1 1 1

  • s = 0 s=0 s=0时,拿走任意一堆的任意数量的石头,都会使得 s ≠ 0 s\neq0 s=0

s = 0 s=0 s=0时,若想要 t = 0 t=0 t=0,那么说明 x i = y i x_i=y_i xi=yi,不可能实现。

理论 2 2 2

  • s ≠ 0 s\neq0 s=0时,总有方法拿走某个堆的某个数量的石头,使得 s = 0 s=0 s=0

s ≠ 0 s\neq 0 s=0时,若想要 t = 0 t=0 t=0,只需要令$ y_i=s\bigoplus x_i$ 即可,也就转证为是否存在一个堆满足 x i > s ⨁ x i x_i>s\bigoplus x_i xi>sxi

这是存在的:

d d d s s s二进制中最左边 1 1 1的位置。

可以选择第 i i i堆,使得 x i x_i xi在第 d d d位是 1 1 1(这样的堆一定存在不然 s s s的第 d d d位只能是 0 0 0)。

此时 y i = x i ⨁ s y_i=x_i\bigoplus s yi=xis

这也代表着, y i y_i yi d d d的左边的所有位都与 x i x_i xi相同,但第 d d d位为 0 0 0,所以 y i < x i y_i<x_i yi<xi

Misère Nim game

这是Nim game的相反版本,因为它规定,取走最后一个石子的人是输家。

这样的情况是比较复杂的,因为我们不能简单的取反Nim game的结论。

我们假设Misère Nim game的获胜条件是:

设每一堆石子最初的数量异或和为: s s s ( s = x 1 ⨁ x 2 ⨁ . . . ⨁ x n ) (s=x_1\bigoplus x_2\bigoplus...\bigoplus x_n) (s=x1x2...xn)

s = 0 s=0 s=0的时候,先手必胜,否则先手必败。

我们需要证明这是错的:

显然能找到反例,当只有 1 1 1堆,且这一堆的石子数量为 1 1 1的时候, s ≠ 0 s\neq 0 s=0,但先手败了。

所以简单的取反Nim game的结论是无法解决这样的问题的。

给出结论:

1、如果每堆石子个数都是 1 1 1,结论与Nim game相反

2、若存在石子数量大于 1 1 1​的石子堆,此时结论与Nim game相同。

证明 1 1 1是对的:

如果每一堆石子个数都是1,如果有奇数堆,显然先手必败,如果有偶数堆,显然先手必胜。

证明 2 2 2是对的:

设先手面临的局面是: s ≠ 0 s\neq 0 s=0

先手进行一次操作使得局面变为 s = 0 s= 0 s=0

后手不管怎么操作,都只能将这个局面变为 s ≠ 0 s\neq 0 s=0

不断这样下去,在游戏的终态总会出现两堆不一样的石子 ( s ≠ 0 ) (s\neq 0) (s=0)

因为我们已经假设石子数大于 1 1 1,可以证明的是,在这种情况下,先手总是能迫使后手移走最后一个棋子。

设最终剩下了两堆石子,每堆石子的数量为 x x x y y y ( x > y ) (x>y) (x>y)

1、如果 y = 1 y=1 y=1,那么先手直接拿走 x x x,后手只能被迫拿走最后一个石头,先手获胜。

2、如果 y ≠ 1 y\neq 1 y=1,那么先手拿走 x − y x-y xy,后手的操作情况如下:

  • 拿走一堆,此时先手只需要将另一堆拿至剩下 1 1 1,后手只能被迫拿走最后一个石子,先手获胜。
  • 将一堆拿至剩下 1 1 1,此时先手只需要将另一堆拿走,后手只能被迫拿走最后一个石子,先手获胜。
  • 拿走一堆中的一些,此时先手仿照后手拿走另一堆的相同数量即可。

所有情况总是先手获胜,所以证明了结论2。

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



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

相关文章

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

Python基础part1

Python基础 语法 字面量 数字 整数浮点复数布尔 字符串列表 list元组 Tuple集合 Set字典 Dictionary 注释 单行# 单行注释的内容多行“”“ 多行注释的内容 ”“” 单行注释#后要加一个空格再写注释 变量 变量无类型,但数据有类型 语法: 变量名 = 变量值 数据类型转换: int() str() float() 标识符 中文,英文,

JSP的增删改查part1

运用Myeclisp对数据库进行增删改查 要建立6个库 1).其中dao层用与连接数据库和对数据库进行相关操作; 2).entity层用于存放数据库连接后的实体数据; 3.)service层是在mcv三层模式中新添加一层,能够更加清晰的定义应用程序的边界,需要操作数据的时候,通过service层访问DAO层来实现。

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项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交给天意。 前言: 随着市场机制的日趋完善,商品经济迅猛发展,企业自主权不断增强。在商品经济化的背景下,企业间的竞争日益激烈,销售作为企业获取利润的关键环节,其管理效率和效果直接影响到企