首页 > 其他分享 >【学习笔记】博弈论基础

【学习笔记】博弈论基础

时间:2023-08-15 10:27:13浏览次数:38  
标签:状态 XOR 必胜 必败 博弈论 笔记 学习 int mathrm

博弈论基础

这里主要讨论两人博弈的博弈,不讨论前沿的多人博弈。

点击查看目录

目录

前置知识:

  • 注意,无特殊说明,所有博弈论的题目均已双方会选择最优方案的前提下进行。

(所以据说我们 \(K8He\) 老师想要出一个概率出错的博弈论(

  • 平等组合游戏 \(ICG\):两人轮流操作,限制条件对两人相同,有有限状态集合,有终止状态且可以达到的游戏。

所以说五子棋不算平等组合游戏,因为执黑不等于执白。

而我们的博弈游戏,大多是平等组合游戏。

  • 必胜状态 \(N\),必败状态 \(P\):

(以下所有都不用英文字母表示状态,答案是我猪脑过载反应不过来)

P-position 表示 previous,代表先手必败,即后手必胜,N-position 表示 next,代表先手必胜,后手必败。

很多博文都用字母表示,需要知道(

先手必胜与先手必败

在博弈论中,往往存在必胜与必败的状态。

例如:有一堆石子,数目为 \(N\),初音ミク歌爱ユキ 两个人一次只能取 \(1\) 个或者 \(2\) 个或者 \(3\) 个(不能不取),取到最后一个石子的人获胜,初音ミク先手。

在这之中,明显的,如果 \(N=4\) 初音ミク 必败,因为她不能一次取完但是 歌爱ユキ 可以。

因此,\(N=4k,(k\in Z)\) 时,该状态是先手必败状态。

而对于其他的,初音ミク 可以通过取几个石子让 \(N=4k\),且转化为 歌爱ユキ 先手,所以必胜。

因此我们可以将状态转移构成一个有向无环图,每个状态要么是先手必胜,要么是先手必败,有:

  • 终止状态是先手必败状态。

  • 如果一个状态只能转移到必胜,这个状态就是必败。

  • 如果可以转移到必败,这个状态就是必胜。

(部分边未画出)

nim游戏:

有 \(n\) 堆石子,初音ミク歌爱ユキ 轮流选一堆石子取若干(不可不取),没有石子可取的人失败。

(我觉得看完前置知识可以思考一下所以可以不要往下急着走)

ewq

有点复杂是吧?

一点点来推吧:

参考:百度百科

最终状态是一个不剩,是必败状态。

  • 如果只剩下一堆石子,全拿走可以转换到最终状态(必败状态),所以只剩下一堆石子是必胜状态。

  • 如果只剩下两堆石子:

拿 \((3,3)\) 举例子:

(ps:因为只要能转移到必败状态就是必胜状态,所以省去了一下边和点)

从左上到右下解释一下,因为 \((0,0)\) 是先手必败,所以能转移到它的父局面 \((0,1)\) 是先手必胜,只能转移到 \((0,1)\) 的父局面 \((1,1)\) 是先手必败,\((1,3)\) 能够转移到必败的 \((1,1)\) 是先手必胜。

就像 dfs 一样,而存在大量的重合子,可以考虑记忆化搜索

时间复杂度是 \(O(a_1\cdot a_2 \cdot a_3\cdot …… \cdot a_n)\)。

但是通过一个定理可以让时间复杂度极大地降低。

定理:如果所有石子数量亦或为 \(0\),先手必败,否则先手必胜。

而证明这个定理就要证明三个小定理:

  • 定理 \(1\):最终状态是必败状态。

  • 定理 \(2\):对于 \(a_1\bigoplus a_2 \bigoplus …\bigoplus a_n \neq 0\) 来说,一定存在某种对策使其等于 \(0\)。

  • 定理 \(3\):对于 \(a_1\bigoplus a_2 \bigoplus …\bigoplus a_n = 0\) 来说,无论如何对策都没有继续等于 \(0\) 的可能。

我们主要来证明难以理解的定理 \(2\):

设 \(a_1\bigoplus a_2 \bigoplus …\bigoplus a_n=k,(k\in Z,k\neq 0)\),而其二进制最高位数是 \(d\)。

要让其成为 \(0\),那么就要让 \(a_i=a_i\bigoplus k\)。

其第 \(d\) 位置上数是 \(1\),代表着一定有奇数个 \(a_i\) 的第 \(d\) 位置是 \(1\)。

那么一定有 \(a_i \bigoplus k> a_i\)。

具有合法对策。

证毕。

Nim游戏模板

Miku's Code
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register int
typedef long double llf;
typedef long long ll;
typedef pair<int,int> PII;
const double eps=1e-8;
namespace mystd{
	il int Max(int a,int b)<%if(a<b) return b;return a; %>
	il int Min(int a,int b)<%if(a>b) return b;return a; %>
	il int Abs(int a)<% if(a<0) return a*(-1);return a; %>
	il double fMax(double a,double b)<%if(a<b) return b;return a; %>
	il double fMin(double a,double b)<%if(a>b) return b;return a; %>
	il double fAbs(double a)<% if(a<0) return a*(-1);return a; %>
	il int dcmp(double a){
		if(a<-eps)	return -1;
		if(a>eps)	return 1;
		return 0;
	}
}const int maxn=1e4+50;

int T,n,a[maxn];
int mj;
il void clear(){
	for(rg i=1;i<=n;++i)	a[i]=0;
	mj=0;
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(rg i=1;i<=n;++i){
			scanf("%d",&a[i]);
		}
		for(rg i=1;i<=n;++i)	mj=mj^a[i];
		if(mj==0)	printf("No\n");
		else	printf("Yes\n");
		clear();
	}
	return 0;
} 

杂题乱写(?)

[ARC131C] Zero XOR

[ARC131C] Zero XOR

洛谷题目链接

AtCoder题目链接

题面翻译

给定 \(n\) 堆石子,个数分别为 \(A_1,A_2,\cdots,A_n\),两两不同。

两个玩家轮流在上面操作,每次操作将任意一堆石子的个数变为 \(0\),当拿走后 \(A_1\;\text{XOR}\;A_2\;\text{XOR}\;\cdots\;\text{XOR}\;A_n=0\),则该玩家获胜。

若先手有必胜策略,输出 Win ,否则输出 Lose

题目描述

机の上に $ N $ 枚のクッキーがあります。クッキーの表面にはそれぞれ正の整数 $ A_1,\ A_2,\ \dots,\ A_N $ が書かれており、これらはすべて異なります。

このクッキーを使って 2 人でゲームを行います。このゲームでは、各プレイヤーは次の行動を交互に行います。

机にあるクッキーを 1 枚選んで食べる。
その際に、机に残ったクッキーに書かれた整数の $ \mathrm{XOR} $ が $ 0 $ になったならば、そのプレイヤーは勝利し、ゲームは終了する。

あなたは E869120 君に対戦を申し込みました。あなたは先手で、E869120 君は後手です。さて、両者が最適に行動したときに、あなたは E869120 君に勝ちますか?

$ \mathrm{XOR} $ とは 整数 $ A,\ B $ のビット単位 XOR、$ A\ \mathrm{XOR}\ B $ は、以下のように定義されます。

  • $ A\ \mathrm{XOR}\ B $ を二進表記した際の $ 2^k $ ( \(k\geq0\)) の位の数は、$ A,\ B $ を二進表記した際の $ 2^k $ の位の数のうち一方のみが $ 1 $ であれば $ 1 $、そうでなければ $ 0 $ である。

例えば、$ 3\ \mathrm{XOR}\ 5\ =\ 6 $ となります (二進表記すると: \(011\mathrm{XOR}101=110\))。
一般に、$ k $ 個の整数 $ p_1,\ p_2,\ p_3,\ \dots,\ p_k$ のビット単位 XOR は $ (\dots\ ((p_1\ \mathrm{XOR}\ p_2)\ \mathrm{XOR}\ p_3)\ \mathrm{XOR}\ \dots\ \mathrm{XOR}\ p_k) $ と定義され、これは $ p_1,\ p_2,\ p_3,\ \dots\ p_k $ の順番によらないことが証明できます。特に $ k\ =\ 0 $ の場合、$ \mathrm{XOR} $ は $ 0 $ となります。

输入格式

入力は以下の形式で標準入力から与えられます。

$ N $ $ A_1 $ $ A_2 $ $ \cdots $ $ A_N $

输出格式

両者が最適に行動したときにあなたが勝つなら Win、負けるなら Lose と出力してください。

样例 #1

样例输入 #1

6
9 14 11 3 5 8

样例输出 #1

Lose

样例 #2

样例输入 #2

1
131

样例输出 #2

Win

样例 #3

样例输入 #3

8
12 23 34 45 56 78 89 98

样例输出 #3

Win

提示

制約

  • $ 1\ \leq\ N\ \leq\ 400000 $
  • $ 1\ \leq\ A_i\ \leq\ 10^9\ (1\ \leq\ i\ \leq\ N) $
  • $ A_1,\ A_2,\ \dots,\ A_N $ はすべて異なる
  • $ A_1,\ A_2,\ \dots,\ A_N $ の $ \mathrm{XOR} $ は $ 0 $ ではない
  • 入力はすべて整数

Sample Explanation 1

この例では、あなたがどんな方法を使っても、E869120 君が最適に行動し続ければ負けてしまいます。 例えば、最初に $ 11 $ が書かれたクッキーを食べるとしましょう。すると、次に E869120 君が $ 9 $ が書かれたクッキーを食べることで、残ったクッキーに書かれた数 $ 14,\ 3,\ 5,\ 8 $ の $ \mathrm{XOR} $ が $ 0 $ になるので、E869120 君が勝ちます。 それ以外の行動をとっても、最終的には E869120 君が勝ちます。

Sample Explanation 2

この例では、あなたは最初のターンで $ 131 $ が書かれたクッキーを食べることしかできません。すると、机の上からクッキーがなくなるので、残ったクッキーに書かれた数の $ \mathrm{XOR} $ は $ 0 $ になります。したがって、E869120 君が何もできないまま、あなたが勝ちます。

解题:

形式化一下:有长度为 \(n\) 的数列,任意删数,最后数列亦或和为 \(0\) 赢。

标签:状态,XOR,必胜,必败,博弈论,笔记,学习,int,mathrm
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/Game-Theory_written_by_sonnety.html

相关文章

  • esXGray开发笔记:基于直线检测的文本倾斜自动校正算法实现(python+opencv)
    昨日采用最小面积矩形的方式实现文本倾斜自动校正,但后面的角度有点麻烦,于是改用基本直线检测的算法。算法简介:检测直线,自动调节参数,至少获取11条直线(直线条数调节)计算每条直线与x轴夹角从返回的角度中找到出现次数较多的直线角度平均值并返回作为图片倾斜角度检测到角度后,就......
  • 【Unity开发】Unity 学习网址 资源 收藏整理大全
    Unity相关网站整理大全众所周知,工欲善其事必先利其器,有一个好的工具可以让我们事半功倍,有一个好用的网站更是如此!但是好用的网站真的太多了,收藏夹都满满的(但是几乎没打开用过......
  • c语言精通学习「2」: 位操作
     1.位操作符包括  &0&0=00&1=01&1=1特定位清零如11010101&11100111=11000101|0|0=0  1|0=1  1|1=1特定位置一~~0=1~1=0逻辑取反是!,真变成加、假变成真^ 1^1=00^0=11^0=0特定位取反<<>> 左移或......
  • salesforce零基础学习(一百三十)Report 学习进阶篇
    本篇参考:https://help.salesforce.com/s/articleView?id=sf.reports_summary_functions_about.htm&type=5https://www.youtube.com/watch?v=bjgZTgYe_84在SalesforceAdmin篇(二)Report中,我们讲过report的一些基础知识,实际工作中往往有些场景比这些复杂很多,接下来根据实际工作......
  • 【免费分享 图书】《阿里云天池大赛赛题解析——深度学习篇》-PDF电子书-百度云
    找这本书的资源简直要把我找吐了,各种网站压缩包一下下来就开始各种套路(比如要你充钱)为了防止还有我这样的受害者,这就把找到的PDF给大家分享一下。链接在文章最后如果这篇文章能够帮到您,麻烦帮我点个赞,并关注一下我,我将有更多动力,持续分享更多有用图书给您!非常感谢,不胜感激!(点......
  • 学习笔记——博弈论
    博弈论中玩家的选择均为对自己最有利の理论最优解.文中提到的必胜状态和必败状态来自要求的游戏起始状态,但不由其推得.这句话可能有些抽象,我也不太会表达(重度社恐),所以举个例子:\(nim\)游戏,3堆石子,分别为1,2,3.最暴力的解法,我们枚举所有可能的状态,然后把他们构成一......
  • 『学习笔记』欧拉函数、莫比乌斯函数、高位前缀和、狄利克雷前后缀和
    欧拉函数定义又叫做\(\varphi\)函数,\(\varphi(x)\)用来描述不大于\(x\)且与\(x\)互素的数的个数。性质满足一切积性函数的性质。若\(a\botb\),则\(f(a\timesb)=f(a)\timesf(b)\).能用线性筛或埃氏筛求出。\(\text{from}\1\\text{to}\n\)中与......
  • Stable Diffusion学习笔记
    一、使用讯飞星火大模型生成StableDiffusionprompt(提示词)#StableDiffusionprompt助理你来充当一位有艺术气息的StableDiffusionprompt助理。##任务我用自然语言告诉你要生成的prompt的主题,你的任务是根据这个主题想象一幅完整的画面,然后转化成一份详细的、高......
  • 【笔者感悟】笔者的学习感悟【八】
    写在前面  今天笔者其实并不是因为某件事情而写这篇博客,今天更多的是对前面一系列经验之谈的总结。在这里也给大家打个预防针,笔者毕竟不是什么大牛,也要和大家一起成长,而且写这个也不是在写书,笔者每一次感悟相当于脑中的一次开会,所以有些问题一直会反复拿出来强调,整体体系上会有......
  • 学习go语言编程之网络编程
    Socket编程Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可。Dial()函数Dial()函数的原型如下:funcDial(network,addressstring)(Conn,error)参数含义如下:network:网络协议名字,如:tcp,udp等Dial()函数支持的网络......