1. 程式人生 > 其它 >博弈的意思_只用一行程式碼就能搞定,博弈論究竟是什麼神仙演算法?

博弈的意思_只用一行程式碼就能搞定,博弈論究竟是什麼神仙演算法?

技術標籤:博弈的意思

來自公眾號:TechFlow
1aee4703d1d5c0ccbc4b1ac3a486c71c.png

博弈論是一門很龐大的學科,它算是數學的一個分支,也和運籌學甚至是經濟學有關。雖然它嚴格說起來並不是演算法領域的內容,但是有不少關於博弈論有趣的演算法和問題。關於博弈的相關理論從很早就已經有了雛形,但是正式構建理論成為一門學科是從計算機之父馮諾依曼開始的。從這點上來說也和計算機有點關係。

今天我們來聊聊博弈論當中最簡單的巴什博奕(Bash Game)。

報數問題

說到巴什博奕就不能不提報數問題,它實在是太經典了,以至於我覺得你很有可能也聽說過。題目是這樣的,說是A和B兩個人一起玩一個報數遊戲,兩個人輪流報數,每次最少報一個數,最多報5個數,第一個報到100的人獲勝。如果你是先手的A,你有必勝策略嗎?

如果之前沒有思考過這個問題或者是瞭解過博弈論的話,估計你可能會覺得這個問題很複雜,也很困難,應該沒有什麼好的辦法。因為兩個人每次都可以做好幾種選擇,每一種選擇又會帶來不同的選擇,這樣依次交錯會帶來大量的可能性。在這種情況下,似乎很難想出一個演算法來解決問題。

報到100看不出來,我們縮小一下,如果報到6的人獲勝呢?是不是就很明顯了,先手的A不論採取什麼策略都一定輸。因為它不論報幾個數,B都可以直接報到6。

既然報6個數的時候A一定必輸,那麼可以推導得到報的數如果是6的倍數A都一定必輸。假設它在某一輪當中報了i,對方只要報6-i就行了。這樣重複若干次之後最後一定會剩下6,那麼就回到了上面說的最簡單的情況。

假設我們開發出了一個state函式可以計算某個狀態先手是必勝還是必敗,我們用1表示先手必勝,0表示必敗。那麼顯然state(0) = 0,state(6) = 0。由於不論先手在每一輪當中報幾,後手都可以控制報一個和它加起來等於6的數,所以可以得到state(n) = state(n-6)。於是,我們可以推匯出state(6n) = 0。

由於先手每次可以報1-5個數,當他面臨一個6n+k的局面的時候,只要k不等於0。那麼他就報k個數,就可以讓局面轉化成6n的必敗局面給B。所以可以知道,除了6n的局面之外的所有局面都是先手必勝的

我們用程式碼實現的話就只有一行:

defwin_or_lose(n):
returnn%0!=0

博弈論的精髓在於對問題的分析,體現在程式碼上就是思維比較複雜,但是程式碼極為精簡。

報數這個問題比較直觀,所以找找規律仔細想想也是可以猜出答案來的。但如果我們包裝一下,可能就不一樣了。

打牌問題

這題源自HDU1847,題面是兩個人打牌,一共有n張牌,雙方輪流抓牌。規定每人每次抓牌的數量必須是2的冪,最後抓完牌的人獲勝。假設兩人都是極端聰明,請問最後會是誰獲勝。

假設兩個人極端聰明,這是博弈論問題的前提,也就是說兩個人都會採取最優策略。沒有這個前提,就無法使用博弈論進行分析了,因為它就不再是單純的數學問題了。

和上面的題目相比,這題變得複雜了。因為每個人採取的策略數量變了,之前是嚴格限制了只有5種可能,現在則變成了無數種。但其實這裡使用了障眼法,藏了一個trick。

我們首先把2的冪都列出來,從2的0次方開始,分別是1, 2, 4, 8...。看到這個1和2不知道大家有沒有什麼想法,其實如果你稍微瞭解一點數論的話就會知道,2的冪一定不能被3整除。也就是說2的冪模3的結果只會有兩種,也就是1或者是2。所以這道題其實和上面一題是一樣的, 我們拿2的幾次冪不重要,重要的是拿的數模3之後餘下的幾。

state(0) = 0,因為對方已經拿完了。那麼state(1) = state(2) = 1,只剩一張或者兩張牌的時候可以一次全拿完。state(3) = 0,因為無法一次拿完。我們推廣可以得到state(3n) = 0。也就是3的倍數對於先手是必敗的。由於我們剛才說了,2的冪模3一定是1或者是2。所以可以得到,對於先手來說,只要面臨的狀態不是3的倍數,就一定必勝。因為他一定可以找到一個2的冪,使得拿完之後留下3的倍數給對方。

分析完了之後,程式碼又只有一行:

defwin_or_lose(n):
returnn%3!=0

總結

巴什博奕的問題很簡單,一旦摸清楚了套路之後,這一系列類似的問題都手到擒來。但是要注意的是,面臨巴什博奕的問題,我們不能只是簡單地理解成是湊成一個數,或者是找到一個必勝或者必敗的策略。而是要從狀態的角度去分析它,究竟什麼樣的狀態是必勝或者是必敗的,狀態之間又存在什麼樣的轉移關係。

從這點上來看似乎又有點動態規劃的意思,但不一樣的是動態規劃演算法解決的都是邊界有限的問題。而博弈論當中有的時候策略或者是狀態可能是無限的,但是兩者的確有相通的部分。巴什博奕只是博弈論演算法當中最簡單的演算法,後面我們還會繼續研究其他更復雜一些的博弈論問題。


●編號365,輸入編號直達本文

●輸入m獲取文章目錄

程式設計師數學之美

fcdba99176aafb82131a707e8d22bc95.png

程式設計師數學學習

鍛鍊數學邏輯思維