【博弈论】信竞博弈论入门笔记_SG函数_纳什均衡

目录

  • 背景
  • 一些资料
  • 平等组合游戏
    • 约定
    • Min-Max
    • NIM
    • SG函数
    • anti-NIM
  • 完全信息静态博弈
    • 约定
    • 纳什均衡(未完成求解方法)
      • 纯策略纳什均衡
      • 混合策略纳什均衡

背景

本人长期徘徊于弥补多项式短板/写字符串爽题/码毒瘤数据结构/看数学书这四件奇怪的事情上,因此水平很菜。

以前接触过一点简单的博弈论,但那实在是太简单了,就是对抗搜索(Min-Max)。

近期训练,做到了一道SAMParent-Tree上倍增之后博弈的题目,SAM都码完了,一看那个博弈,越看越慌,发现自己根本不会:何止不会,一分都拿不到。

于是开始恶补博弈论,发现很妙,但是挺好理解的。

本文因为作者被作业抓走了,暂时没有完成纳什均衡的内容。

update:发现那道促使我学习博弈论的题目是道假题,具体可以看我在anti-NIM里的内容

tip: 文章中的大量(哔——),是我为净化网络环境所作的努力(雾

一些资料

oi-wiki 基本可以博弈论入门了

SG函数入门及例题 这篇文章良心

anti-NIM问题入门 很短,anti-NIM建议把SG搞懂之后作为一个应用加深了解,但是他是(哔——)(哔——),证明有点问题。

纳什均衡的一个例子 初步演示纳什均衡在OI中的用法

纳什均衡/划线法 这篇文章我弄出来,只是为了说明划线法(哔——)得不得了

纳什均衡/靠谱计算方法 个人认为是比较靠谱的纳什均衡计算方法(疯狂diss划线法)

纳什均衡/混合策略 (FBI Warning)这玩意儿太神仙了,个人计划如果有时间找一本博弈论的书来学习这一块内容,但讲道理OI里面大概是不会出现这种东西的(搞个纳什均衡出来就不错了)。

纳什均衡/生动例子(雾 这可是我太爷爷的太爷爷关注的up主[doge]手动滑稽

相信大家看出来了,我不想写纳什均衡,于是资料收集了很多。

平等组合游戏

一些定义、约定及基本规律

  • 平等组合游戏(不严谨)

    • 两个人参与,且一胜一负
    • 每个人面对所有局面的可能选择都是一样的
    • 游戏总能结束,即,可以把所有状态抽象成点,选择抽象成边,游戏会变成 D A G DAG DAG
    • 一般而言不能操作者输(不能操作者赢就是anti-NIM问题)
  • N-position&P-position

    • 对于一个状态,如果当前获得这个状态的人能获胜,则称之为N-position(Now)
    • 对于一个状态,如果前一个状态转移过来的人能获胜,则称之为P-position(Pre)
  • 如果一个状态是N-position,则他一定可以转移到一个P-position

  • 如果一个状态是P-position,则他的所有转移都一定指向N-position

Min-Max搜索

作用及简介

就是搜索平等组合游戏最暴力的方法,你能用这个方法得出几乎所有这类问题的指数级暴力算法

很基础,所以也没什么好讲的。

大致流程

先抽象状态,然后写暴力从题目给定的初始状态出发,用基本事实以及边界条件判断每个状态是N还是P。

因此,记忆化搜索是常用的。

可以结合这样一个问题来理解这个过程:

  • Alice和Bob在做游戏,这个游戏是在一个 n × n n\times n n×n棋盘上进行的,棋盘中每个格子都有一定的金币,Alice和Bob轮流操控一枚初始时在棋盘左上角的棋子,每人每次移动一格,并收集目标格子里的金币(重复经过可重复收集),每轮Alice移动一次之后Bob移动一次,共移动 m m m轮。
  • 因为Alice是mhw,所以所有金币全部归她,而Bob会一无所有。自然地,Alice希望最大化收集到的金币数,而Bob则希望最小化这个数值。
  • 给出棋盘大小,每个格子里的金币数,进行的轮数,求最终Alice可以获得多少金币。

(原创题,但是也许比较经典,会在什么地方有类似的题目)

NIM问题

简介

这几乎是博弈论里面最经典的问题了。后文的SG函数以及anti-NIM问题的理解基本都要以其作为基础。

描述

现在你有 n n n堆石子,第 i i i堆石子有 a i a_i ai个。两个人轮流进行游戏,每次可以从任意一堆中拿走任意数量的石子,但不能不拿,不能行动的人就输了。问是先手必胜还是后手。

结论

先手能获胜,当且仅当 a 1 a_1 a1 ^ a 2 a_2 a2 ^ a 3 a_3 a3 ^ … ^ a n ≠ 0 a_n\neq0 an=0

换言之,就是一个状态异或和不为0就是N-position,一个状态异或和为0就是P-position

证明

  • 最终获胜者的最后一步操作,在异或和上的体现,就是从非0变成了0。

  • 接下来,只要证明有这样一种方法,使得非0的异或和减去一个数字之后异或和就能变成0。

  • 设当前异或和为 k k k h i g h b i t ( k ) = d highbit(k)=d highbit(k)=d h i g h b i t ( k ) = d highbit(k)=d highbit(k)=d表示 k k k在二进制下最高位为第 d d d位),则必有 a i a_i ai d d d位是1。我们将这个 a i a_i ai变为 a i ′ = a i a_i^{\prime}=a_i ai=ai ^ k k k

  • 考虑到 k k k a i a_i ai在第 d d d位上都为1,因此 a i ′ a_i^{\prime} ai在第 d d d位上为0,因此 a i ′ < a i a_i^{\prime}<a_i ai<ai,移动合法。

  • 而对方在拿到了一个异或和为0的状态之后,不论怎么移动,移动完异或和必定不为0

我们就给出了一个构造性的证明。

SG函数

定义及约定

  • 我们假定这样一种游戏模型:一张 D A G DAG DAG上选择了 n n n个点 a 1 , a 2 , a 3 , . . . , a n a_1,a_2,a_3,...,a_n a1,a2,a3,...,an,每次操作者可以选择一个点,沿着这张 D A G DAG DAG的一条边走一步,不能走的人就输了,问先手胜还是后手胜。
  • m e x ( S ) = min ⁡ n ∈ N , n ∉ S n mex(S)=\min\limits_{n\in N,n\notin S}{n} mex(S)=nN,n/Sminn,就是不在集合 S S S中的最小非负整数。
  • s g ( x ) = m e x ( { s g ( y ) ∣ x → y } ) sg(x)=mex\left(\left\{sg(y)|x\rightarrow y\right\}\right) sg(x)=mex({sg(y)xy}),其中 x → y x\rightarrow y xy这个表达可能不正规,是状态 x x x可以转移到状态 y y y的意思。
  • 我们称一个游戏在 A = { a 1 , a 2 , . . . , a n } A=\{a_1,a_2,...,a_n\} A={a1,a2,...,an}这个初始状态下的 S G ( A ) SG(A) SG(A) s g ( a i ) sg(a_i) sg(ai)的异或和。

定理

一个状态 A A A是N-position(先手获胜),当且仅当 S G ( A ) ≠ 0 SG(A)\neq0 SG(A)=0

证明

我们发现这个东西真的与NIM问题很像。

  • 考虑 D A G DAG DAG上没有出边的点,其 s g sg sg一定为0,而一个人输了,就是他拿到的状态里所有的点都没有出边。因此此时这个状态 S G = 0 SG=0 SG=0,是P-position。
  • 考虑一个点 a a a,如果 s g ( a ) = k sg(a)=k sg(a)=k,则他能转移到的状态b中,一定有 s g ( b ) = 0 , s g ( b ) = 1 , . . . s g ( b ) = k − 1 sg(b)=0,sg(b)=1,...sg(b)=k-1 sg(b)=0,sg(b)=1,...sg(b)=k1的,这一点与NIM问题很像,因为NIM中,我们也可以把一堆 k k k个的石子变成 0 , 1 , 2 , . . . , k − 1 0,1,2,...,k-1 0,1,2,...,k1个中的任意一个。
  • 那么,当我们遇到一个 S G ( A ) ≠ 0 SG(A)\neq0 SG(A)=0的状态的时候,我们可以把 s g sg sg的值的大小看作这一堆的石子数,借用上面NIM问题的方法,把状态 a i ∣ h i g h b i t ( s g ( a ) ) = h i g h b i t ( S G ( A ) ) a_i|highbit(sg(a))=highbit(SG(A)) aihighbit(sg(a))=highbit(SG(A)),变为状态 a i ′ a_i' ai使得 s g ( a i ′ ) = s g ( a i ) sg(a_i')=sg(a_i) sg(ai)=sg(ai) ^ S G ( A ) SG(A) SG(A)即可。
  • 同样的,一个 S G ( A ) = 0 SG(A)=0 SG(A)=0的状态,进行一步改变, S G ( A ′ ) SG(A^{\prime}) SG(A)是一定会不等于0的。

