1. 程式人生 > >博弈論進階之SG函式

博弈論進階之SG函式

SG函式

個人理解:SG函式是人們在研究博弈論的道路上邁出的重要一步,它把許多雜亂無章的博弈遊戲通過某種規則結合在了一起,使得一類普遍的博弈問題得到了解決。

從SG函式開始,我們不再是單純的同過找規律等方法去解決博弈問題,而是需要學習一些博弈論中基本的定理,來找到他們的共同特點

那麼就先介紹幾個最基本的定理(也可以叫常識)吧

基本定理

ICG遊戲

1.遊戲有兩個人蔘與,二者輪流做出決策。且這兩個人的決策都對自己最有利。

2.當有一人無法做出決策時遊戲結束,無法做出決策的人輸。無論二者如何做出決策,遊戲可以在有限步內結束。

3.遊戲中的同一個狀態不可能多次抵達。且遊戲不會有平局出現。任意一個遊戲者在某一確定狀態可以作出的決策集合只與當前的狀態有關,而與遊戲者無關。

滿足上述條件的問題我們稱之為ICG遊戲,ICG遊戲屬於組合遊戲

最典型的nim遊戲,就是一種ICG遊戲

必勝態與必敗態

定義P-position與N-position

P-position:必敗態(簡記為P),即Previous-position,你可以直觀的認為處於這種狀態的人一定會輸

N-position:必勝態(簡記為N),即Next-position,你可以直觀的理解為處於這種狀態的人一定會贏

這僅僅是最直觀的定義

更嚴謹的定義為:

  1. 無法移動的狀態(即terminal-position)為P
  2. 可以移動到P的局面為N
  3. 所有移動都會進入N的局面為P

DAG(有向無環圖)中的博弈

在正式研究\(SG\)

函式之前,我們先來研究一下DAG中的博弈

給定一張有向無環圖,在起始定點有一枚棋子,兩個頂尖聰明的人交替移動這枚棋子,不能移動的人算輸

不要小看這個遊戲,事實上,所有ICG問題都可以抽象為這種遊戲(即把初始局面看做頂點,把從一個狀態可以到另一個狀態之間連邊)

SG函式

下面我們來正式研究一下SG(Sprague-Grundy)函式

首先定義mex運算,這是一種集合中的運算,它表示最小的不屬於集合的非負整數

例如\(mex\{1,2,3\}=0\)\(mex\{0,2\}=1\)\(mex\{0,1,2,3\}=4\)\(mex\{\}=0\)

對於給定的有向無環圖,定義每個點的SG函式為

\(SG(x)=mex \{\ SG(y)\ |\ x \ can\ go\ to\ y \}\)

然而單單一個這樣的空洞的函式是解決不了問題的,我們需要分析一下它的性質

  • 所有匯點的\(SG\)函式為\(0\)

這個性質比較顯然,因為匯點的所有後繼狀態都是空集

  • \(SG(x)=0\)時,該節點為必敗點

\(SG\)函式的性質易知該節點的所有後繼節點\(SG\)值均不為\(0\)

滿足必敗態的定義

  • 當$SG(x)\neq 0 $,該節點為必勝點

\(SG\)函式的定義可知該節點的後繼節點中一定有一個節點\(SG=0\)

滿足必勝態的定義

這樣我們通過最基本的\(SG\)值的定義,我們就可以判斷出一個狀態是必勝態還是必敗態

這個問題實際上就是我們前面講的巴什博奕

如果這個問題再複雜一點呢?

當這個棋盤上有\(n\)個棋子的時候呢?

其實它們的分析思路是一樣的

\(SG(x)=k\)時,它表明後繼狀態中含有\(SG(y)=1 \dots k-1\)

也就是說,我們從\(k\)可以轉移到\(1 \dots k-1\)中的任何一個狀態,而當前共有\(n\)個棋子。

這會讓你想到什麼?

nim取石子游戲!

那我們是不是也可以推出:

如果在nim遊戲中的\(n\)堆石子的\(SG\)值異或和不為\(0\)就說明先手必勝呢?

這是肯定的,因為當你打出nim遊戲的\(SG\)值表時就會發現,\(SG_{nim}(x)=x\)

是不是很神奇?

SG定理

SG函式的應用遠遠不止和巴什博奕與nim遊戲有關,我們回過頭來考慮能否把SG函式推廣開來

