益智遊戲「L棋(LGAME)」之電腦解法及分析國立臺灣師範大學.doc
《益智遊戲「L棋(LGAME)」之電腦解法及分析國立臺灣師範大學.doc》由会员分享,可在线阅读,更多相关《益智遊戲「L棋(LGAME)」之電腦解法及分析國立臺灣師範大學.doc(13页珍藏版)》请在三一办公上搜索。
1、益智遊戲棋(L-Game)之電腦解法及分析蔡明原、林順喜國立臺灣師範大學資訊教育系摘要由英國劍橋大學Edward De Bono教授所發明的L-Game,是一個兩人對奕的有趣遊戲,本文嘗試利用電腦來分析這個遊戲是否存在必贏的策略?先下手的一方是否有占便宜?是否存在纏鬥最久的盤面?經過我們的分析,發現此遊戲雙方總共有36736種盤面(每一方18368種),其中有240種輸的盤面,而且先後下棋的雙方擁有一樣多對應盤面,沒有任何一方占便宜,而且並不存在必贏的方法,下棋的雙方如果都沒有下錯,依一定的下棋策略,這個遊戲就不斷進行下去,也就是不斷地纏鬥下去。最後我們將研究的成果設計成CGI程式,放在網頁上
2、供大家與我們的程式下棋。一、 緒論1. 棋(L-Game)介紹:我們偶然在網際網路上尋找一些有趣的的遊戲網站時,發現了一個GamePuzzle的網站, De Bono (黎波諾) 教授所設計的遊戲。這個遊戲的玩法如下:(圖一)(圖二)說明:(圖一)為44棋盤,上置兩個L形棋子及兩顆圓形棋子,其玩法為一人一個L形棋子,決定先後手後,一方拿起他自己的L形棋子,可任意翻轉後放回棋盤,但不可放回原位,然後可以移動一顆圓形棋子或者不移,如此輪流移動,直到有一方拿起他自己的L形棋子後無處可放則為負方。舉例來說,(圖二)持黑色的一方沒法再動了,就輸了這場棋賽。查詢相關資料,發現民國74年11月27日的報紙上
3、有一則有關L棋的報導:三個師大附中的學生寫了一個以人工智慧方法設計的程式來玩L棋,程式從與人的對戰中學習,不重複錯誤的下棋盤面,並建立一個資料庫儲存盤面,而在下棋時,選擇過去下棋經驗中離失敗最遠的盤面來下,這樣訓練的結果,他們的程式越來越會下L棋,而且總有一天這個有關L棋的資料庫會學習到所有的盤面與相對應的下棋方法,在當時他們能以高中生的身份踏入人工智慧的研究,實在不容易,可惜他們並未證明L棋是否存在必贏的下棋方法?先下L棋的一方是否擁有較多的勝算?所以我們希望能以不同的方式來研究L棋。後來我們在圖書館找到了水牛出版社於民國七十七年所出版的水平思考五日訓練法一書,這是黎波諾教授出版的書,敘述面
4、對一些問題時,我們應該如何以水平思考的方式去分析問題,其中第三個單元就是以L棋為例來分析互相競爭下最容易發生的問題及如何思考下棋的策略。黎波諾教授指出,與其他需要集中精神去移動許多棋子的遊戲比起來,L棋是一個構造簡單卻需要仔細思考的遊戲,L棋有五個特點:(1) 每個人只有一顆子(L形棋子)(2) 棋盤不大(16格)(3) 規則簡單容易記(4) 下棋需要仔細的思考(因為棋子的移動方法很多)(5) L-Game不像井字遊戲,受到盤面的限制,當雙方把所有的格子填滿,遊戲就結束,而L-Game的棋子不會增減,必定要有一方的L形棋子不能移動,才會結束。(6) 勝負無限制,先下手或後下手無關勝負。雖然黎波
5、諾教授對於他所設計的遊戲給予很高的評價,但是從文獻中我們並沒有發現黎波諾教授如何證明這個遊戲真的就如他的分析,沒有好的方法致勝?也沒有說明為何當初要要設計那樣的啟始盤面,而且文中有一段黎波諾教授指出:下棋的一方有50種以上下棋的方法,對方也有50種以上對應的方法,要一一檢討優劣是困難的,如果要預先考慮個兩三手,既使是巨大的電子計算機也不可能做到。真的是如此嗎?所以我們希望以程式來證明我們能以電腦來分析此棋戲,而且能找出最佳的下棋方法。2. 人腦玩此遊戲和電腦玩有何不同之處?以人腦來玩這樣的對奕遊戲,除了要考慮自己的攻守策略外,還要考慮對方的可能採取的攻守策略,但是人常常會考慮得不夠周延,而且對
6、於重複的盤面不能有效的記錄,所以不能歸納出有效的下棋策略,常常都是從不斷的練習中減少自己犯錯的機會,但是也不能保證自己一定不會再出錯。而這個遊戲中,由於盤面是正方形的,雙方的棋子數目及形狀也具有對稱性,所以一個盤面有八種對稱的相同盤面,對於人腦的記憶是蠻大的負擔。此外,人類在下棋時,常常採取所謂的經驗法則,就像之前師大附中的學生所設計的人工智慧程式一樣,從不斷的下棋經驗中去找自己最佳的下棋策略,但是經驗未必代表就是最佳解,可能只是還沒失敗過而已。如果我們要讓電腦來解這樣的對奕遊戲,和人腦最大的不同,就是電腦能有效地記錄所走過的盤面,並且能從展開Game-tree的過程中尋找最佳的對應盤面,而且
7、能判斷盤面的對稱性,不過這樣的假設前提是要有一個好的方法去記錄盤面及分析盤面,否則只是浪費大量的記憶體及時間。此外,電腦在面對許多可選擇的盤面時,可以用機率的方式計算每一個可以走的盤面有多少勝利的機率,尋找最佳的盤面。另一方面由於電腦可以建構Game-tree窮舉所有的盤面,所以我們也能透過分析Game-tree的勝負分佈來找出好的下棋策略,幫助往後人們在玩這樣的棋類時,有更明確的判斷依據。而這個研究最後的目的,我們希望能讓我們的程式在與人玩L-Game的時候,能立於不敗的情況。二、 電腦解題之演算法面對這個遊戲,如果要讓電腦解題,第一步就是要有效的記錄盤面,我們設計以下的方法 (x1,y1,
8、dir1),(x2,y2,dir2),(n1,n2),who來表示,其中x1、y1、dir1、x2、y2、dir2都是0到3的整數,n1、n2是0到6的整數,who是0或1,所以一個盤面占用19bits來記錄。雖然盤面只有4*4,但是每一個L形的棋子有八個可能的形狀(圖三),但是在盤面的一個位置上不可能八種形狀都能放入,分析的結果發現如果以L形突出的那一點(x,y)為記錄點,可能的擺放方式剛好是上(dir=0)、下(dir=1)、左(dir=2)、右(dir=3)四種可能性。而兩個中立的圓形棋子的記錄方法如果以一個二維的座標(16個可能位置)來記錄,兩顆棋子就可能有8*15種組合,其實當兩個L
9、形的棋子放好時,盤面上只剩8個空位,兩個圓形棋子只可能有4*7種排列方式,所以我們只要記錄這兩個圓形棋子之前各別的空白格子數n1及n2,便可以推算它在盤面中的位置,而且可以節省記錄空間。最後加上一個bit(who)記錄下一步該那一方下手,因此記錄一個盤面只需要19個bit的空間。(圖三)L形棋子8種可能形狀yx01230123(圖四)以上方(圖四)的盤面為例,這樣的盤面記錄為(x1,y1,dir1),(x2,y2,dir2),(n1,n2),who =(2,1,0),(0,1,3),(1,5),0,(2,1,0)是指灰色的L形突出來的那一點在座標(x1,y1) =(2,1),其它三格在它上方,
10、所以記錄為dur1=0,同樣的,黑色的L形突出的那一點在(x2,y2) =(0,1),其它三格在它的右方,記錄為dir2=3,而兩顆圓形的棋子,(3,1)的那一顆,之前只有(3,0)這一個空白,所以記錄為1,(2,3)的那一顆之前有五個空白,所以記錄為5,最後的who=0表示下一步該持灰色L棋子的一方下手。雖然19個bit的記錄空間已經算滿小的,但是還是需要3*219 bytes(1536K bytes)的記憶體空間(因為每一個盤面要3個bytes來做pointer),以前16位元的DOS作業系統,在64K的限制之下,記憶體配置不可能達到1536K,所以我們整個程式是在32位元的作業系統下執行
11、Borland C+ Builder 3.0。完成了盤面記錄的設計後,便讓程式去產生Game-tree,並把雙方的所有可能盤面及輸贏盤面記錄下來,並從Game-tree的追蹤將每一個盤面的最佳對應盤面找出,並尋找此遊戲是否存在最佳的下棋策略及防守策略。第二個需要克服的問題,就是Game-Tree的記錄,因為一個盤面平均有50個以上的對應盤面(最少13個,最多221個),所以我們在設計Game-Tree時應該把Child node指向Parent node。以L-Game的啟始盤面為例,共有65個對應盤面,所以這65個盤面都指向啟始盤面。我們把啟始盤面的編號設成(Node 0)其盤面記錄為(1,
12、0,3),(2,3,2),(0,6),0,它沒有Parent,所以指向-1,而它之下的65個Node,分別編號為(Node 1)(Node 65),而他們的指標就指向(Node 0)。當展開的過程中發現該Node(例如圖五的Node 210)經程式判斷為不能再動的盤面,就記錄不能動的一方為輸。 (圖五)Game-Tree的架構圖Node 9298(2,0,3),(2,2,0),(1,5),03 (灰色輸)Node 210(2,0,3),(3,2,2),(1,5),1 0(2,0,3),(2,3,2),(0,0),1 0(2,0,3),(2,3,2),(1,6),10(2,0,3),(2,3,2
13、),(0,6),1 0Node 65Node 3Node 2Node 1(1,0,3),(2,3,2),(0,6),0 -1Node 0在Game-Tree展開的過程中,會有重覆的盤面出現,對於這樣的盤面,我們就不再展開它。除此之外,我們還需要一個陣列把所有輸的盤面(就是找不到下一步的盤面,以下叫這些輸的Node是LoseNode)記下來。接下來,我們要用倒推方式找出LoseNode所有可能的前一步盤面,前一步的盤面不一定是上圖中LoseNode的Parent node,舉例而言,上圖中Node 210是灰色方的一個LoseNode,而Node 3是它的Parent Node,但Node 21
14、0倒推回去的前一步有24個之多,上圖Node 9298就是一個可能是Node 210的上一步。這24個Node(以下我們叫這樣的Node是WinNode),表示在下棋的過程中如果有機會到達這一盤面,就應該下讓對方輸的盤面來讓自己贏。而這樣的WinNode的前一步可能的Node(以下我們叫這樣的Node是GeneralNode),GeneralNode在選擇最佳的的下一步時,一定不能考慮走到這些WinNode,才不會輸。所有的Node,除了LoseNode及WinNode之外,都是屬於GeneralNode,這些GeneralNode,可以走的下一盤面可能不只一個,如何從這些可以走的盤面找一個對
15、自己最佳的盤面,我們就必須分析可以走的盤面之致勝機率來下決定,致勝機率的算法待會兒再介紹。依這樣的方法,我們可以把原來Game-Tree上的每一個Node找到最好的下一步,加以記錄。請注意,這邊所說的LoseNode、WinNode、GeneralNode,還必須分辨是屬於哪一方。三個之間的在Game-Tree中的關係是LoseNode(A方)指向WinNode(B方)指向GeneralNode(A方)。三、 程式執行結果與分析我們程式的執行環境,是在Pentium MMX-233的主機,64MB SDRAM,Win98作業系統下,程式語言使用Borland C+ Builder 3.0。程式
16、第一部份是架構Game-Tree,展開所有的盤面並找出所有的LoseNode。第二部份將LoseNode以倒推方式標出所有的WinNode。第三部份找出特別的GeneralNode(下面文中會介紹為何特別),並將Game-Tree重新整理。第四部份將所有Node的最佳下一步找出,並輸出至檔案,整個程式執行時間大概兩分鐘。以下用問答的方式說明程式執行結果與分析。1. L棋有多少個不重覆不對稱的盤面?我們以程式窮舉了Game-Tree下所有的盤面,發現總共有36736個Node,雙方各擁有18368種可能但不重覆的盤面,其中有6144種盤面是必贏(WinNode),120種盤面必輸(LoseNod
17、e),先下手及後下手的雙方都擁有一樣多的對應盤面,這點證實了黎波諾教授所說的L棋的特性:勝負無限制。也就是先下手或後下手並無差別。而雙方加起來所有的盤面只有36736(接近215)種可能,遠比219還小,這表示之前我們對於盤面的記錄方式仍有改進的空間。而這些盤面具有對稱性,所以如果我們把對稱的情況扣除(每個盤面有8個對稱情況),則L棋的雙方有2296 種不重覆不對稱的盤面,其中有768個WinNode、15個LoseNode。2. Game-Tree的每一個Node,擁有多少個Child Node?每一個盤面,如果可以找到一個L形棋子可以放的位子,其它兩個圓形棋子就有13種可能的擺法(兩顆都不
18、動1種,動第一顆圓形棋子的有6種,動第二顆的有6種),也就是說,每一個盤面之下的對應盤面必定是13的倍數。我們統計的結果發現一個Node最多可以擁有221個Child Node。Child Node個數統計0個13個26個39個52個65個78個91個104個24014402400288048803456392030722016117個130個143個156個169個182個195個208個221個32003696153612488964805120864總計36736個盤面,平均1個Node有88.89個Child NodeChild Node中WinNode個數統計0個13個26個39個5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 益智遊戲L棋LGAME之電腦解法及分析 國立臺灣師範大學 益智 LGAME 解法 分析
链接地址:https://www.31ppt.com/p-2621313.html