anti-NIM

注意anti-NIM问题的结论只有在取石子游戏或者具有某种特殊性质的 S G SG SG函数中才成立。那道促使我学习博弈论的题目就是因为其误用了anti-NIM的结论,将其错误地推广至一般情况。

取石子游戏

描述

其他条件都和一般的NIM游戏一样,只是判定胜利的条件变成了不能走的人是赢家。

定理

对于一个状态 A = { a 1 , a 2 , . . . , a n } A=\{a_1,a_2,...,a_n\} A={a1,a2,...,an}

  • max ⁡ s g ( a i ) ≤ 1 \max sg(a_i)\leq 1 maxsg(ai)1,则其为N-position当且仅当 S G ( A ) = 0 SG(A)=0 SG(A)=0
  • max ⁡ s g ( a i ) > 1 \max sg(a_i)>1 maxsg(ai)>1,则其为N-position当且仅当 S G ( A ) ≠ 0 SG(A)\neq0 SG(A)=0

其中 a i a_i ai表示第 i i i堆石子的个数;在这个问题里, s g ( a i ) = a i sg(a_i)=a_i sg(ai)=ai

证明
  • max ⁡ s g ( a i ) > 1 \max sg(a_i)>1 maxsg(ai)>1 (Case1)
    • S G ( A ) ≠ 0 SG(A)\neq0 SG(A)=0 (Case1.1)
      • 当有多个 s g ( a i ) > 1 sg(a_i)>1 sg(ai)>1时 (Case1.1.1)
        S G SG SG函数里的证明差不多,我们总能将 A A A变为 A ′ A' A使得 S G ( A ′ ) = 0 SG(A')=0 SG(A)=0
      • 当只有一个 s g ( a i ) > 1 sg(a_i)>1 sg(ai)>1时 (Case1.1.2)
        我们发现修改后会造成 max ⁡ s g ( a i ) ≤ 1 \max sg(a_i)\leq1 maxsg(ai)1,我们应当使得 S G ( A ′ ) SG(A') SG(A)不为0。假设我们沿用原来的方法,求得 a i a_i ai应变为 a i ′ a_i' ai,则我们实际应将之变为 a i ′ ′ a_i'' ai使得 s g ( a i ′ ′ ) = s g ( a i ′ ) sg(a_i'')=sg(a_i') sg(ai)=sg(ai) ^ 1 1 1。此时易知 s g ( a i ′ ′ ) ∈ { 0 , 1 } sg(a_i'')\in\{0,1\} sg(ai){0,1},因此我们就成功转移到了一个P-position,并且 a i → a i ′ ′ a_i\rightarrow a_i'' aiai是合法的转移
    • S G ( A ) = 0 SG(A)=0 SG(A)=0(Case1.2)
      • 此时一定有超过1个 s g ( a i ) > 1 sg(a_i)>1 sg(ai)>1,因此 S G SG SG函数那里的讨论依然适用。 (Case1.2.1)
  • max ⁡ s g ( a i ) ≤ 1 \max sg(a_i)\leq1 maxsg(ai)1(Case2)
    • S G ( A ) = 0 SG(A)=0 SG(A)=0(Case2.1)
      • 若存在 s g ( a i ) = 1 sg(a_i)=1 sg(ai)=1,将之变为0即可 (Case2.1.1)
      • 若不存在 s g ( a i ) = 1 sg(a_i)=1 sg(ai)=1,即所有 s g ( a i ) sg(a_i) sg(ai)都是0,我们发现这就是结束状态。 (Case2.1.2)
    • S G ( A ) ≠ 0 SG(A)\neq0 SG(A)=0,即 S G ( A ) = 1 SG(A)=1 SG(A)=1(Case2.2)
      • 要么在0和1之间改动,使得 max ⁡ s g ( a i ) ≤ 1 \max sg(a_i)\leq1 maxsg(ai)1 S G ( A ′ ) = 0 SG(A')=0 SG(A)=0 (Case2.2.1)
      • 要么将一个数 a i a_i ai改动至 a i ′ a_i' ai使得 s g ( a i ′ ) > 1 sg(a_i')>1 sg(ai)>1,此时 max ⁡ s g ( a i ) > 1 \max sg(a_i)>1 maxsg(ai)>1 S G ( A ′ ) ≠ 0 SG(A')\neq0 SG(A)=0 (Case2.2.2)

此处做详细证明,是为了后文说明方便。

推广

一个错误推广

/*一点唠叨 *\
既然,普通的NIM问题可以推广到一般的SG函数,那么,anti-NIM直觉上也是可以的。

而且你稍微想一下,会觉得如果把 s g sg sg值看作石子个数,那么根据上文的证明,这就是成立的。

但是,事实真的与我们的直觉一致吗?

这可是反直觉的博弈论诶。

我曾经也以为这个直觉是对的,直到我详细写出了证明。
\*唠叨结束 */

  • 我们定义一个anti-SG问题一般形式为:初始时,在一张 D A G DAG DAG上放置了 n n n个点,双方轮流行动,最终不能行动的一方获胜,给定 D A G DAG DAG与初始条件,求是先手必胜还是后手必胜。
  • 错误地推广来的结论:anti-SG问题中,先手必胜的条件与取石子游戏相同。
错误性证明
  • 在anti-NIM的分类讨论里面,我们逐条分析,发现除了(Case2.1.2),其他都是对的。
    (在证明中我特意把所有的石子个数都写成了 s g ( a i ) sg(a_i) sg(ai),就是为了现在不用再写一遍)
  • (Case2.1.2)的条件是:所有 s g ( a i ) sg(a_i) sg(ai)都为0。在取石子游戏中,我们发现这就是终止状态了,但是在一般的 D A G DAG DAG中,并不是这样的。有可能非终止节点的 s g sg sg也为0。此时,我们发现只要你进行转移, S G ( A ′ ) SG(A') SG(A)就一定不为0。
    • 如果转移后的 s g ( a i ′ ) = 1 sg(a_i')=1 sg(ai)=1,则根据要证明的结论,我们转移至一个P-position,还是可以的。
    • 如果转移后的 s g ( a i ′ ) > 1 sg(a_i')>1 sg(ai)>1,则根据要证明的结论,我们转移至一个N-position,这就不行了。
  • 事情就出在这里,你不能保证一定可以转移到一个 s g ( a i ′ ) = 1 sg(a_i')=1 sg(ai)=1的节点。
  • 由于我们这是一个数学归纳的过程,这一步的结论出错,其他所有结论就都错了,几乎无法挽救。
一个反例

这里给出一个反例,以说明我没有在说瞎话。

考虑有向图: 1 → 2 2 → 3 3 → 4 2 → 4 1\rightarrow2\qquad2\rightarrow3\qquad3\rightarrow4\qquad2\rightarrow4 12233424

即:

一道错题

就是那道促使我学习博弈论的题目:

题面
  • 给出一个由小写英文字母构成的字符串 S S S,再取 n n n个字符串,它们都是 S S S的子串,之后开始游戏,两人轮流操作:

    • 每次选一个串,在其后添加一个英文字母,保证添加后该串仍为 S S S的子串。
  • 谁不能操作谁输,或者谁不能操作谁胜(这是两种询问)。

题解(误
  • 我们发现,这就是在SAM上作一般的SG游戏以及anti-SG游戏。
  • 那么,第一种询问就可以随便完成,第二种询问就是假的,不可作。
推广的补救方法

我们发现,证明告诉我们,错误的原因时 s g ( a i ′ ) sg(a_i') sg(ai)不一定可以为1。那么,如果我们在条件当中加入一条:

  • 保证所有 s g = 0 sg=0 sg=0节点,要么是终止节点,要么一定可以转移到 s g = 1 sg=1 sg=1的节点

就可以了。

推广的另一补救方法

我们发现,可以修改问题本身,令获胜条件就是所有 s g ( a i ) sg(a_i) sg(ai)全部都是0。

我翻资料的时候发现在网络上对于这个问题有一个名字:SJ。

完全信息静态博弈

定义

  • 就是若干方博弈,所有人能做出的选择,每种选择带来的收益等一切信息所有人都知道

纳什均衡

概述

其实有四种纳什均衡:严格占优纳什均衡、重复剔除的占优策略均衡、纯策略纳什均衡、混合策略纳什均衡。

这四种是包含关系:严格占优纳什均衡<重复剔除的占优策略均衡<纯策略纳什均衡<混合策略纳什均衡

但是前两种本人不太了解,而且我认为纯策略纳什均衡已经比较容易理解了,所以我从第三个写起。

低阶版本-纯策略纳什均衡

定义

我们发现,如果现在有 n n n个人在博弈,而且其中 n − 1 n-1 n1个人的决策都确定了,则最后一个人有若干确定的最优决策和一个最大收益。

我们记一个局面 S = { s 1 , s 2 , . . . , s n } S=\{s_1,s_2,...,s_n\} S={s1,s2,...,sn},其中 s i s_i si表示第 i i i个人的决策。

我们为了方便,记 u S , i u_{S,i} uS,i表示在局面 S S S下第 i i i个人的收益。(这个记法不正规,但是正规的有点烦)

由此,我们称一个局面 S = { s 1 , s 2 , . . . , s i , . . . , s n } S=\{s_1,s_2,...,s_i,...,s_n\} S={s1,s2,...,si,...,sn}为纳什均衡当且仅当:

  • 对于每一个人 i i i,都不存在 S ′ = { s 1 , s 2 , . . . , s i ′ , . . . , s n } S'={\{s_1,s_2,...,s_i',...,s_n\}} S={s1,s2,...,si,...,sn}使得 u S ′ , i > u S , i u_{S',i}>u_{S,i} uS,i>uS,i
  • 换而言之,就是每个人在其他人决策不变的情况下,都取到了可能的最佳结果。
举个栗子
  • 现在有JSOI王国(简称J)正在和SAO(简称S)王国战略对峙,双方都初步掌握了卡常技巧,但是世界上其他人全都不会卡常,因此他们就取得了巨大优势,所有人都打不过它们,他们因此不受任何人的管束,可以随意瞎搞,人们称他们为:两大(哔——)
  • 他们发展了一段时间卡常技巧之后,感觉这个东西太毒瘤了,一旦互相出题出的全是卡常题,事情将会一发不可收拾。他们一致决定相互协商,禁止卡常技术的继续研究发展。
  • 但是考虑到如果自己老老实实地停止发展,但是对方悄密密地继续,自己就会打不过对方。而且,如果自己不遵守,对方也无计可施。因此,他们就决定劝说对方禁止,反正自己不禁止。
  • 于是,他们继续发展卡常技术。此时双方就达成了一种纳什均衡状态。
  • 也就是说,双方都有两种选择:发展/不发展。但是不管对方是什么选择,自己永远是选择发展可以获得更大的利益,因此双方在追求利益最大化的过程中都会作出这种选择。这段话绝对没有对国际现象有任何影射

一个更加正常的例子,可以看这里

计算方法
划线法

我先讲一下,我认为这个方法就是(哔——)(哔——)。

所以,我不想写。看这里

但是,不得不说,这个方法还是有可取之处的。他揭示了纳什均衡的本质,让人能够看出来纳什均衡究竟在什么时候会出现。这实际上为其它的解法奠定了基础。而且他让你能手算小模型的纳什均衡。

求函数交点

参考博客:纳什均衡/靠谱计算方法

高阶版本-混合策略纳什均衡

啊啊啊,这个坑太大了,我不填。

update: 我填,我填

混合策略
  • 混合策略大致解释:每个决策概率进行,决定决策实际是决定每个决策的进行概率。此时的纳什均衡就是对于每个人,其他所有人的决策固定,此时自己的决定的期望收益最大。
  • 比较数学化的表述:对于一个人他有纯策略策略: S = { s 1 , s 2 , . . . , s n } S=\{s_1,s_2,...,s_n\} S={s1,s2,...,sn}
    我们再记一个概率向量 X = ( x 1 , x 2 , . . . , x n ) X=(x_1,x_2,...,x_n) X=(x1,x2,...,xn)表示其概率选择。
    即,这个人选择 s 1 s_1 s1策略的概率是 x 1 x_1 x1,选择 s 2 s_2 s2策略的概率是 x 2 x_2 x2,…,选择 s n s_n sn策略的概率是 x n x_n xn
    那么,我们就称 X X X是这个人的一个混合策略。
  • 这种情况下的纳什均衡在理解上是与纯策略相同的,只不过其中的策略是纯策略的扩展。
混合策略的意义

很多事情是没有纳什均衡的(比如石头剪刀布)

但是,如果你把每种决策的概率考虑进去来构成策略,他就有纳什均衡了。

事实上,这会更加贴近现实生活。

单纯形法
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纳什均衡博弈论的一个重要概念,对于多人博弈模型,可以使用Matlab进行计算。下面是一个简单的纳什均衡计算的Matlab代码示例: ```matlab % 定义收益矩阵 payoff_matrix = [2 0; 0 1]; % 定义两名玩家的策略空间和初始策略 strategies = [0 1; 0 1]; player1_strategy = 1; player2_strategy = 1; % 计算每个玩家的收益 player1_payoff = payoff_matrix(player1_strategy, player2_strategy); player2_payoff = payoff_matrix(player2_strategy, player1_strategy); % 迭代计算纳什均衡 for i = 1:100 % 更新玩家1的策略 [~, max_index] = max(payoff_matrix(:, player2_strategy)); player1_strategy = max_index; % 更新玩家2的策略 [~, max_index] = max(payoff_matrix(player1_strategy, :)); player2_strategy = max_index; % 计算每个玩家的收益 player1_payoff = payoff_matrix(player1_strategy, player2_strategy); player2_payoff = payoff_matrix(player2_strategy, player1_strategy); end % 输出纳什均衡策略和收益 fprintf('纳什均衡策略为: (%d,%d)\n', player1_strategy, player2_strategy); fprintf('玩家1的收益为: %d\n', player1_payoff); fprintf('玩家2的收益为: %d\n', player2_payoff); ``` 这个代码示例使用了一个2人博弈的收益矩阵,其中第一行是玩家1的收益,第二行是玩家2的收益。初始化时,玩家1和玩家2的策略都是第一列,即选择第一种策略。然后使用一个简单的迭代算法来计算纳什均衡策略。在每一次迭代中,玩家1会选择收益最大的策略,而玩家2会选择玩家1在当前策略下收益最大的策略。最终,程序输出纳什均衡策略和每个玩家的收益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值