類比nim取石子游戲的思路,我們可不可以大膽設想:

遊戲的和的SG值是他們的SG值的xor

暫且不管這個結論對不對,我們設想一下,假如這個結論對的話,會有什麼後果.

我們可以將ICG問題對應到DAG上,然後直接通過SG函式之間的轉移而解決幾乎全部的問題

是不是很令人興奮?

更令人興奮的是,這個定理是正確的!

什麼?證明?

如果你是一個追求完美的人可以看這裡

如果你像我一樣連線性代數都不知道是什麼的話大概就是從DAG上歸納一下就好了吧

SG定理的應用

SG定理的應用非常的廣泛,幾乎所有的博弈類問題都有它的影子,本文僅僅是簡單的介紹一下這個定理,更深層次的應用以後會補充的

上面提到了SG函式,那麼SG函式的值是怎麼計算的呢?

很簡單,我們直接通過\(mex\)運算的定義就可以計算了

int F[MAXN];//可以轉移的狀態集合,一般題目會給出 
int S[MAXN];//表示該點可以轉移到的狀態有哪些 
int SG[MAXN];//該點的SG值 
void GetSG()
{
    for(int i=1;i<=N;i++)//列舉DAG中所有點 
    {
        memset(S,0,sizeof(S));//初始化
        for(int j=1;j<=limit&&F[j]<=i;j++)//limit表示轉移的集合的大小
            S[SG[i-F[j]]]=1; 
        for(int j=1;;j++)
            if(!S[j])
                {SG[i]=i;break;}//根據定義計算SG函式 
    }
}

來一道裸題

題解

相關推薦

博弈論SG函式

