1. 程式人生 > >關於SG函式的一些淺顯的感性理解

關於SG函式的一些淺顯的感性理解

有向圖博弈。給定一個有向圖,一個起點,起點上有一個棋子,兩個玩家輪流推動棋子,誰不能推了誰就輸了。希望知道某個點為起始是必勝還是必敗。

注:這兩個人都十分聰明,可以看透未來(?)。

一點分析:

1.顯然這要是個DAG,不然遊戲就不能結束了。。(廢話)  而且兩個人要在同一張圖上操作,輪流進行。。(即所謂的公平遊戲)

2.這兩個人都很聰明是什麼意思呢。。就是說對這兩個人而言,這個遊戲相當於是給每個點標上屬性必勝/必敗,然後把整幅圖放在他們面前,為了獲勝,他們只要無腦走必勝狀態就可以了。

2.1如果走到某個點,後繼有一個先手必敗,這個點就必勝。發現對手的破綻啦,果斷往那裡衝

2.2如果走到某個點,沒有後繼或者後繼全都是先手必勝,這個點就是必敗。敵軍太強了,我已走投無路

2.3A的必勝就是B的必敗。

3.上面的描述看起來很有道理,然而實際並沒有什麼用。我們希望把必勝必敗轉到函式裡面,這樣就可以套到各種情況裡了。

來看一看這個函式的要求。

3.1設函式值的全集為U,先手必勝狀態的函式值集合為S1,先手必敗狀態的函式值集合為S2,則S1|S2=U,S1&S2={};

3.2設當前函式值為y。當後繼有至少一個屬於S2時,y屬於S1;否則y屬於S2。

引入mex函式,U為自然數集合,S2={0},完美地滿足了條件。

3.3mex的特殊性質:如果SG(x)=y,則一定存在SG(x的後繼)=0~y-1。

3.1和3.2是解決單個遊戲的關鍵,3.3是組合多個遊戲的關鍵。

看起來問題解決了?當然沒有了。

如果起點和棋子有多個怎麼辦?

1.如果一個起點有多枚棋子,可以拆分成多個起點,又回到了每個起點一枚棋子的情況。

2.每個起點一枚棋子,有多個起點。每個起點的SG都可以算好了,然後異或起來,=0就是必敗,否則必勝。

(異或消掉了相同的部分,而由於3.3,相同的部分也確實是可以通過你走一步我走一步來抵消的)

於是,一個大遊戲可以被拆分成若干簡單的小遊戲。

很經典的NIM遊戲,放到這裡是適用的。

這樣的遊戲看起來十分優美,原因在於遊戲的結局只有必勝和必敗兩種情況,可以說是固定的,通過預知所有轉移就可以計算。

orz看穿未來卻要面對面玩一場註定了結局的遊戲的無聊先知A和B

orz人類的神奇娛樂