1. 程式人生 > >[您有新的未分配科技點]博弈論進階:似乎不那麽恐懼了…… (SJ定理,簡單的基礎模型)

[您有新的未分配科技點]博弈論進階:似乎不那麽恐懼了…… (SJ定理,簡單的基礎模型)

裏的 如果 cnblogs 經典 ant 控制 nim osi 取石子

這次,我們來繼續學習博弈論的知識。今天我們會學習更多的基礎模型,以及SJ定理的應用。

首先,我們來看博弈論在DAG上的應用。首先來看一個小例子:在一個有向無環圖中,有一個棋子從某一個點開始一直向它的出點移動,雙方輪流操作,無法操作者輸,問是否先手必勝。

考慮一下我們之前的Nim遊戲,如果我們把後繼狀態看成後繼點的話,不難發現Nim遊戲的互相轉移也是一個DAG。因此,DAG上出度為0的點的sg值為0,再用上一篇博客提到的mex操作來求每個點的值就可以了(註意,這並不是一個“大”子圖,不能拆成子遊戲,因此不能異或了!)。在圖上的遞推操作是O(n)的,按照逆向拓撲序遞推即可;如果有向無環圖有多個,又怎麽辦呢?那麽顯然這個時候就可以異或了,直接計算即可。

接下來,我們來看一種Anti-SG遊戲。顧名思義,這種遊戲和一般的SG函數遊戲不太一樣:在這種遊戲中,最後不能行動的人反而是贏家。那麽現在怎麽判斷一個狀態是N-Position(必勝)還是P-Position(必敗)呢?

首先,很顯然,如果有奇數個大小為1的石子堆,則先手必敗;如果有偶數個,則先手必勝。

接著,我們從最簡單的情況開始考慮,石子堆全是1的狀態,肯定是由恰好有一個石子堆大於1個的狀態走過來的

那麽,誰拿到了這個狀態,誰就能獲勝。因為拿到這個狀態的人可以通過控制最大那堆石子剩下的個數(1個或者0個)來使自己必勝

那麽我們繼續考慮。如果有一個人可以拿到這個先手必勝的狀態,他一定是在初始狀態是就“先手必勝”了。而初始狀態的“先手必勝”和上一條的“先手必勝”意義不同:這裏的初始狀態先手必勝,指的是他能控制遊戲的走向,從而使自己能拿到想要的狀態

,因此這裏的“先手必勝”和Nim遊戲一樣,要求子遊戲異或和大於0即可;而在拿到上述恰好有一個石子堆大於1個的狀態之後,他一定是必勝的。

因此,只要初始的石子狀態不是全為1,我們仍然可以用Nim的異或和做法來判斷;而當狀態全是1時,我們直接根據堆數奇偶判斷即可。上面這些東西的學名就叫做“SJ定理”。如果不是取石子遊戲,而是其他不確定sg計算方法的遊戲(有向圖遊戲,臺階遊戲……均可),我們可以先假設不能移動者贏,求出sg函數計算式,再利用SJ定理轉化求解。

接下來,我們再來看一種新遊戲模型:Muitl-SG遊戲。這種遊戲允許取走某些東西後,使原遊戲唄分成幾個新遊戲。我們來看一道小例題:有n排石子,每次要從其中的一排中取出相鄰的兩個石子。無法操作者輸。

這種問題如何操作呢?不難發現,在取走這兩個石子後,原來的大遊戲的後繼狀態變成了2個(或1個)子遊戲。而我們知道,在符合條件時,異或可以對子遊戲進行加和操作。所以,這個大遊戲的後繼狀態的sg值,就是這個後繼遊戲狀態中新產生的石子堆sg值的異或和,然後我們對後繼狀態的sg值再取異或和,就得到了這個大遊戲狀態的sg函數值。

我們再看一個更加復雜一點的遊戲:Every-SG遊戲。這種遊戲除了是輸贏的博弈之外,還是時間的博弈。我們看一道小例題:

有n個同時進行的遊戲,每次都必須在還未結束的遊戲中進行一步操作,不能在任何遊戲裏操作的人輸。很明顯,這個遊戲的勝利在於不斷在必勝的遊戲中續命拖長時間,在必敗的遊戲裏速戰速決。那麽我們可以在遞歸搜索時額外加入如下的語句,維護從這個遊戲狀態開始,最長的持續時間:

技術分享對於必勝狀態的步數要最大化,必敗狀態的步數要最小化,雙方都是如此。

顯然,先手必勝局面的步數一定是奇數,所以所有遊戲中,最長步數若是奇數,先手必勝,否則先手必敗。

今天我們介紹了4種博弈論的經典模型,並且還引入了SJ定理這一新的工具。下一次,我們會結合不同模型的經典例題來繼續了解博弈論這個神奇的知識點。希望我的博文給你帶來了幫助~:)

[您有新的未分配科技點]博弈論進階:似乎不那麽恐懼了…… (SJ定理,簡單的基礎模型)