SG函式 個人理解:SG函式是人們在研究博弈論的道路上邁出的重要一步,它把許多雜亂無章的博弈遊戲通過某種規則結合在了一起,使得一類普遍的博弈問題得到了解決。 從SG函式開始,我們不再是單純的同過找規律等方法去解決博弈問題,而是需要學習一些博弈論中基本的定理,來找到他們的共同特點 那麼就先介紹幾個最基本的定理(

博弈論SG函數

神奇 不為 mat 定義 巴什博奕 show xor 一起 rmi SG函數 個人理解:SG函數是人們在研究博弈論的道路上邁出的重要一步,它把許多雜亂無章的博弈遊戲通過某種規則結合在了一起,使得一類普遍的博弈問題得到了解決。 從SG函數開始,我們不再是單純的同過找規律等方法

博弈論Anti-SG遊戲與SJ定理

的人 數量 gpo attack log span html 們的 勝利 前言 在上一節中,我們初步了解了一下SG函數與SG定理。 今天我們來分析一下SG遊戲的變式——Anti-SG遊戲以及它所對應的SG定理 首先從最基本的Anti-Nim遊戲開始 Anti-Nim遊戲是這

博弈論Multi-SG

Multi-Nim 從最簡單的Nim模型開始 它的定義是這樣的 有\(n\)堆石子,兩個人可以從任意一堆石子中拿任意多個石子(不能不拿)或把一堆數量不少於\(2\)石子分為兩堆不為空的石子,沒法拿的人失敗。問誰會勝利 博弈分析 這個問題的本質還是Nim遊戲,可以利用SG定理來解釋 通過觀察不難不發現,操作

博弈論Every-SG

Every-SG 給定一張無向圖,上面有一些棋子,兩個頂尖聰明的人在做遊戲,每人每次必須將可以移動的棋子進行移動,不能移動的人輸 博弈分析 題目中的要求實際是“不論前面輸與否,只要最後一個棋子勝利,那麼就算勝利” 這樣的話,能贏得遊戲必須贏 因為兩個人都頂尖聰明,因此當一個人知道某一個遊戲一定會輸的話,它

博弈論樹的刪邊遊戲與無向圖的刪邊遊戲

PS:本文內容大部分借(chao)鑑(xo)自yhqz 樹的刪邊遊戲 給出一個有 N個點的樹,有一個點作為樹的根節點。遊戲者輪流從樹中刪去邊,刪去一條邊後,不與根節點相連的部分將被移走。誰無法移動誰輸。 結論 葉子節點的SG值為0;中間節點的SG值為它的所有子節點的SG值加1後的異或和。 證明 無向

JavaScript高階函式

JavaScript進階之高階函式篇    簡介:歡迎大家來到woo爺說前端;今天給你們帶來的是JavaScript進階的知識,接下來的系列都是圍繞著JavaScript進階進行闡述;首先我們第一篇講的是高階函式。   高階函式定義:高階函式是指操作函式的函式;一般情況在專案開發過程中都會分兩種情況    

pytestfixture函式

fixture函式存在意義   與python自帶的unitest測試框架中的setup、teardown類似,pytest提供了fixture函式用以在測試執行前和執行後進行必要的準備和清理工作。但是相對來說又比setup、teardown好用。 firture相對於setup和teardown的優勢

函式閉包

定義:一個函式a返回了它裡面函式的函式名稱b給返回了,當在外部拿到函式b的時候,a的記憶體是不會釋放的,所以我們在外部可以執行函式b,並且還能用函式a作用域裡面的所有的值,這就叫閉包。示例: def func(): n = 10 def func2(): print(

函式名稱空間

名稱空間是名稱到物件的對映。名稱空間是一個字典的實現,鍵為變數名,值是變數對應的值。各個名稱空間是獨立沒有關係的,一個名稱空間中不能有重名,但是不同的名稱空間可以重名而沒有任何影響。x = 1在記憶體中是{x:4304947712} x對應的是1的記憶體地址名稱空間分三種locals: 是函式內的名稱空間

函式生成器和迭代器

前提: 列表生成式 給列表a裡的大於5的每一個值加10 a = [1, 2, 5, 6, 7, 8] a = [i + 10 if i > 5 else i for i in a] # 可以迴圈任何可迴圈的東西,不過只能寫到列表或元組裡。 print(a) # [1, 2, 5, 16,

函式節流與函式防抖

原文標題:函式節流與函式防抖 原文地址:https://justclear.github.io/throttle-and-debounce/ 原文作者:justclear   什麼是函式節流與函式防抖 舉個栗子,我們知道目前的一種說法是當 1 秒內連續播放 24 張以上

(轉)Python內建函式“屬性(property())”詳解

原文:https://blog.csdn.net/GeekLeee/article/details/78519767 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/GeekLeee/article/details/78519767屬性函式(property

ORACLE三:分析函式

有時候我們需要從DB中提取一些很複雜的資料,而標準SQL卻對此無能為力,或者是執行效率非常的低;比如我們需要提取如下資料:    逐行顯示各個部門的累計工資,每行包括部門內前面所有人的工資總和;    查詢各個部門工資最高的前N個人;    …… 語法 Function名稱(

C語言路------字串的反序輸出(輸入字串然後呼叫函式反序輸出)

#include<stdio.h> #include<string.h> int main() {void fanxu(char x[]);char a[80];scanf("%s",a);fanxu(a);printf("%s\n",a);retu

【FreeRTOS】小白任務如何共用FreeRTOS軟體定時器回撥函式(二)

介紹兩個定時器任務如何通過定時器 handle 共用一個回撥函式。 1、標頭檔案宣告和函式定義 #include "FreeRTOS.h" #include "task.h" #include "t

JavaScript函式

1.什麼是函式 函式的作用,可以寫一次程式碼,然後反覆地重用這個程式碼。 如:我們要完成多組數和的功能。 var sum; sum = 3+2; alert(sum); sum=7+8 ; alert(sum); …. //不停重複兩行程式碼

博弈論基礎sg函式與nim

  在演算法競賽中,博弈論題目往往是以icg。通俗的說就是兩人交替操作,每步都各自合法,合法性與選手無關,只與遊戲有關。往往我們需要求解在某一個遊戲或幾個遊戲中的某個狀態下,先手或後手誰會勝利的問題。就比如經典的:幾堆石子,兩人可以分別拿若干個,一次只能選擇一個石子堆操作,問給定狀態下,先手勝利還是後手勝利?

CSS

模式 ant 表格 weight mil 比較 標題 根據 amp 下面主要引用http://www.cnblogs.com/wangfupeng1988/tag/css知多少/ CSS進階筆記: 一、學習CSS的三個突破點 1.瀏覽器如何加載和解析CSS——CSS的5個來

Android 動畫動畫切換

ram 屏幕 pre 退出 tac 旋轉動畫 utf 轉動 XML 一、Activity切換動畫   在Android開發中,經常會遇到Activity之間切換效果,下面介紹一下,Activity左右滑動切換效果。在Android2.0以後版本,在Activity中添加了