摘要
運籌學無所不包括,無所不能!alpha-go所面對的問題根本上是屬於博弈的,當然屬於運籌學。博弈發展到凌駕於AI之上,那么有什么能凌駕於博弈呢,也許是運籌學里的看家技術——線性規划——呢。在作者之前博文中,已經介紹過了如何用+Leapms線性規划做排序,這里介紹如何用+Leapms線性規划做博弈,附代碼。本博文及所有本作者博文里的文字、模型、代碼、結果均為+Leapms原創!
一個簡單的博弈問題
以一個簡單的火柴問題為例:火柴問題出現在Wayne L. Winston著名的教科書Operations Research: Applications and Algorithms[1][2]中的靜態動態規划一章。
首先需要理解博弈問題之所以出現在動態規划里的原因——絕大多數博弈問題其實很容易被轉化為遞歸問題,而所有遞歸問題都可以用動態規划這樣一種帶有禁忌節算核心的枚舉算法所求解。
所謂博弈問題是指論域之中有一個敵對的智能體,其目標與博弈主體的目標沖突,問題的目的是對博弈的主體(以及敵對智能體)給出最佳決策,以使得博弈主體(以及敵對智能體)能夠獲取各自的利益最大化。
回到火柴問題:在桌在上有 n 根火柴,“我”(博弈主體)和“對手”(敵對智能體)依次拿1-3根火柴,不許多拿也不許少拿,誰拿到最后一根誰輸掉此次游戲。
這個火柴問題可以通過觀察知道,如果桌面上有五根火柴,則無論我方如何拿幾根火柴,對手都能在下一次使得我方輸掉,而且任何4k+5 (k為大於等於0的整數)根火柴的情況都會使得當前將要拿火柴的人輸掉。依據這個觀察即可做出一個簡單的遞推程序。但這個不是本博文的目標,本博文的目的是把博弈的核心邏輯用模型的方法“描述性地”“描述”給計算機,讓計算機自己推出結果。
博弈的邏輯其實是遞歸(當有遞歸原點時)。例如火柴問題可以這樣被描述給計算機,當一方拿去1~3根火柴時,就等同於把 n-1 ~ n-3 的情形遞歸地推給了另一方。這個遞歸是有原點的,因為所需考慮的火柴數目是逐步減少的,且最終n=3,2,1的情形非常簡單,可以直接給出結果。
對這樣的問題,可以用(+Leapms)線性規划描述性地建模,並求解。
火柴問題的線型規划建模
設0-1變量 F[i], i=1,...,n 表示當桌面上有i根火柴時候的博弈獲利。F[i]=1時表示獲益為贏,F[i]=0時表示獲益為輸。用一般變量x[i]表示當桌面上有i根火柴時候的最優決策,x[i]的含義由其二進制表達來表示,當它的2進制第1位為1時表示可拿1根或查,第2位為1時表示可拿2根或查,第3位為1時表示可拿3根或火柴,當有多個二進制位為1時表示可選擇一種情況拿火柴(例如1、2位都為1,表示拿1根或2根都會贏),當x[i]=0時表示此時無論拿1-3根中任意情況對方都有方法使我方輸掉。
模型的目標是極大化所有F[i] ( 即:在博弈里叫做敵對智能體是理性智能體,是非常聰明的對手,它總能做出最優決策):
max sum{i=1,...,n} F[i]
定義遞歸原點的約束,顯然:
F[1]=0
F[2]=1
F[3]=1
x[1]=0
x[2]=1
x[3]=2
遞歸邏輯約束——當我方拿1-3根的三種情況都會導致敵手贏得游戲,則我方最優盈利為0。
3-F[i-1]-F[i-2]-F[i-3] >= F[i] | i = 4,...,n //(1)
上面的約束邏輯是:如果我方拿1-3根的三種情況都使得敵方盈利為1,則左側為零,於是右側我方獲利被約束為0。
下面的約束用來保證正確的決策,即如果我方拿k根火柴導致地方獲利為0,則使x[i]的第k二進制位為1,否則為0。
x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3])|i=4,...,n //(2)
完整+Leapms模型及其求解
完整+Leapms模型如下(替換數據區的n=20可獲得更大n值得解,比如n=1000):
max sum{i=1,...,n}F[i] subject to 3-F[i-1]-F[i-2]-F[i-3]>=F[i] | i=4,...,n //(1) x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3]) | i=4,...,n //(2) F[1]=0 F[2]=1 F[3]=1 x[1]=0 x[2]=1 x[3]=2 where n is a number F[i] is a variable of binary | i=1,...,n x[i] is a variable of number | i=1,...,n data n=20
求解過程(使用load, mip兩個命令):
+Leapms>load Current directory is "ROOT". ......... match.leap tictac.leap ......... please input the filename:match ================================================================ 1: max sum{i=1,...,n}F[i] 2: subject to 3: 4: 3-F[i-1]-F[i-2]-F[i-3]>=F[i] | i=4,...,n 5: x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3]) | i=4,...,n 6: 7: F[1]=0 8: F[2]=1 9: F[3]=1 10: 11: x[1]=0 12: x[2]=1 13: x[3]=2 14: 15: where 16: n is a number 17: F[i] is a variable of binary | i=1,...,n 18: x[i] is a variable of number | i=1,...,n 19: 20: data 21: n=20 22: ================================================================ >>end of the file. Parsing model: 1D 2R 3V 4O 5C 6S 7End. .................................. number of variables=40 number of constraints=40 .................................. +Leapms>mip relexed_solution=15; number_of_nodes_branched=0; memindex=(2,2) The Problem is solved to optimal as an MIP. 找到整數規划的最優解.非零變量值和最優目標值如下: ......... F2* =1 F3* =1 F4* =1 F6* =1 F7* =1 F8* =1 F10* =1 F11* =1 F12* =1 F14* =1 F15* =1 F16* =1 F18* =1 F19* =1 F20* =1 x2* =1 x3* =2 x4* =4 x6* =1 x7* =2 x8* =4 x10* =1 x11* =2 x12* =4 x14* =1 x15* =2 x16* =4 x18* =1 x19* =2 x20* =4 ......... Objective*=15 ......... +Leapms>
上面的結果表示,當n=20時,我方一定會贏,最優決策是取2根火柴。
討論
本文給出了火柴博弈問題的線型規划方法,不難看出這種遞歸建模思路可以被推廣到很多棋牌博弈問題以及其他動態規划問題。但是受問題復雜程度不同,模型復雜度會不同。作者稍后考慮給出用+Leapms描述的其他動態規划問題的線性規划模型的例子。
+Leapms-Latex數學概念模型
在+Leapms環境下,使用 “latex"命令可以把上面的+Leapms模型直接轉換為如下Latex格式的數學概念模型。
參考文獻