在本章和下幾章中,我們要探討一下難度較大的棋類遊戲程式,比如國際象棋和西洋跳棋等等。用這些程式來同人或其他程式對弈。然而,有些程式是把電腦精心設計成一個棋盤,人們可以在其上對弈(或者是一種單人玩的棋盤遊戲)。這種程式更接近於系統類比的領域,而不屬於人工智慧的範疇。我們此處所要介紹的卻是讓電腦能夠“思考”如何下棋。
假定有兩個人或者兩台機器在下棋。我們把其中一名稱為棋手,另一名稱為對手。而我們始終從棋手的角度來觀看這場競賽。這樣一來,如果棋手贏了、對手輸了,我們就說這盤棋贏了;如果棋手輸了、對手贏了,我們就說這盤棋輸了。
假設現在該輪到棋手走了。在大多數情況下,棋手對這步棋可以有若干種選擇。對於棋手的每一種選擇,對手也有若干可供選擇的相應棋步。對於棋手的每一步棋以及對手的每一步回棋,棋手又有自己進一步的選擇。顯然,這裡所遇到的分支情況同我們在狀態搜尋中遇到的情形相同的。
實際上,我們可以把一盤棋想象成具有一個入口(起始位置)和一組出口的迷宮。有些出口標上了贏的記號;有些出口標上了輸的記號;而有些出口標上了和局的記號。在入口處,棋手選擇某條路徑起步,在路徑的一個岔口,對手挑選了自己的路徑回步,棋手和對手就這樣輪流選擇自己的路徑走下去。棋手總是力爭通向勝利的出口,而對手卻總是把棋路引向輸的出口。有時雙方各自的努力不相上下,最後在和局出口結束棋局。或者他們一直在這個迷宮中徘徊,直到形勢變得非常明朗:雙方迴圈兜圈子,這時只好雙方握手言和。
因此,下棋遊戲同狀態圖搜尋是相似的,就是要在狀態圖中找出一條從初始狀態到目的狀態的路徑。但是,它們之間卻有一個很大的差別。在狀態圖搜尋中,總是由一名選手來選擇下一步往哪走。而在棋類的對弈中,棋手只有一半選擇的權利,另一半由對手作出決定。棋手是一直朝著目標努力,而對手卻是通過它每一步棋對此設定障礙。尋找機會把棋手從通往目標的路徑上引開。
對於任何一種博弈競賽,我們可以構成一個博弈樹。它類似於狀態圖和問題求解搜尋中使用的搜尋樹。博弈樹的結點對應於某一個棋局,其分支表示走一步棋;根部對應於開始位置,其葉表示對弈到此結束。在分葉節點對應的棋局中,競賽的結果可以是贏、輸或者和局。
所謂棋局,就是所有那些必須記錄下來的資訊。根據這些資訊,比賽在按計劃暫停以後能夠得以繼續進行下去。顯然,這些資訊包括了此時棋子在棋盤上的位置以及指出下一步是輪到棋手走,還是對手走。
博弈樹是一棵與/或樹,不同於在狀態搜尋中使用的純粹的或樹。
其原因是:當輪到棋手走時,他可以決定選擇哪一步棋走。如果起碼有一步可以擔保棋手能夠到達贏的棋局,那麼棋手就會選擇這一步並保證能夠取勝。因此對應於棋手走的節點是一個或節點。
當輪到對手走時,選擇是由對手決定的。棋手沒有任何選擇的權利。只有對手的所有可以走的棋布都會導致棋手贏時,這時棋手才能保證會贏。因此,對於對手走的結點是一個與節點。
對於一場經過深思熟慮地棋局來說,其博弈樹是非常龐大的(國際象棋來說有10^120個節點)。以至於不可能把這樣大的博弈樹裝入電腦,也不可能在任何合理的、有限的時間內進行詳細的搜尋。儘管如此,首先深入的考察一下完整的博弈樹,然後再看看如何來修正我們的原來的想法,以便把搜尋樹修整到一個合理的範圍。這樣做還是很有意義的。
博弈策略
假設我們對所討論的博弈問題構造了一棵完整的博弈樹,我們希望能從中找出棋手應採用的策略。這種策略應當確保棋手會贏,或者起碼能夠得到和局的結果。
首先我們把該博弈樹的每一個節點標上w(對應於贏)、d(對應於和局)或者l(對應於輸)。如果當前的棋局對應於標有w的節點,那麼就存在一種策略可以擔保棋手會贏;如果結點標的是d,那麼除非對手失誤,否則棋手最好的前景就是爭取和局;如果節標的是l,那麼棋手只好認輸了,除非對手下錯了棋。
對一個節點標以w、d和l的過程,可以如下進行。
我們的討論從分葉節點開始,每一個葉結點對應於一場棋賽的結束的終局。根據博弈的規則,分葉節點確定了棋手的贏,輸和和局。這樣,我們就把每一個分葉節點標上相應的值。
現在我們按照從葉往根本方向進行研究。按照每一節點的子節點的標號來標記該節點本身。節點標註的規則如下: 輪到棋手走步時,如果該節點的子節點至少有一個標有w,那麼,該節點就標為w;如果所有子節點都標為l,那麼該節點標為l。其他情況標上d。 輪到對手走步時,如果該節點的子節點都標上了w,那麼該節點標為w;如果有一個以上的子節點標上了l,那麼該節點標為l。其他情況標上d。
根節點的標註表明,在對手不失誤的情況下,棋手能夠得到的最好結果。如果根節點為w,那麼棋手穩操勝券;如果為l,那麼對手一定能擊敗棋手;如果為d,那麼在對手不失誤的條件下,棋手能夠得到的最好結果就是平局。
一場比賽,如其根節點能夠標上w或l,並且是很簡單易於分析的話,就可以成為騙人的棋局。該節點標作w的話,無論是誰先走,先走者都能贏;根節點為l的話,無論誰後走,則後者也一定能贏。當然需要採取正確的策略。騙子知道哪一方面能夠贏,以及要贏所需要採用的策略。而這些,受騙者肯定是不知道的。
棋手的策略應該遵循這樣的原則:如果有一步棋能走到節點為W的棋局,那麼就應當走這步棋;如果所有的棋步都通向節點為l的棋局,那麼就只好放棄這盤棋認輸。其他情況下,就要走到標為d的節點。
對手採取的策略正好相反:如果有一步棋能走到節點標為l的棋局,那麼就下這步棋,如果所有的棋步都通向節點為w的棋局,那就只有放棄認輸。其他情況下,就要走到標為d的節點。 當有兩條以上的路徑都能通往l節點,或者有兩條以上的路徑通往d節點時,棋手所採取的策略就不再是決定性的了。在實際對弈中,棋手總是想選擇w節點,達到了w節點,就使得往後的對弈過程變得簡單了。這樣做就能減少棋手失誤以致失去優勢的機會。基於同樣的理由,棋手在達不到節點時,應該選擇d節點。這樣就可以導致最複雜的情況產生。希望對手在這種情況下失誤以便使自己重新得到優勢。到現在為止,我們的討論還是很不充分的。因為在所有的w節點或者所有的l節點之間,我們並沒有給出任何差別。