人工智慧在圍棋程式中的應用
複旦大學附屬中學 施 遙
【關鍵字】
圍棋,搜尋,模式比對,博弈樹
【摘要】
圍棋程式的編製被稱作人工智慧的“試金石”,是人工智慧技術的一大難題。
本文介紹了人工智慧在圍棋程式中的應用與發展,對比了圍棋與國際象棋博弈演算法的差別和複雜度,從而分析圍棋演算法的痛點,討論各種博弈演算法(氣位理論、模式比對與博弈樹)在圍棋程式中的融合運用。並給出了圍棋死活程式的演算法執行個體(附程式),以供參考
【本文】
『目錄』
一、概述
二、圍棋的複雜性
三、博弈(棋類)演算法及其在象棋與圍棋中的對比
四、圍棋演算法
五、圍棋棋形識別
六、圍棋死活的演算法與實現
七、展望
一、概述
1、圍棋簡介
圍棋相傳為堯所創,縱橫一十九道,天元是為太極,太極生兩儀,為黑白子;兩儀生四象,為四個角。《弈旨》([漢]班固)云:“棋有白黑,陰陽分也,駢羅列布,效天文也。”可知圍棋本是仿效天文而制,逐漸演變為博弈遊戲。
2、電腦與圍棋
電腦運用於棋類方面幾乎與電腦的誕生的曆史一樣長。這方面內容主要屬於人工智慧技術。人工智慧作為一門科學首先是在五十年代提出的,隨即便運用於棋類。
由於技術的進步,電腦速度的提高、演算法的不斷髮展,目前電腦國際象棋的水平已極高,然而圍棋水平卻徘徊不前。
就圍棋而言,人弈棋憑的是經驗,即“棋感”。人類的優勢是模糊判斷、靈敏的直覺,高手往往會有靈機一動而弈出妙手。當然事物有其兩面性,即人的情感、直覺 有時也會誤導自己形成錯誤,而棋手的心態也是至關重要的一環,“成也蕭何,敗也蕭何”,直覺既是人類的法寶,亦是敗因(當然是指敗給人了)。
電腦的優勢是計算速度快,劣勢是不擅模糊判斷、不能根據經驗選點導致搜尋量過大。電腦不為情緒所困,不為直覺所惑,故地區廣狹、大小之分能較為準確, 其耗時亦少,然而電腦畢竟沒有棋感,不知道哪步好、哪步不好,只有一點點地去試,要麼費時甚巨(也未必有用),要麼草草了事,結果也可想而知。
二、圍棋的複雜性
圍棋全域與其死活問題其複雜性都大致可歸納為如下三點:
1、模糊性
“圍棋”之名自是取自圍地之意,倘若是雙方落子一開始便是緊緊相貼的,那麼可想而之行棋的速度(即佔領地盤的速度)是極慢的,故而布局、中盤以至大官子階 段,雙方只是圍出一個大概的輪廓,甚而連輪廓都不明顯。黑白勢力難分,形狀犬牙差互。這對於電腦處理形成了極大的困難。
2、反覆性
象棋中棋子一旦被吃,則永遠從棋盤上提去,而在圍棋棋盤上,被吃的地方仍可重新落子,甚而將對方反吃回來,如此一來,搜尋的難度便大大增加。如“倒脫靴” 之形,送子後再吃子,一塊空可以幾易其主。所以“死子”不死,“活子”有時倒是堪虞。所以在電腦處理中不可以簡單確定一塊棋子的死活和對周圍的影響。
3、靈活性
象棋的靈活,至多體現在兌子上,所謂“寧棄一子,不失一先”,也僅是一子而已,若是兩子、三子呢?恐怕在雙方實力相當的情況下必敗無疑。而且在象棋演算法中 多有將各種棋子摺合為一定的價值相加的做法,如,在國際象棋中以一個兵為單位,一個馬約可等於三個半兵,一個車約可等於五個半兵,等等,最多再根據棋子所 處位置加以一定的折算。
而圍棋的靈活遠勝於此,有時棄去十來個子以取勢,棄去二、三十目的角地以轉換。再者,圍棋棋子的價值是難以估量的,其價值不完全在其本身,而常於在周圍的配置,有些影響甚而可斜跨整個棋盤。
三、博弈(棋類)演算法及其在象棋與圍棋中的對比
一九九七年,IBM的電腦“深藍”一舉戰勝卡斯帕羅夫,震驚世界。其實電腦國際象棋的水平早在七、八十年代已擠身世界高手之林,而中國象棋軟體也已幾乎具 有大師水準,非一般愛好者能望其項背。唯獨圍棋舉步維艱,連業餘下手都勝券難握,更莫論一等一的高手,究其原因不外是圍棋之博大精深、縱橫變換繁複,棋手 多靠經驗而電腦則無此功能。
目前,棋類博弈演算法主要有兩大類:模式比對和使用博弈樹。這在國際象棋中的運用可以追溯到五、六十年代,且而十分成功。
圍棋和象棋一樣是博弈遊戲,看似僅有黑白兩種棋子,簡單不過。實則比起兵種繁多的象棋卻複雜得多。
電腦圍棋起源於六十年代。兩位博士Zobrist和Ryder在論文中均涉及了圍棋程式,前者的演算法基於模式識別;而後者的演算法基於搜尋,即使用博弈樹。這兩種在國際象棋中效果不錯的演算法在圍棋中的表現卻極差,竟然連僅有幾盤棋經驗的人都贏不了。
我們不妨來考慮一下上述兩種演算法。
首先,我們來看模式比對。象棋中因為棋子個數少、種類多,那麼就較易分別與歸納(實際上也是困難的,但比圍棋容易實現得多)。而在圍棋中,顯然將所有的模 式都儲存起來是不可能的。那麼只有模糊比對。但這似乎也很難辦。圍棋中有“愚形”這個名詞,一般指的是效率差的形狀。那麼怎樣是效率差呢?就是浪費子力, 在不必要的地方落子,哪怕只是一個子。而模糊的匹配在一子之差時究竟如何判斷?是好形還是愚形?這就陷入了矛盾的境地。況且,根據實際情況,還有“愚形之 妙手”(出自日本古局),實難判斷。
其次是搜尋的演算法。搜尋的代價是極大的,據估計,國際象棋搜尋7個回合約有500億至600億種選擇(當然是在博弈樹剪枝後),這個數字儘管也十分龐大, 但以目前的技術水平還是可以承受的;然而在圍棋中,我們稍微計算一下便知道:假設每步大約有只有一百個可行點(已經非常少了),那麼14步(即7個回合) 以內的變化則約有1028種,當然這隻是保守的估計,已足以駭人了。可見在全域使用搜尋演算法是不可行的。因此當前的做法一般是在局部明確目標(如做活、殺棋、突圍、切斷等)的情況下,才使用博弈樹進行搜尋。
四、圍棋演算法
目前,世界上流行的圍棋軟體主要是由以下三種演算法組成的:
1、使每個棋子周圍產生某種影響,這種影響隨著距離的增加而減少,用一定的公式計算疊加這種影響,以判斷形勢和估計著點的價值。這與圍棋的棋理相通,即對於每個棋子可估算其“勢力”。此中就有著名的“氣位”理論。
2、建立模式庫,貯存了大量模式(定式、棋形等),以供匹配。這其實涉及到圍棋的許多棋諺與棋理。如“二子頭必扳”、“鎮以飛應”、“斷從一邊長”、三子正中、點方等等。這些都是根據圍棋的具體情況而設計的。
3、對目標明確的局部,用人工智慧中的搜尋法探求其結果。
一般來說,現在還沒有找到突破性的演算法,只有在以上三種演算法中細細加工。
五、圍棋棋形識別
圍棋中棋力的高下大凡憑一個棋手的感覺與經驗,而這感覺正是棋手水平的主要體現。而對棋的感覺其實就是人對於棋本身(即棋形)的主觀認識。這是一個識別過程。
識別能力的高低是智能的一大特徵。識別能力由低到高分為三個層次,儀器水平:物理識別;動物水平:模糊識別;人類水平:情感識別。
物理識別是對接受到的資訊實現物理、化學和生物學的量化認識。這不需要經驗與智能,所以是最低層次的識別。
模糊識別是在大量複雜的資訊中識別出有用的部分,即對接收的資訊與以往的記憶和經驗進行關聯認識,剔除無關的資訊。
情感識別是最進階的識別。它是完全的感性識別。
可以說圍棋中既有模糊識別,亦有情感識別。即對於一個新棋形,將之與經驗中的棋形比較,綜合周邊情況,作出判斷。其決策帶有明顯的個人情感傾向,這與每個人的理解有關,很多是沒有定論的,因此即便九段高手之間的棋也是截然不同的,很難說孰優孰劣。
而在電腦中,對於棋形卻難以模糊判斷,因為這既不是聲音,也不是圖象,一子之差,優劣迥異。
一般來說,目前電腦對於圍棋棋形只能作簡單的識別,用以減少搜尋,其實這也就是賦予了電腦一定的“經驗”。
六、圍棋死活的演算法與實現
死活是圍棋中的一個典型問題,可以說也是圍棋演算法的一個縮影。它需要融合上述的三種演算法。目前,死活軟體已達到較高的水平,但主要因為這隻是一個局部問題,與全域千絲萬縷的關係卻是極難把握。
註:
n 為了敘述簡便起見,下文中黑方總為攻擊方,白方總為欲做活的一方,在本節中僅以白方為例來設計演算法。
n 本節中的各演算法均已簡化,目的只是說明方法。
n 由於時間關係和水平所限,本節演算法不免有所疏漏,望不吝指正。
對於圍棋死活問題,首先我們不妨看看人下棋的思路:
先看有多少眼位,是否已活?如不活,計算缺多少眼位,能否補上?在做眼(或破眼)的過程中,人總是先以第一感為線索來計算,那麼人的第一感是從何而來呢? 其實就是長期對棋型認識的經驗,經驗豐富者強、經驗欠缺者弱。因為在死活中有許多常見的棋型,前人也曾總結過一些棋諺,如“殺棋用扳”、“二一多妙手” 等,還有如夾、點、跨等手段經常構成殺棋;而有些著點卻無需考慮。因為死活是一個局部目標明確的問題,故而以搜尋為主。因此一個圍棋死活軟體的優劣關鍵在 於對於搜尋的最佳化、剪枝上。
我對於圍棋死活問題的演算法有兩大部分組成:
n 靜態眼位判斷
n 搜尋
程式的主線是搜尋,然而靜態眼位判斷穿插於其間。
1、靜態眼位判斷
①勢力劃分
前面提到了,圍棋黑白雙方的界限是模糊的,很難精確劃分,而不能精確劃分的話,則在電腦中難以處理。為此,採用氣位理論的的方法來近似計算“勢力”。
勢力劃分貫穿於整個靜態眼位判斷,作用很大。
一個棋子對於周圍有一定的影響,稱之為“勢力”,一個子的周圍稱為氣位。氣位如下劃分:
1、相鄰位為1級氣位;
2、尖位為1.5級氣位,扳位為2級氣位(即右圖中“1.5”處若是扳位,則須改為“2”);
3、關位為2級氣位;
4、小飛位為2.5級氣位。
各層級氣位所受影響如下表:
氣位層級 |
1級 |
1.5級 |
2級 |
2.5級 |
影響的絕對值 |
6 |
5 |
3 |
2 |
黑棋的影響為正值,白棋為負值。
當然,以上的各位置與原來位置之間不可有棋子隔斷,否則(無論黑白)勢力即為其所阻隔。
另外要補充的是,每一點所受某種顏色棋子的影響只受離其最近(影響最大)的該色棋子的影響。
如此一來,半敞開的地區便可為勢力所封閉,一此處於重重包圍的棋子由於周圍對方勢力太盛,自己的勢力值反而為對方所顛倒,自然成為死子(但不是絕對的,如“倒脫靴”便是死棋再生的例子)。
本文講的只是一個基本方法,在真正操作時可以根據不同情況有一定的變化,對於優秀的圍棋軟體來說,影響力也未必是線性疊加的。
②白方(做活方)眼位的確定
首先,我們知道每塊棋子至少要兩個真眼才能做活。真眼與假眼的區別如右圖:
在角上A點為己方佔領為真眼,反之為假眼;在邊上AB兩點要俱為己方佔領方為真眼;在中央ABCD中己方須至少佔領三點才能成其為真眼,反之為假眼,當然倘是己方已佔領了其中兩點,而另兩點無子,亦是真眼,因為這兩點見合(即兩點必得其一)。
現在我們來考慮何為“佔領”?“佔領”的含意對於黑白雙方是不同的。
對於白方:佔領未必在該點要有白子,只需在該點的白方勢力極強即可,因為如此黑方即使在此落子也必為白方所吃,最終仍為白方佔據。
對於黑方:佔領即在該點是黑子,沒有黑子的地方即使勢力再強,一旦白方落子於該處,黑方也無可奈何。
第二我們要明確,眼位未必非真即假,非假即真。如:
圖中白方在A位先行補一手可成真眼,反之黑方先行即成假眼。我們不妨稱之為半隻眼。
⑴一目眼位的判斷
一目眼位判斷較為簡單,只需如上所述計算即可,分三種類型:真眼、假眼(可不計)、白方先手真眼。
⑵二目以上(包括二目)五目以下(包括五目)空的判斷
二目以上的眼位由於形狀複雜難以簡單判斷。儘管形狀複雜,然而形狀數量有限(大約基本型十幾種,經旋轉、翻轉後為三、四十種),可以做成棋型庫進行匹配,
有五種類型:白方先行一個真眼、總為一個真眼、白方先行兩個(兩個以上)真眼、總為兩個(兩個以上)真眼及無真眼(可不計)。
⑶五目以上(不包括五目,下同)空的判斷
五目以上的空,形狀極多,不可勝舉,故很難將之做成模式庫。
但值得注意的是,五目以上的空(形狀完整)幾乎都可以成為兩個真眼。因此在判斷的時候,我們暫先不妨將之判為兩個(兩個以上)真眼。
③死活的判斷
有了以上眼位的確定,我們便可以切入關鍵了。靜態眼位判斷的主要目的是判斷死活的類型,即白先活,白先死與白後活。
⑴白先活,即白棋先行可以做活,後行則死。此種狀態的條件是以下之一:
n 一個真眼與半隻眼;
n 三個半隻眼。
⑵白先死,即白方即使先行也死。條件是以下之一:
n 一個或無真眼,無半隻眼;
n 兩個或兩個以下的半隻眼,無真眼。
⑶白後活,即白方即使後行也是活棋。條件是以下之一:
n 兩個或兩個以上真眼;
n 一個真眼與兩個或兩個以上半隻眼;
n 四個或四個以上半隻眼。
簡單地說,以一個真眼摺合兩個半隻眼。若少於三個半隻眼,為白先死;等於三個半隻眼為白先活;大於三個半隻眼為白後活。
2、搜尋(博弈樹)
搜尋演算法是主線,但不如靜態眼位判斷來得複雜。
博弈樹的奇數層為白方(電腦),偶數層為黑方。如:
對於每個結點,以在此狀態下白活的可能性作為估價函數。
對於奇數層白棋的選點,我們可以作如下限制:
1、不走在黑棋包圍圈的外側;
2、此子不能被黑棋一手提掉,且同被吃掉的一塊棋子個數小於四個(因為四個或四個以上棋子被提,可能是“倒脫靴”的妙手)。
對於偶數層黑棋的選點,則限制在黑棋包圍圈及其內部。
在枚舉了白棋選點後,產生某一狀態,此狀態倘若是“白後活”,立即返回此狀態白活(白活可能性為1);否則,尋找此狀態下是否有黑棋下某一手後,白呈“白先死”,則此結點不用繼續擴充,返回此狀態白死(白活可能性為0)。
若不在上述兩種狀況之列,則擴充下一層(黑棋),根據下一層的狀態中白活可能性的大小來給此結點估價。
在枚舉子黑棋的選點後,對於每一黑棋選點,可產生一種狀態。此狀態下,若是“白先活”,則立該返回白活(白活可能性為1);否則,尋找此狀態下是否有白棋
下某一手後,白呈“白後活”,則此結點不用繼續擴充,返回此狀態白活(白活可能性為1)。如非上述兩種狀況,則繼續擴充結點,根據下一層的狀態中白死可能 性的大小來給此結點估價。
最後程式根據白活的可能性,選擇該值最大的落點落子。當然在博弈樹中應當使用α-β剪枝,在白棋層中將白活可能性小的結點剔除,不予擴充;在黑棋層中,將白棋活可能性大的結點剔除,不予擴充。
關於博弈樹的一些具體問題可以參照有關資料。
七、展望
除了上述的方法外,在人工智慧領域還存在著這樣一些可行方案:
l 人工神經網路
由於近年來人工神經網路的發展,也為圍棋程式找到了又一條道路,即增加人工神經網路的部分,使軟體其具有一定的學習、記憶和聯想功能,將之與高手對弈,以
吸收一定的“知識”,培養棋感。美國Footland的MFGO就做了一些這方面的有益嘗試,但目前可能還不完善。“多面圍棋”的設計者、美國惠普電腦公 司的工程師大衛·佛特蘭德所說:“強力檢索對圍棋全無作用,你得創造出一個像人一樣精明的程式來。”。誠然,圍棋是如此之複雜,僅靠機械地教電腦如何下棋 是遠遠不夠的,所以應該使用人工神經網路令電腦“聰明”起來,讓它主動學習。但這方面的技術還並沒有達到很高的程度,故而目前也僅是一種設想。
l 專家系統
專家系統已廣泛地運用到了各個方面,其實在圍棋中,也可建立專家系統。可以設立棋形知識庫,根據棋諺與人們總結出來的其它經驗,將其賦予電腦。這是一個比較系統的方案。
l 產生式系統
對於定式與某些常見變化,可以建立產生式系統,讓電腦自己產生變化。其中關鍵是選擇良好的控制方法,以判斷優劣。這是對於局部問題預先處理的一種方案。
棋無止境,在電腦圍棋的漫漫征途上猶是如此。
當前,圍棋軟體已是人工智慧技術的尖端之一,被稱之為人工智慧的“試金石”,倘是要更進一步,無非是軟體與硬體的雙重最佳化。演算法的最佳化已愈來愈趨於細節
化,根本性的突破口依然沒有找到;硬體速度的提升雖然越來越快,但也遠遠不能滿足其要求。“手談”是目前世界上最強的圍棋軟體之一,但據其作者陳志行教授 稱,它只有9級的棋力。陳教授說,圍棋軟體發展的“瓶頸”關鍵是“圍棋太複雜”。
儘管在圍棋死活問題上,電腦已達到了一定的水平,然而圍棋本身是一門得與失不斷轉換與平衡的大學問。失之東隅,得之桑榆,得與失之間微妙的關係是目前計
算機所難以掌握的。在應氏杯電腦圍棋賽上,記者問參賽者們電腦還要過多少時間才能贏人類高手?回答是一百年後。這個回答無論是保守還是誇張,總之電腦圍 棋的路還很長,當某一天真的圓了應昌期先生電腦勝過人類九段的夢想之時,那才是電腦真正實現了智能化的標誌。
【參考資料】
1、《青少年國際資訊學(電腦)奧林匹克競賽指導——人工智慧搜尋與程式設計》 劉福生 王建德
2、《人工智慧引論》 [美]E.麗奇
3、http://www.wulu.com 陳志行
4、http://www.wqb.com.cn 《圍棋報》電子版
5、http://www.usgo.org/computer
美國圍棋協會(American Go Association)