• 沒有找到結果。

蜜月橋牌考慮無王並改良各階段演算法之研究與實作

N/A
N/A
Protected

Academic year: 2021

Share "蜜月橋牌考慮無王並改良各階段演算法之研究與實作"

Copied!
64
0
0

加載中.... (立即查看全文)

全文

(1)國立台灣師範大學 資訊工程研究所碩士論文. 指導教授: 林順喜 博士. 蜜月橋牌考慮無王並改良各階段演算法之研究 與實作 The Research of Implementing the No-Trump Rule and Improving each Stage's Algorithm for Honeymoon Bridge. 研究生:林澤沅撰 中華民國 102 年 7 月.

(2) 摘要 電腦對局一直是人工智慧這個領域佔有很重要的一部分,因為電腦並沒有辦 法像人類一樣跳躍性的思考,所以如何讓電腦的實力變得跟人類一樣是個值得投 入的領域。 我們的目的是開發出一款執行速度快、又有一定實力可以跟人類玩家抗衡的 蜜月橋牌程式,而現在發展電腦蜜月橋牌的論文並不多,所以在這方面還有蠻大 發展的空間。 本研究開發無王合約的演算法以及改良前人第一階段喊牌的策略及第二階 段換牌的審局函數。實驗測試發現,新的喊牌策略、換牌策略都比原來的還要好。 而無王演算法也成功的建立。加入了針對蜜月橋牌而改良 Alpha-Beta pruning 演算 法也讓速度提昇。. 關鍵字:蜜月橋牌、人工智慧. i.

(3) Abstract Computer game is always an important part in artificial intelligence. Because computer cannot think like human beings, how to let the computer’s playing strength close to human is a worthy field to study. Our purpose is to develop a Honeymoon bridge program that is fast and smart, and can compete with human. There is not much research about Honeymoon bridge program, so there remains a great research space in this field. This research is to build the algorithms for No-Trump contract, and to improve the bidding strategy in the first stage and the exchanging cards' strategy in the second stage. Through the experiments, we can find out that the new strategies are better than the old ones. And the algorithms for No-Trump contract were built successfully. We modify the Alpha-Beta pruning algorithm to suit for Honeymoon bridge and promote the speed of our algorithm.. Key word: Honeymoon bridge, Artificial intelligence. ii.

(4) 目錄 摘要.................................................................................................................................. i Abstract ........................................................................................................................... ii 目錄................................................................................................................................ iii 附圖目錄......................................................................................................................... v 附表目錄........................................................................................................................ vi 第一章 緒論................................................................................................................... 1 1.1 研究背景..................................................................................................... 1 1.2 研究目的..................................................................................................... 2 1.3 研究意義..................................................................................................... 2 第二章文獻探討............................................................................................................. 4 2.1 蜜月橋牌介紹............................................................................................. 4 2.2 蜜月橋牌規則介紹..................................................................................... 5 2.3 相關程式介紹............................................................................................. 6 第三章 無王及各階段演算法....................................................................................... 8 3.1 無王演算法................................................................................................. 8 3.1.1 Min-Max Algorithm ............................................................................... 8 3.1.2 蜜月橋牌的 Min–Max 演算法.......................................................... 10 3.1.3 蜜月橋牌無王的資料結構表示法...................................................... 11 3.1.4 無王的搜尋演算法.............................................................................. 14 3.2 無王結合 Alpha–Beta pruning ................................................................. 18 3.2.1 Alpha–Beta pruning 演算法介紹 ....................................................... 18 3.2.2 蜜月橋牌的 Alpha-Beta pruning 演算法 ........................................... 21 3.3 喊牌演算法............................................................................................... 24 3.3.1 蒙地卡羅演算法.................................................................................. 25 3.3.2 原始喊牌演算法.................................................................................. 26 3.3.3 改良過後的喊牌演算法..................................................................... 28 3.3.4 無王的手牌模擬演算法..................................................................... 31 3.4 換牌演算法............................................................................................... 33 3.4.1 貪婪演算法.......................................................................................... 33 3.4.2 賽局理論.............................................................................................. 35 3.4.3 原始的換牌審局函數.......................................................................... 36 3.4.4 改良過後的換牌演算法..................................................................... 41 3.4.5 無王的換牌演算法.............................................................................. 47 第四章 實驗測試與分析............................................................................................. 49 4.1 喊牌測試與分析....................................................................................... 51 iii.

(5) 4.2 換牌測試與分析....................................................................................... 53 4.3 無王搜尋演算法測試............................................................................... 55 第五章 結論分析與未來方向..................................................................................... 56 5.1 結論........................................................................................................... 56 5.2 未來方向................................................................................................... 56 參考文獻....................................................................................................................... 57. iv.

(6) 附圖目錄 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖 圖. 1、蜜月橋牌二維陣列示意圖................................................................................. 7 2、Min-Max 演算法示意圖一 ............................................................................... 9 3、Min–Max 示意圖二......................................................................................... 10 4、蜜月橋牌 Min–Max 演算法示意圖................................................................ 11 5、蜜月橋牌手牌示意圖....................................................................................... 12 6、搜尋序列示意圖............................................................................................... 13 7、重新排序過後的搜尋序列圖........................................................................... 14 8、雙方手牌序列圖............................................................................................... 15 9、蜜月橋牌 Min–Max 演算法得分遊戲樹得分展開圖..................................... 15 10、先後手轉換圖................................................................................................. 16 11、搜尋序列展開圖 ............................................................................................. 17 12、減少分支示意圖一......................................................................................... 17 13、減少分支示意圖二......................................................................................... 18 14、Alpha-Beta pruning 演算法的搜尋範例 ........................................................ 19 15、 Alpha-Beta pruning 演算法最少必須搜尋節點的示意圖 .......................... 21 16、蜜月橋牌的 Min-Max 先後手判別示意圖 ................................................... 22 17、蒙地卡羅求 π 圖............................................................................................. 26 18、各花色為王牌平均得分圖............................................................................. 27 19、叫價模擬手牌圖............................................................................................. 27 20、10-A 分數價值圖 ........................................................................................... 28 21、模擬時分配對方手牌示意圖......................................................................... 30 22、無王分數分配圖............................................................................................. 32 23、牌組狀態紀錄圖............................................................................................. 37 24、例 3.4 牌張狀態圖.......................................................................................... 44. v.

(7) 附表目錄 表 表 表 表 表 表 表 表 表 表 表. 1、蜜月橋牌 Alpha-Beta pruning 虛擬碼 ............................................................ 23 2、線位分數及張數表........................................................................................... 29 3、無王線位分數表............................................................................................... 31 4、兩人零和奇偶遊戲表....................................................................................... 36 5、換牌階段各類牌審局分................................................................................... 37 6、改良過後審局分數表....................................................................................... 42 7、無王審局分數表............................................................................................... 48 8、新舊喊牌策略實驗結果................................................................................... 51 9、我改良的程式(player)與葉俊廷的程式(com)喊牌勝率表 ............................ 52 10、新舊換牌策略實驗比較表............................................................................. 53 11、換牌前後分數比較圖 ..................................................................................... 54. vi.

(8) 第一章 緒論 1.1 研究背景. 電腦棋類對局[12]一直是人工智慧[8]這個領域一直佔有很重要的一部分,因 為電腦並沒有辦法像人類一樣跳躍性的思考,所以如何讓電腦的棋力變得跟人類 一樣是個值得投入的領域,而現今已經有很多不錯的成果,像是電腦西洋棋已經 成功打敗了人類最強的棋手,而像電腦象棋跟電腦圍棋也都有相當於職業棋士段 數的程度。 而在現今電腦的記憶體跟運算速度越來越快的情形下,電腦可以搜尋的深度 也越來越深,所以發展電腦對局也可以讓電腦跟一般玩家對局,這樣子可以讓人 類玩家有自我練習的機會也可以讓我們知道電腦還有哪些思考不周到的地方來 加強電腦的棋力。這是一種讓電腦跟人類雙方棋力都進步的好方法。因此電腦對 局不論是在學術研究、文化素養都有很大的貢獻,十分值得深入研究和推廣。 依照遊戲資訊公開的程度電腦對局[5]可分為完全資訊遊戲和不完全資訊遊 戲兩種。完全資訊遊戲可以讓雙方玩家完全掌握所有遊戲相關的資訊,因為遊戲 本身不含任何機率成分,所以我們可利用遊戲搜尋樹來找出我們認為較佳的走 步,例如:圍棋、中國象棋、西洋棋;而不完全資訊遊戲則是雙方玩家只能夠掌 握遊戲部分的訊息,只能利用片段的資訊來搜尋和加入機率的計算來做出較正確 的判斷。因為它包含了機率成分,所以運氣的成分還是佔蠻大的部分,例如:麻 1.

(9) 將、撲克牌遊戲、暗棋。. 1.2 研究目的. 在西方的世界中撲克牌[11]可以算是一種非常風行的遊戲,而橋牌也可以算 是一項主要流行的撲克牌遊戲。在國際上也經常舉辦相關的比賽,而根據人數的 不同發展出相關的規則,像是正規的四人橋牌、三人橋、兩人橋、和五人的拿破 崙。 我們的目的是開發出一款執行速度快、又有一定實力可以跟人類玩家對下的 蜜月橋牌程式,而現在發展電腦蜜月橋牌的論文並不多,所以在這方面還有蠻多 發展的空間。. 1.3 研究意義. 蜜月橋牌的遊戲可以分成三個階段,叫牌、換牌和打牌。在叫牌的時候雙方 根據發到自己手上的 13 張牌來喊牌,然後我們也可以根據對方喊牌的策略來思 考敵方的牌型和牌力大概是怎麼樣的情形,在這個階段就可以利用蒙地卡羅法亂 數去模擬對方的手牌,然後搜尋來預測自己可能得到的墩數。 很多撲克牌遊戲包含了翻牌的運氣成份,所以必須計算機率以及期望值讓自 己可以比別人有更多的優勢。因此很多賭場裡面的老手跟專家他們其實都是靠記 牌跟計算期望值來創造優勢,最後還有根據大量的統計讓自己贏牌,而現今的電 腦就具備了強大的計算能力及速度,還有可以儲存大量資料的記憶體,所以如果 2.

(10) 我們可以把電腦的邏輯思考設計得很好的話,那自然就可以設計出一套強大的橋 牌軟體。 而這個遊戲比較不容易的地方在於有第一階段的叫牌跟第二階段的換牌,因 為第一階段的喊牌並不了解對方手中到底是怎麼樣的牌型,只能根據自己的牌型 優勢還有對方喊牌的花色來判斷。而第二階段的換牌我們必須從翻開來的牌價值 好壞、還有剩餘的牌,來計算我們是否要爭取現在檯面上出現的牌,或者是放棄 而改爭取未翻開的牌,如何選擇下一步的動作也是一個值得研究的課題。還有一 個值得研究的方向就是我們是不是可以利用換牌的階段來使自己的牌型更加的 有優勢,因此這個研究十分有意義。. 3.

(11) 第二章文獻探討 2.1 蜜月橋牌介紹. 合約橋牌(英語:Contract Bridge)[10],一般簡稱橋牌(英語:Bridge) ,是 一種以技巧和運氣贏取牌墩的紙牌遊戲。橋牌是由四個人組成兩對搭檔在方桌上 進行,搭檔互相面對面坐在桌子的兩端。競賽包含叫牌(也可稱為競價)與打牌 兩部份,接著將該牌計分。 在「合約」決定後,叫牌就結束。合約代表某一搭檔宣告他們一方必須至少 吃到的墩數,以及將使用為王牌的特定花色(或者不使用王牌)。打牌的規則與 其他贏取牌墩的遊戲類似,且其中一位玩家的手牌必須面朝上放在桌上,稱作「夢 家」。 橋牌能夠流行,主要是因為複式橋牌競賽的舉辦。這種競賽在理論上,能讓 無窮多名參賽者參加。複式橋牌的比賽小至每天在無數俱樂部舉辦的例行賽事, 大到世界錦標賽和奧林匹克比賽。而根據玩家人數衍生出了五人橋牌 (拿破崙)、 三人橋牌及蜜月橋牌(Honeymoon Bridge) [7]等各種玩法。而四人的橋牌因為有團 隊跟敵對的關係,所以在設計上不只是要考慮敵對的走步想法,在喊牌的時候也 要思考到自己的隊友如何喊牌,所以必須考慮的變數太多。而蜜月橋牌只有兩個 人玩,所以只需要考慮到我方的牌型和敵方的牌型,在設計上可以較專注在遊戲 樹的搜尋及叫牌跟換牌的策略。 4.

(12) 2.2 蜜月橋牌規則介紹. 蜜月橋牌分成三個階段:喊牌、換牌、打牌。一開始將 52 張牌各發 13 給 兩位玩家,剩餘的 26 張牌放在牌桌上,此時玩家只能夠看到自己擁有的 13 張牌。 第一階段 喊牌: 喊牌決定誰是莊家以及合約,玩家會根據自己手牌的好壞來叫價。叫價的時候花 色大小關係是無王>黑桃(♠) > 紅心(♥) > 方塊(♦) > 梅花(♣),叫價時分成線位跟 花色,線位跟花色必須越叫越高,如果想要在同一線位叫價,則必須喊比前面的 花色還要大。當某一位玩家 pass 時,則合約就算是前一位叫價的玩家喊到。喊到 的花色為下面兩個階段的王牌,而喊到的線位加上 6 為喊到合約的玩家在打牌階 段時必須得到的墩數,而另外一位沒喊到的玩家則必須得到比 13 減掉莊家必須 得到的墩數還多就算獲勝。 第二階段 換牌: 這時候將放在牌桌上剩餘的 26 張牌翻開一張,這時候由上一階段喊牌未喊 到的玩家先出牌,稱為「引牌」,另外一位玩家如果有同樣花色的牌,則必須出 同樣花色的牌。如果沒有的話就稱為「缺門」,如果缺門的話就可以出其它花色 的牌。兩方都出牌以後比較大小,牌比較大的那一方就拿走檯面上翻開的那一張 牌,較小的一方從蓋著的牌堆中拿走一張,而且不需要給對方看到。出較大牌的 一方也可以得到下一回合的優先出牌權。如此重複以上的步驟直到 26 張牌都拿 完。 5.

(13) 牌的大小先比花色再比大小,王牌花色 > 引牌花色 > 其它花色。牌張大小: Ace > K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2。 第三階段 打牌: 換完牌後,此時雙方各有 13 張牌,由第一階段未喊到合約的玩家出牌,大 小規則跟喊牌一樣,出牌較大的人可以得到一墩以及下一回合的出牌權。直到雙 方都將手牌出完,此時計算自己得到幾墩,喊到合約的玩家必須得到線位加 6 的 墩數才算獲勝。 無王規則: 無王與一般的規則不同的地方在於在出牌的時候只比較同花色的點數大小, 其它花色的所有牌都比引牌的任何一張點數還要小,沒有所謂的王牌花色。. 2.3 相關程式介紹. 本研究的基礎是根據「不完全資訊賽局-蜜月橋牌之研究」[1],於 2009 年 6 月由國立台灣師範大學資訊工程研究所葉俊廷所撰。在這之前並沒有太多對於 蜜月橋牌程式有相關的論文,因此這篇論文可以作為研究蜜月橋牌很好的一個基 礎。 2.3.1 程式的資料結構 這篇論文使用二維陣列作為資料結構如圖 1,二維陣列雖然運算速度沒有一 維陣列或者是 BitBoard 來的快,但是可以區分出花色,對判斷出牌是否合法以及 展開搜尋,可以加快程式的判斷以及方便撰寫,十分實用。 6.

(14) ♠2. ♠3. ♠4. ♠5. ♠6. ♠7. ♠8. ♠9. ♠10. ♠J. ♠Q. ♠K. ♠A. ♥2. ♥3. ♥4. ♥5. ♥6. ♥7. ♥8. ♥9. ♥10. ♥J. ♥Q. ♥K. ♥A. ♦2. ♦3. ♦4. ♦5. ♦6. ♦7. ♦8. ♦9. ♦10. ♦J. ♦Q. ♦K. ♦A. ♣2. ♣3. ♣4. ♣5. ♣6. ♣7. ♣8. ♣9. ♣10. ♣J. ♣Q. ♣K. ♣A. 圖 1、蜜月橋牌二維陣列示意圖. 7.

(15) 第三章 無王及各階段演算法 由第二章我們可以知道蜜月橋牌也是有無王這一項規則的,但是之前葉俊廷 學長的程式並沒有設計無王的規則及演算法,所以本章將介紹開發無王的規則和 演算法以及改良第一階段喊牌的策略及第二階段換牌的審局函數。. 3.1 無王演算法. 在這一節裡以葉俊廷學長的程式作為基礎來開發無王的規則及演算法,以下 將介紹如何實作無王的演算法。. 3.1.1 Min-Max Algorithm. 本研究的無王演算法是根據 Min-Max 演算法[9]作為基礎而開發的,所以先 介紹必須使用到的技術及方法。Min-Max 演算法是一種常常使用在電腦對局裡兩 人對弈的遊戲搜尋演算法,在雙人對弈的「零和非合作賽局」中,因為是雙方互 相對抗,所以我們可以把對方的損失當作我方獲得的利益。因為不存在合作關係, 所以在考量最佳策略的時候,可以把我方得到的利益加上對方的損失。在我方制 定策略時,則會從所有選擇中選擇最大利益當作我方的策略,而對方在制定策略 時也會以對方的最大利益當作對方的策略。而對方的最大利益可當作我方的最小 利益。這就是 Min–Max 演算法的原理。 我方選擇自己最大利益的節點為 Max 層,而對方選擇我方最小利益的節點. 8.

(16) 則為 Min 層。 Min-Max 初步概念就如圖 2:第一層為輪到我方選擇的盤面,第二層為輪到 對方選擇的盤面,依此類推。. 圖 2、Min-Max 演算法示意圖一 而圖 3 為一般 Min–Max game tree 的示意圖,在輪到我方的時候會選擇分數 最高的節點,而輪到對方時則會選擇分數最小的節點。. 9.

(17) 圖 3、Min–Max 示意圖二. 3.1.2 蜜月橋牌的Min–Max 演算法. 因為蜜月橋牌並不像一般對弈遊戲方式一樣,我方下一步,對方下一步這樣 有規律的順序。而是根據出牌權來決定這一手是誰優先出牌,而這一手的勝負也 會影響到下一手是哪一方來優先出牌。所以在設計蜜月橋牌的打牌演算法時並不 能像一般的 Min–Max 演算法下一步一定是輪到對方出牌。我們必須根據這樣特 殊的規則來變化 Min–Max 演算法。在展開遊戲樹搜尋的時候,我們是根據先後 手來展開遊戲樹的節點,以先手作為 Max 層展開下面幾層的子節點。. 10.

(18) 圖 4、蜜月橋牌 Min–Max 演算法示意圖 以圖 4 為例,第二層的子節點不一定是輪到對方下,也有可能我方在上一輪 的出牌中贏到一墩,這樣子在下一輪就還是我方出牌。如果還是輪到我方出 牌,這一層就一樣還是 Max 層。如果輪到對方出牌的話,那一個子節點就變成 Min 層,依此類推。. 3.1.3 蜜月橋牌無王的資料結構表示法. 根據蜜月橋牌無王的規則來看,只有分成自己這一門的花色跟其它花色兩 種,所以在展開搜尋的時候,我們也分成同花色的展開搜尋跟其它花色的展開搜 尋。而原本有王牌花色規則是分成:同花色的展開搜尋、王牌花色的展開搜尋、 其它花色的展開搜尋。 11.

(19) 然後根據蜜月橋牌的遊戲特性,影響 Min–Max 展開的只有牌的順序,而牌 的差距大小並不會影響搜尋的結果。以圖 5 為例:我方的黑桃 Q 跟黑桃 9 在對方 的黑桃 K 跟黑桃 5 之間,所以出黑桃 Q 跟黑桃 9 並不會改變結果。因此我們根 據目前雙方玩家所擁有的手牌順序來產生搜尋的序列。. 圖 5、蜜月橋牌手牌示意圖. 12.

(20) 我們就每一個花色做分類,然後以大小順序作排列,1 代表先手方的牌,0 代表後手方的牌,雙方各 13 張牌加起來就是一串 26 bits 的二元序列。圖 6 是我 們搜尋序列的組成。. 圖 6、搜尋序列示意圖 如果單純以花色加上大小順序作排列的話,這樣子還是因為搜尋的種類過於 繁多,所以我們再按照每個花色的張數作排列,由張數少排列到張數多的。經過 重新排列之後就變成圖 7。. 13.

(21) 圖 7、重新排序過後的搜尋序列圖 花色最少的依序是梅花五張、黑桃七張、紅心七張、方塊七張。由圖 7 可以 看出來剩下三個花色都有相同的張數,如果一副手牌中我們擁有兩個或以上相同 張數的花色,這時候我們就依照黑桃、紅心、方塊、梅花的順序,也就是花色大 小的順序來排列。. 3.1.4 無王的搜尋演算法. 在打無王規則的時候,其實與一般有王牌花色的規則很相似,差別在於每個 花色都是各自獨立的。所以我們在做無王的 Min–Max 演算法展開搜尋的時候也 會根據這個規則作展開。在展開的過程中,我們都是以「先手」的角度,子節點 14.

(22) 回傳的分數都是在子節點持先手玩家得到的分數。例如:當雙方擁有 13 張牌的 時候所組成的序列為圖 8,依照花色及張數排序;黑桃及方塊有六張,而紅心及 梅花有七張。. 圖 8、雙方手牌序列圖. 而假設持先手的玩家(二元序列中 1 的玩家)最後可以得到八墩,而每一個節 點可得到的分數就如圖 9。. 圖 9、蜜月橋牌 Min–Max 演算法遊戲樹得分展開圖. 1 分就代表得到一墩,如果下一個子節點跟父節點是同一個玩家的話,代表 著父節點選擇的子節點得到一墩,所以回傳給父節點的分數必須再加 1 才是父節 15.

(23) 點真正得到的分數。如果下一個子節點是對手玩家的話,代表著父節點選擇的子 節點失去一墩且失去先手的出牌權,所以子節點的分數代表對手玩家在下一層得 到的分數。因此回傳給父節點必須要 level 減掉子節點的分數才是真正父節點的 分數。 首先傳給函式的參數有手牌序列、每個花色的張數、現在是第幾層、是否為 先後手。如果現在是後手的話,我們會先將序列取補數,將後手變成先手,先手 轉換的動作。如圖 10 所示。. 圖 10、先後手轉換圖 接下來我們會將每一個 1 當做玩家可走的步數展開做搜尋,因為每一個 1 就代表玩家的牌。所以我們將每一個可能的走步都做展開。如圖 11。. 16.

(24) 圖 11、搜尋序列展開圖 在之前也有提到在對方的兩張牌之間,只要是我方的牌不管是出哪一張,所 得到的結果都會是一樣的。以圖 12 為例。. 圖 12、減少分支示意圖一 我方黑桃擁有 A、Q、9、6、2,對方擁有 K、5,如果輪到我方出牌,不管 是出 Q、9 或者 6 序列都變成 101101。所以連續的 1 只需要展開一次就好。如 圖 13 我們就減少了四個分支。 17.

(25) 圖 13、減少分支示意圖二 先從花色最多的開始搜尋,從最低位元往最高位元依序找到第一個 1 開始當做 我方的走步,然後從比自己小的 0 當做對手的出牌選擇往下生出子節點。再來是 比自己位元高的 0 當做對手的出牌選擇生成子節點,最後則是別的花色。第一個 花色都搜尋完再來依序是第二、第三、第四個花色,最後每一個選擇都會得到一 個分數,而我們從中選擇一個分數最大的當做最佳走步。. 3.2 無王結合Alpha–Beta pruning. 在完成了無王的 Min-Max 演算法之後,如果想要完全的搜尋完所有 13 層的 節點,雖然並不像圍棋、象棋的那樣子遊戲樹太過於龐大無法搜尋完畢,但是要 找出最佳走步也必須要花費一段時間才能找出來。所以還是必須加快搜尋的速 度,這時候我們就想到結合 Alpha-Beta pruning,這樣子也不需要重新建立資料庫, 然後可以減少展開很多不必要的分支,加快搜尋的速度。. 3.2.1 Alpha–Beta pruning 演算法介紹. Alpha-Beta pruning 演算法[4]最早在 1956 年由 McCarthy John 於 Dartmouth Conference 提出此概念。後來由 Alexander Brudno 在 1963 年發表。 18.

(26) Alpha-Beta pruning 演算法是為了改進 Min-Max 演算法而產生的。Alpha-Beta pruning 演算法最主要的核心概念就是:在尋找子節點時如果發現再繼續搜尋下去 都無法改變對方目前最佳分數時,則我們可以提早放棄,不需要再浪費時間搜尋 其它的走步。 Alpha-Beta pruning 演算法必須使用兩個參數,一個是 α,一個是 β。其中 α 是記錄 Max 層的目前的最大值,β 是記錄 Min 層目前的最小值。兩個參數以交 錯的方式傳遞給下層的子樹。因此當我們在 Max 層取最大值的時候,如果發現了 一個大於等於 β 值的分數,便不用再對其它分支進行搜尋,這就是所謂的 β cut, 同理當在 Min 層搜尋最小值的時候,如果發現了小於等於 α 值的分數,便不用再 繼續搜尋其它分支,這就是所謂的 α cut。. 圖 14、Alpha-Beta pruning 演算法的搜尋範例 19.

(27) 以圖 14 為例:此圖是一個深度優先由左至右拜訪的樹狀圖; 1.B 節點取值 4 的時候,4≤ 5。造成 C 節點被 cut(α cut)。 2.E 節點取值 6 的時候,6≤6。造成 F 節點被 cut(α cut)。 3.H 節點取值 8 的時候,8≥3。造成 K 節點被 cut(β cut)。. 由上面這個例子可以看出來,Alpha-Beta pruning 演算法的搜尋效率與走法排 列順序有很大的關係。如果我們總是先選擇走比較差的走步,那搜尋的節點數並 不會與一般 Min-Max 演算法差太多,如果我們可以選擇較好的走步先去展開節 點,這樣子盡早產生 cut,可以省去很多不必要的搜尋。 以圖 15 為例,原本總共有 31 個節點,使用了 Alpha-Beta pruning 之後,最 後只搜尋了 19 個節點,節省了 12 個節點。在搜尋走法的時候,對走法做排序時, Knuth 和 Moore 證明了 Alpha-Beta pruning 演算法最少必須要搜尋的節點數目為: n = 2𝑏. n=𝑏. 𝑑� 2. −1. (𝑑+1)� 2. +𝑏. (d 為偶數) (𝑑−1)� 2. −1. (d 為奇數). n 代表節點數目,b 代表 branch factor,d 代表深度。. 20.

(28) 圖 15、Alpha-Beta pruning 演算法最少必須搜尋節點的示意圖 而且他們將搜尋樹的節點分三類: Type1:principal variation,根節點為 type 1,每個 type 1 的第一個子節點為 type 1。 Type2:每個 type 1 節點的除了第一個子節點外,其它為 type 2。 Type3:type 2 的子節點為 type 3,type 3 的子節點為 type 2。他們得到的結論就 是對 type 1 及 type 2 的節點做排序對於搜尋速度有幫助,對 type 3 的節點排序沒 有幫助。. 3.2.2 蜜月橋牌的Alpha-Beta pruning演算法. 我們在之前的章節有提到,蜜月橋牌並不像一般兩人對弈的棋類遊戲一樣, 先後手的順序是固定的。這一層是 Max 層,下一層不一定就是 Min 層,有可能 某一方的玩家牌型佔了很大的優勢,從頭到尾都是他先手。因此我們在設計 Alpha-Beta pruning 演算法也必須加以改良符合這個版本的 Min-Max 演算法 。 21.

(29) 首先演算法的每一個節點都是 Max 層只是差別在於是我方的 Max 層還是對 方的 Max 層。就如圖 16 一樣。. 圖 16、蜜月橋牌的 Min-Max 先後手判別示意圖 因為我們是用二元序列的方式去做展開,所以我們可以很容易的判斷現在要 展開的節點下一層是繼續輪到我方還是變成對方先手,只要是搜尋自己同花色範 圍內還要高位元的 0,就代表下一層換成了對方先手。如果是搜尋其它花色或者 同花色但比自己低位元的 0,代表下一層跟上一層一樣是我方先手。如果還是繼 續輪到我方的話,則對於我方來說的話下一層還是 Max 層,所以我們就用 β 值來 判斷是否大於等於 β。如果不是的話,則繼續往下展開節點,如果是的話,就停 止展開,這就是蜜月橋牌的 β cut。 如果下一手是輪到對方的話,就代表說對於我方的話下一層就變成了 Min 22.

(30) 層,所以就換成了 α 值來判斷是否小於等於 α,如果不是的話,就繼續往下展開, 如果是的話,就停止展開,這就是蜜月橋牌的 α cut。然後一樣每個花色分開展開 搜尋,最後取一個最大值當作目前最佳的走步。 表 1 則是蜜月橋牌的 Alpha-Beta pruning 虛擬碼:我們以第一個花色的搜尋 做為例子。 表 1、蜜月橋牌 Alpha-Beta pruning 虛擬碼 int AlphaBeta (unsigned int order,int flower, int level, int first, int alpha, int beta) { //order 表示手牌的二元序列 //flower 表示花色分布狀況 //level 表示目前是第幾層 //first 表示先後手 int simu_score[level]; int number = 0; int minimum; int maximum; int maxi = 0; int same_f1, same_f2, dif_f1, dif_f2, dif_f3; for (int i = 0; i < flower; i++) { if ((order & (1<<i)) != 0) { minimum = VeryBig; maximum = -VeryBig; /* 無缺門的處理 */ same_f1 = search (order, 0 ,i);//搜尋找對家比自己小的牌 if (same_f1 != NoFind) { maximum=max(maximum,1+AlphaBeta(order,flower,level-1,yes,alpha,beta)); if(maximum >= beta) return maximum; alpha = max( alpha ,maximum); } same_f2 = search (order, i+1,flower);//搜尋對家比自己大的牌 23.

(31) if (same_f2 != NoFind) { minimum=min(minimum,level-1-AlphaBeta(order,flower,level-1,no,alpha,beta)); if(minimum <= alpha) return minimum;//alpha cut beta = min (beta, minimum); } simu_score[number] = max( minimum, maximum); number++; /*有缺門其它花色的處理*/ else { dif_f1 = search (order, f3, f3+f2); if (dif_f1 != NoFind) { neworder = reorder (order , dif_f1, i,level); maximum=max(maximum,1+AlphaBeta(order,flower,level-1,Yes,alpha,beta)); if(maximum >= beta) return maximum; //beta cut alpha = max( alpha ,maximum); } simu_score[number] = maximum; number++; } } } for (int i = 0; i < level; i++) //回傳最大值 { if (maxi < simu_score[i]) maxi = simu_score[i]; } return maxi; }. 3.3 喊牌演算法. 在喊牌的時候,雙方大部分都是根據自己手上所擁有的手牌來決定要喊什麼 花色及喊多高。也會根據對方喊的花色及價位來猜測對方的手牌如何,且判斷自 24.

(32) 己的手牌是不是有辦法達到對方所喊的合約。而在一開始如何知道自己的手牌有 多好,我認為最好的方法就是把剩下的牌隨機選取 13 張然後一起對下看結果如 何。然後依照這個方法去大量模擬,這樣我們就可以知道不管對手的手牌怎麼樣, 我們每個花色大概的實力在哪裡。. 3.3.1 蒙地卡羅演算法 蒙地卡羅方法(Monte Carlo method)[3],也稱統計模擬方法,是二十世紀 四十年代中期由於科學技術的發展和電子計算機的發明,而被提出的一種以機率 統計理論為指導的一類非常重要的數值計算方法。是指使用隨機數(或更常見的 偽隨機數)來解決很多計算問題的方法,期望可以產生接近答案的選擇。我們所 求的問題可以轉化為某種隨機分布的特徵數,像是隨機事件出現的機率,或者隨 機變數的期望值。通過隨機抽樣的方法,以隨機事件出現的頻率估計其機率。當 實驗的次數越多,其平均值也就會越趨近於理論值。最常見到的例子就是使用蒙 地卡羅法求 π 值。 如圖 17 所示,以亂數設定N個點,其X座標跟Y座標介於 0 到 1 之間,假設 1 有M個點位於扇形(4 個圓)錯誤! 尚未定義書籤。內,假如機率是均勻分布,M跟 M π N的比應該接近於扇形及方形的面積比,即 N =4 ,利用此法可得到近似π的值。. 25.

(33) 圖 17、蒙地卡羅求 π 圖 3.3.2 原始喊牌演算法. 在上一個版本葉俊廷學長所撰寫的程式中,喊牌的策略並沒有用太多的方 法,如圖 18 在剛開始發完牌時,就直接以亂數產生對手的手牌,然後假設每一 個花色為王牌去與模擬出來的手牌去對下,模擬一百次,每個花色可以得到一個 平均分數,然後在第一次喊牌時根據所得到的分數來決定自己要以哪一個花色為 王牌且價位要喊到多少。 接下來就根據對手所喊的線位及花色模擬對手的牌做蒙地卡羅演算法。如圖 19,假設對手叫一黑桃的話,那程式就會模擬對手的牌一定有一張黑桃,然後亂 數模擬剩下的牌。接下來就是跟對手去大量模擬,取平均可以得到幾墩,來預測 自己目前的牌型到底怎麼樣。. 26.

(34) 圖 18、各花色為王牌平均得分圖. 圖 19、叫價模擬手牌圖. 27.

(35) 3.3.3 改良過後的喊牌演算法. 因為之前葉俊廷的程式對於模擬對方手牌並沒有太多方法及策略,所以我決 定加以改良讓我們在使用蒙地卡羅演算法模擬時可以更精準知道自己的手牌到 底實力如何。 在對方喊牌的時候我們會想說他喊這個花色,代表說他在這一門花色中有一 定的實力,所以不會只是單純的發固定數量的牌給他。我們也想像說他在這一門 花色中價值較高的牌也有一定的數量。在一般的認知中通常 10 以上的牌會比較 有價值,在打牌的時候比較有機會去取得一墩,因此我決定給 10 以上的每一種 牌各一個分數,如圖 20。. 圖 20、10-A 分數價值圖 然後根據叫到的價位不同給予一定的分數值。有了ㄧ定的分數之後,張數也 是佔了為什麼要喊那一門花色為王牌一個很重要的因素。如果你只擁有大的牌但 是張數卻不夠多,還是沒有辦法以這個花色當做自己的王牌來叫價。表 2 是我給 每一個線位所給予的分數值以及應該有的張數。 28.

(36) 表 2、線位分數及張數表 線位. 分數. 張數. 1. 1. 3. 2. 3. 4. 3. 5. 5. 4. 7. 6. 5. 9. 7. 以圖 21 為例,假設對方現在喊了二紅心,我會先把我方的紅心 A 分數扣掉, 剩下 10 點,因為對方喊到二所以基本一定會有三點的分數,我們就會從剩下價 值較好的牌中隨機挑選並扣到大於等於三分為止,因為是要求最低三分,所以也 有可能得到三分以上的分數。有可能分配的到分數就是(1+2)、3、4、(1+3)、(1+4)。 得到一定的分數之後就把得到的張數扣掉,然後再隨機分配剩餘價值較小的牌給 對方。分配完紅心這一個花色後,就將剩下的張數隨機分配給其它的張數,補齊 13 張。. 29.

(37) 圖 21、模擬時分配對方手牌示意圖 模擬完後,我們會得到一個分數。因為是對方喊到,這時候也代表說我方需 要達成的勝利條件較低,對方喊了二紅心,表示說我方只需要取得 6 墩就算獲勝。 如果我們大量模擬出來的平均分數大於等於六墩的話,當然就停止再繼續喊上 去。如果我們模擬出來的分數並沒有大於等於六墩的話,這時候我們就會選擇一 個最高的模擬分數當做自己的王牌花色繼續喊上去。如果說每一門花色得到的分 數都過低的話,這時候也會放棄喊牌,讓對方喊到他想要的花色及線位,因為我 方的手牌本來就是比較弱勢,所以喊上去反而對自己越不利,不如讓對方喊到反 而達成勝利條件較低,還比較有可能獲勝。. 30.

(38) 3.3.4 無王的手牌模擬演算法. 因為無王的遊戲規則也跟一般有王牌花色的遊戲規則不一樣,只要是先手方 所出的牌,那個花色就算是王牌,只要出其它花色的牌都算是比較小。所以我們 在模擬手牌的時候策略也會有所不同。一般來說要喊到無王的話,必須要每一門 花色都很平均,且擁有的點數也有一定的分數以上。因此我們在模擬的時候也是 依照這個方式去模擬對方的手牌。 如果是喊到無王的時候,因為要平均自己的手牌,每一門花色都會固定只有 三張。點數分配的話就如同表 3。 表 3、無王線位分數表 線位. 分數. 1. 4. 2. 6. 3. 8. 4. 10. 5. 12. 而分數這樣設定其實並沒有什麼根據,只是根據我個人經驗通常在打無王的 規則時,怎麼樣的牌型會比較有優勢。然後在分配分數的時候也會每一個花色平 均分配。 假設對方現在喊了ㄧ無王,那麼我在模擬對方手牌的時候就會讓對方的手牌 31.

(39) 裡每一個花色都至少有 A、K、Q、J、10 其中一張,然後這樣子就剩下九張再平 均分配給 2、3、4、5、6、7、8、9。因為牌總共有 13 張,所以每個花色各四張 以後還會多一張,這時候就會將多的那一張分給分數最少的那一個花色。這樣子 才比較符合無王的牌型。如圖 22 所示。. 隨機分配 圖 22、無王分數分配圖. 32.

(40) 3.4 換牌演算法. 換牌階段每一回合都會有一張翻開來的牌擺在檯面上,這時候拿到控制權的 一方會有優先出牌權,通常先手的一方會根據出現的牌來決定他將要出哪一張 牌,是否想要得到這張牌。而後手的一方則會根據先手方出的牌以及翻開的牌的 價值來決定他會出什麼牌。雙方出完牌以後牌較大的一方可以得到出現的那張牌 且擁有下一輪的出牌權。而我們要怎麼決定要出多大的牌來取得這張牌或者是不 要這張牌,而且是否要搶下下一輪的出牌權,是否蓋著的那一張牌會比現在出現 的牌還要好,這些都是我們要考慮的東西。但我們永遠不知道下一張會出現什麼 牌,所以通常在考慮換牌策略的時候不會將蓋著還沒翻開的牌全部納入考慮,都 將每一回合作單獨的考慮,單純思考現在出現的這張牌是否想要,然後採用貪婪 演算法(greedy algorithm)來選擇每一回合的最佳策略。. 3.4.1 貪婪演算法. 貪婪演算法[2]最主要的精神就是在決定每一步的時候,都走目前狀態最有利 的那一步,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中, 如果旅行推銷員每次都選擇最近的城市,那這就是一種貪婪演算法。 貪婪演算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最 優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最 優解能遞推到最終問題的最優解。 33.

(41) 貪婪演算法與動態規劃的不同在於它每對每個子問題的解決方案都做出選 擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進 行選擇,有回退功能。 貪婪演算法可以解決一些最優化問題,如:求圖型問題中的最小生成樹、求 哈夫曼編碼等。對於其他問題,貪婪法一般不能得到我們所要求的答案。一旦一 個問題可以通過貪婪演算法來解決,那麼貪婪演算法一般是解決這個問題的最好 辦 法。由於貪婪演算法的高效性以及其所求得的答案比較接近最優結果,貪婪 演算法也可以用作輔助演算法或者直接解決一些要求結果不特別精確的問題。 在一般遊戲賽局中,如象棋、圍棋,玩家每走一步走步,通常會讓盤面變得 對自己比較有利,而輪到對方時,對方又會選擇走那些讓情勢變得對他有利的走 步。因此遊戲就是在這種互相拉鋸的情形下進行著。電腦的搜尋深度是固定的, 這時候就會產生水平效應(Horizontal Effect),能看到的深度有限,沒有辦法找到 真正最佳的走步。但是在蜜月橋牌換牌階段時,水平效應的影響並不明顯,因為 我們並不知道出現的牌與下一張蓋著的牌哪一張的價值到底比較高。先出的人不 一定比較佔有優勢,後出的人也不一定就處於劣勢。而翻開的牌分成兩種:有價 值跟沒價值。當翻開的牌有價值的時候,先出牌的玩家也會出一張比較有價值的 牌希望可以搶下這張牌,而後出牌的玩家如果沒有辦法出一張較大的牌,則會選 擇出一張沒有用的牌來換取蓋著的牌。當翻開的牌沒有什麼價值的時候,先出牌 的玩家就會選擇自己手中比較沒有價值的牌,希望對方拿到這張牌。而後出牌的 34.

(42) 玩家也會希望出一張比先手玩家還要小的牌來避掉得到這張牌。其實雙方之間的 差距並不會出現很大的改變。從上面的分析可以看出來換牌階段機率佔有很重的 成分,因此選擇貪婪演算法是比較直覺有效率的方法。. 3.4.2 賽局理論. 賽局理論[6]考慮遊戲中的個體的預測行為和實際行為,並研究它們的優化策 略。表面上不同的相互作用可能表現出相似的激勵結構(incentive structure), 所以他們是同一個遊戲的特例。其中一個有名有趣的應用例子是囚徒困境。具有 競爭或對抗性質的行為成為博弈行為。在這類行為中,參加鬥爭或競爭的各方各 自具有不同的目標或利益。為了達到各自的目標和利益,各方必須考慮對手的各 種可能的行動方案,並力圖選取對自己最為有利或最為合理的方案。比如日常生 活中的下棋,打牌等。賽局理論就是研究博弈行為中鬥爭各方是否存在著最合理 的行為方案,以及如何找到這個合理的行為方案的數學理論和方法。. 賽局理論是一種策略性的思考,當雙方有利害衝突的時候,它希望在這衝突 下找到一個最適當的因應策略,希望可以透過這個策略,來找到自身的最大利益。 而當中最重要的就是「我的計算必須考慮了你的計算,而你的計算也必須考慮我 的計算」。假設現在有一個零和的奇偶遊戲,甲乙兩人每次各從 1 和 2 兩個數字 中挑一個出來,當兩人的和是奇數的時候,乙必須給甲 3 元,當兩人的和是偶數. 35.

(43) 且是 2 的時候,甲必須給乙 2 元,而和是 4 的時候,甲必須給乙 4 元。如表 4 所 示。. 表 4、兩人零和奇偶遊戲表. 甲. 乙. 1. 2. 1. -2. +3. 2. +3. -4. 1. 從直觀來看,甲不管是出 1 還是 2,贏的機率都是 2,出 2 輸了卻要輸 4 元。 −2+3. 如果全部都出 1 的話,可以獲得的最大期望值 考慮到乙的計算。乙知道如果以. 1 2. 2. = 0.5,但是這個想法並沒有. 的機率來看的話,甲出 1 會比較有利,所以乙. 會改變策略,會有比較高的策略來出 1 獲得利益。. 3.4.3 原始的換牌審局函數. 在每一回合換牌的階段時,會先以一個表格紀錄每一張牌的狀態如圖 23,這 樣子就可以利用機率算出我們出哪一張牌有最高的機率可以達到自己的目的。以 圖 23 為例:如果出現了某一個花色的 4,而我方不想要的話,這時候就可以確定 出黑桃 3 是一定沒有機會贏過對方的,因為我們已經紀錄了對方有黑桃 2。這時 候就會以別的牌來做選擇。. 36.

(44) 圖 23、牌組狀態紀錄圖 而原先的審局函數把每張牌的價值先分成王牌花色及非王牌花色如表 5。. 表 5、換牌階段各類牌審局分. 點數. 王牌花色. 非王牌花色. Ace. 40. 25. K. 35. 20. Q. 30. 15. J. 26. 11. 10. 24. 9. 9. 22. 7. 8. 20. 5. 7. 18. 3. 6. 18. 3. 5. 18.5. 3.5. 4. 20.5. 5.5. 3. 22.5. 7.5. 2. 24.5. 9.5. 37.

(45) 然後將情況分成四個階段:. (一)持先手且翻開的分數小於 10 時:. 以例 3.1 的牌型為例: 例 3.1:假設王牌為紅心,我方先手。 翻開的牌. 我方的手牌. 在這裡我們考慮的是盡可能不要拿到這張牌,所以必須選擇一張最有可能比 對方小的牌。現在已知對方的其中 2 張牌,還有 11 張是未知的,加上還在牌堆 11. 中還知的牌總共有 30 張,每張未知牌在對方手上的機率就是30,所以我們計算每. 個花色中最小的牌比對方還小的機率得到以梅花 5 的機率最高,所以在這回合會 選擇出梅花 5。. (二) 持先手且翻開的牌分數大於 10: 這時候我們要盡力爭取翻開的牌,選擇較可能大過對方的牌,除此之外,還 要計算自己出的牌是否值得爭取翻開的牌,所以並不只以機率作為分數評估。因 此葉俊廷學長設計了ㄧ個審局函數,計算的式子為: P : 獲勝機率. 38.

(46) W : 翻開的牌張價值 X : 我方打出的牌張價值 分數 = P*W - X 在這個式子裡,當 W 越大時,P 對分數的影響也越大,此時程式為了提高獲 勝機率(P),會選擇出牌價值(X)更高但也可能大過對方的牌,以確保能夠爭取到 翻開的牌。 同樣以例 3.1 的牌型當作例子,我方先手,王牌花色改為梅花,則梅花 2 的 價值為 24.5。經過公式計算之後,每一張的分數如下:. ♠3:0 – 7.5 = -7.5 ♥A:1 * 24.5 – 25 = -0.5 ♥Q:(1-. 11 30. )* 24.5 – 15 = 0.516. ♥J: (1-. 11. ♥8:(1 −. 11 𝟑 ) 30. ∗ 24.5 – 5 = 1.223. ♦J:(1 −. 11 𝟐 ) 30. ∗ 24.5 = -1.172. 30. )* 24.5 – 11 = 4.516. ♦A:1*24.5 – 25 = -0.5. ♦7:(1 − ♣K:(1-. 11 𝟓 ) 30. 11 30. ∗ 24.5 – 3 = -0.503. )* 24.5 – 35 = -19.48 39.

(47) ♣10:(1-. 11 30. )* 24.5 – 24 = -8.483. ♣9:(1-. 11. )* 24.5 – 22 = -6.483. ♣7:(1-. 11. )* 24.5 – 18 = -4.483. ♣5:(1-. 11. )* 24.5 – 18.5 + 18 = -4.983. 30 30 30. 則程式會選擇分數最高的紅心 J 作為這一回合的出牌選擇。 (三) 後手且翻開的牌分數小於 10: 在後手的情況下,策略就比較簡單了,因為知道對手出什麼牌了,所以只要 依照對手的出牌來作選擇。如果手牌中有比對手小的手牌,就從中選一張價值最 低的出,如果沒有,就從合法出牌裡找一張價值最低的出。以下以例 3.2 作說明。 例 3.2:此局以紅心為王牌 翻開的牌. 對方出的牌. 我方的手牌. 因為翻開得方塊 6 分數為 3,小於 10,我們並不想要,所以我們找到黑桃 4 小於黑桃 6,選擇出黑桃 4。 (四) 後手且翻開的牌分數大於 10: 40.

(48) 根據對方的出牌,就在牌裡尋找是否有比對方大的牌,有的話就找一張分數 最低的出。如果沒有的話,就從合法牌堆裡找一張分數最低的出。以下以例 3.3 為例。 例 3.3 :此局以黑桃為王牌 翻開的牌. 我方的手牌. 對方出的牌. 因為黑桃 2 是王牌,此時對方出方塊 K,因為我方牌組中並不存在比方塊 K 還要大的牌,所以就從合法牌堆中找一張最低分的,在分數設定中 6 跟 7 是最低 的,程式會選擇方塊 6 為本回合的出牌。. 3.4.4 改良過後的換牌演算法. 在測試葉俊廷的程式時,發現原來的程式裡會有一些出牌不合理的地方,像 是會為了搶牌而有可能出實際上比自己大的牌。還有審局函數,把 2、3、4 的分 數定的比 5、6、7、8、9 還高,原本是為了在出現不想要的牌時拿來墊牌,但是 在換牌後期價值較低的牌出已經出現後不需要墊牌了,原本的程式還有可能繼續 保留小牌然後選擇 5、6、7、8、9 優先出牌。 首先我決定改變原來的審局分數,就直接按照每張牌在實際打牌時的大小來 41.

(49) 排列,如表 6 所示。 表 6、改良過後審局分數表 點數. 王牌花色. 非王牌花色. Ace. 100. 90. K. 95. 60. Q. 90. 50. J. 88. 40. 10. 86. 37. 9. 84. 31. 8. 82. 28. 7. 80. 27. 6. 78. 24. 5. 76. 20. 4. 74. 16. 3. 72. 13. 2. 70. 10. 雖然說王牌花色的每一張牌都比一般花色的 Ace 還要大,但是其實在打牌的 時候,遇到用王牌吃掉一般花色 Ace 的機率是微乎其微,而且當 Ace 的時候幾乎 可以保證一定可以得到一墩,所以我們會把一般花色 Ace 分數定的比大部分王牌 42.

(50) 花色的牌還要高。打蜜月橋牌的時候,缺門是一種搶得出牌權讓自己更有優勢的 情況,如果對手出了ㄧ張是我方剛好缺的那一門花色,這時候我方就可以用王牌 花色出牌,這樣不但可以搶到一墩,也可以搶到出牌權,出自己有優勢的那一門 花色。所以我會在每一回合出牌的時候幫每一門花色再加上一個張數的權重分 數,這樣子可以讓自己強的那一門與弱的那一門之間的差距更大。 接下來,我也把情況分成四種(一) 持先手且翻開的分數小於 35(二) 持先手 且翻開的分數大於 35(三) 持後手且翻開的分數小於 35 (四) 持後手且翻開的分數 大於 35。雖然情況定的與原先一樣,但是在判斷要出哪一張牌的時候卻會有比較 多的條件判斷以確定。以下一一說明每一種情況及判斷出牌的條件。 (一) 持先手且翻開的分數小於 35: 這時候我們並不想要獲得這一張牌,所以程式會從擁有的手牌中找一張價值 最低的當作這一回合要出的牌,因為加上了張數的權重分數,所以就算是兩張一 樣分數的牌,但也會因為花色張數不一樣而有所區別。如果兩個分數相同的話, 則計算哪一張會比對方小的機率較高。如果兩者都一樣的話,則計算哪一個花色 的總和分數較低,我的想法就是這樣可以讓張數少且實力較弱的那一門花色盡早 缺門。 以例 3.4 為例:每張牌的狀態如圖 24。. 43.

(51) 圖 24、例 3.4 牌張狀態圖. 例 3.4:現在王牌為梅花 我方的手牌. 翻開的牌. 因為翻開的牌為黑桃 7,我方並不想要這張牌,在搜尋過自己的手牌後找到 兩張一樣價值最低的 6,分數皆為 24。在經過機率計算後兩張能比對方小的機率 12. 也都是(1 − 30)4,最後再根據擁有 35 分以上的牌紅心較多所以我們選擇出方塊 6 44.

(52) 當作這一回合的出牌。 (二) 持先手且翻開的分數大於 35 因為出現的牌分數大於 35,代表說我們是想要得到這一張牌的。但是要出價 值多好的牌來搶,我有了ㄧ個新的想法,就是會不會下一張牌的價值其實並不會 比現在出現的這一張低還有可能比較高。所以就新增了ㄧ個蓋著的牌的期望值。 公式變成了(W − X) ∗ P1 + (W − X) ∗ P2 = V。其中 W:出現的牌的價值 X:我方出的牌 P1:得到這張牌的機率 P2:下一張牌大於等於出現的牌的機率 V:得到總和分數 這樣子可以隨著換牌階段後期,如果有更好的牌還未出現,我們就可以用較 小的牌換到價值較好的牌。同樣以例 3.4 為例。 例 3.4:以梅花為王牌 翻開的牌. 我方的手牌. 45.

(53) 經過計算後我們出黑桃 J 是最有利的,所以這回合選擇出黑桃 J。 (三) 持後手且翻開的分數小於 35 這時候情況就比較簡單,如果我們有相同花色的牌,則從裡面找一張最小的 牌出。如果缺門的話,則從其它花色中找一張價值最低的牌當作這回合的選擇。 同樣用例 3.4 當作例子。 例 3.4:王牌為方塊 翻開的牌. 對方出的牌. 我方的手牌. 梅花 4 的價值只有 16,因為對方出了紅心 7,而我方有紅心並沒有缺門,搜 尋過後找到紅心 6 比對方小,所以就決定以紅心 6 當作這回合的選擇。 (四) 持後手且翻開的分數大於 35 分數大於 35 代表說我們想要這張牌,而且對方已經出牌了。首先我們會找 對方出的牌是否比翻開的這張牌還小,如果比較小而且我們沒有缺門的話,則從 對方出的牌與翻開的牌大小之間找到價值最小的牌當作選擇,如果沒有在兩者之 間的牌,則觀察對方出的牌與翻開的牌這張牌之間的價值差距,然後在我方手牌 中找一張差距最小的牌當作選擇。如果缺門的話,則會選擇一張比翻開的牌價值 還要低且能贏過對方的牌當作選擇。以例 3.4 為例子: 46.

(54) 例 3.4:王牌為梅花 翻開的牌. 我方的手牌. 對方出的牌. 因為王牌為梅花,所以梅花 4 的分數為 74,所以我們會想要這張牌。對方出 了紅心 J,而我方剛好有紅心 Q 比紅心 J 大而且價值不大於梅花四,所以用梅花 4 當作這回合的選擇。. 3.4.5 無王的換牌演算法. 因為無王少了王牌花色這個規定,所以每一個花色的分數都一樣。因此我將 原本的修改成如表 7:. 47.

(55) 表 7、無王審局分數表 點數. 花色分數. Ace. 90. K. 60. Q. 50. J. 40. 10. 37. 9. 31. 8. 28. 7. 27. 6. 24. 5. 20. 4. 16. 3. 13. 2. 10. 因為無王規則與一般王牌花色玩法不太一樣,所以在換牌的時候策略也會略 有不同。讓自己造成缺門這一個策略在無王這個規則時並不適用,如果我們讓自 己某一門花色缺門的話,反而在打牌階段的時候如果讓對方拿到出牌權,對手就 可以針對我們缺的那一門花色去下,所以缺門反而變一種缺點。所以我們將原本 的花色分數減掉牌張個數,這樣子就可以讓個數較少的那一門花色有較高的權 重,在出牌的時候不會優先選擇張數較少的那一門花色。. 48.

(56) 第四章 實驗測試與分析 本研究的蜜月橋牌是 C++語言寫成的,開發軟體式 Dev C++ 4.9.9.2,硬體的 規格是 Intel Core i5-2400cpu 3.10GHz,記憶體 2GB,作業系統 Windows7 SP1 32Bit。 我們將實驗分成三個,第一個是測試第一階段喊牌的效果如何,第二個則測 試換牌有沒有如我們預期的改進,第三個是測試無王演算法加入 Alpha-Beta pruning 的速度及準確率如何。 以下為實際遊戲畫面:. 49.

(57) 50.

(58) 4.1 喊牌測試與分析. 首先我們要測試的是改變喊牌策略以後勝率會不會變得比較高,所以我就設 計了ㄧ個自動對下程式 com 代表的是葉俊廷原始程式的喊牌策略,player 代表的 是我改良過後的喊牌策略。第二階段換牌跟第三階段打牌用的都是原來同一套演 算法。以這個模式測試了 50 場,而我改良的喊牌策略贏了 40 場。結果如表 8: 表 8、新舊喊牌策略實驗結果 葉俊廷版本獲勝. 我的版本獲勝. 10. 40. 從上面的實驗結果可以看到,改良過的喊牌比原始的喊牌有很大的進步。對 下的勝率有八成。接下來要測試的是哪一方喊到且勝率是多少,實驗中從總共 45 場我改良的程式喊到了 25 場而葉俊廷的程式喊到了 20 場,雙方喊到的比率幾乎 是一樣,然後各挑了 20 場我改良的程式(player)喊到以及葉俊廷的程式(com)喊到 的場次,多於 20 場以後的場次不列入實驗結果中,實驗結果如表 9。. 51.

(59) 表 9、我改良的程式(player)與葉俊廷的程式(com)喊牌勝率表 玩家喊到. 勝方. 電腦喊到. 勝方. 3♠. player. 1♥. com. 1♠. player. 2♠. player. 1♥. player. 1♠. player. 2♠. player. 1♠. player. 2♣. player. 1♣. player. 2♥. player. 1♦. com. 2♣. player. 2♥. com. 3♠. player. 1♠. player. 2♦. com. 1♥. player. 1♥. com. 1♠. com. 2♣. player. 2♣. player. 2♥. player. 1♠. com. 1♥. player. 1♠. com. 2♥. player. 1♦. com. 1♠. player. 2♠. com. 2♣. player. 2♠. com. 1♠. player. 1♠. player. 1♠. player. 3♠. com. 2♥. player. 1♥. player. 2♠. player. 1♠. player. 1♥. player. 1♠. player. 52.

(60) 由表 9 的結果我們可以看到只要是我改良的程式(player)喊到的牌局,幾乎都 可以贏,20 場裡贏了 18 場,勝率有九成。而葉俊廷的程式(com)喊到的牌局裡, 20 場玩家贏了 11 場,勝率也有超過 50%,這也證明了新的喊牌策略在喊牌的時 候比較保守,如果會選擇喊上去的話代表自己的牌是有一定程度的實力,而在學 長喊到的 20 局中,我的喊牌策略可以得到超過 50%的勝率,經過我的分析,會 比自己喊到的勝率低是因為某些牌局的起手手牌比對方弱太多,自己根本沒有與 對方對抗的實力,或者是雙方實力差不多所以放棄繼續喊上去,結果不容易預 測。. 4.2 換牌測試與分析. 在換牌階段,我們先測試的也是哪一個版本勝率比較高,所以用的是相同的 喊牌及打牌演算法。用這個方法測試了 50 場,改良過後版本的換牌策略贏了 35 場。勝率有 70%。實驗的結果如表 10。 表 10、新舊換牌策略實驗比較表 葉俊廷版本獲勝. 我的版本獲勝. 15. 35. 由實驗結果來看,我改良的程式(player)的勝率有 70%,雖然比起喊牌策略低 53.

(61) 了點,但是還是代表說新的換牌策略是有進步的。 第二個實驗是測試換牌過後,我方的手牌有沒有變得更好,因此在喊完牌的 時候一樣用蒙地卡羅演算法先去模擬一個以喊到的王牌為王牌花色的平均分數, 在喊完牌之後,再重新模擬分數看進步了多少,我測試了 10 場如表 11。 表 11、換牌前後分數比較圖 換牌前分數. 換牌後分數. 8.9. 10. 8.4. 10.5. 8.1. 7.2. 7. 8.4. 6.6. 11.4. 6.5. 10. 6.9. 12. 6.5. 8.8. 5.5. 10.5. 7.6. 5.8. 由表 11 可以得知,大部分換牌以後模擬分數都有成長,只有少數分數是減 少的。所以代表說我們的換牌策略也是有效的。. 54.

(62) 4.3 無王搜尋演算法測試. 在無王搜尋演算法的實驗階段,首先我們要測試的是加入 Alpha-Beta pruning 演算法之後速度比原本的快多少。 在測試的時候,一開始原本雙方都有 13 張的 時候,電腦思考下第一步需要超過 20 分鐘的時間,而在加入 Alpha-Beta pruning 演算法之後的速度,每一步只要思考兩秒之內就可以出來,所以代表加入了 Alpha-Beta pruning 演算法大大的減少了不必要的分支。 第二個要實驗的是加入了 Alpha-Beta pruning 演算法所搜尋到的最佳走步是 否與原來沒使用的一樣好。因為原本沒有加入 Alpha-Beta pruning 演算法的無王 演算法是將所有節點展開,所以走的一定是最佳走步,所以我們要測試加入了 Alpha-Beta pruning 演 算法會不會把最佳走步截斷了。實驗設定是給有加入 Alpha-Beta pruning 演算法與沒有 Alpha-Beta pruning 演算法兩個程式每次都給一 樣的盤面去檢查出來的結果。我們實驗了ㄧ百個的盤面,結果出來都是一樣的, 代表說加入了 Alpha-Beta pruning 演算法不但可以加快原來搜尋的速度而且跟原 本的走步一樣準確。. 55.

(63) 第五章 結論分析與未來方向 5.1 結論 經過實驗測試發現,新的喊牌策略、換牌策略都比原來的還要好。而無王演 算法也成功的建立以及加入了 Alpha-Beta pruning 演算法讓速度跟一般人的思考 速度一樣。 在喊牌的時候只要是新的方法喊到的話幾乎都可以在最後贏得牌局。不管在 換牌階段時雙方手牌的實力是否有彼此消長。如果是葉俊廷的喊牌策略喊到合約 的話,新的策略也有五成以上的勝率,代表說有時候對方的手牌真的比我方的手 牌實力強太多或者是我方起手的手牌真的太差因此沒辦法喊上去。 而換牌的策略相較之下也與葉俊廷的換牌程式有一定程度的差距,而且經過 測試後所模擬的分數也比會原來換牌前的分數還要高,代表說有好的換牌策略是 可以讓自己的手牌變更好的,尤其是當雙方一開始拿到的手牌都沒有什麼好牌的 時候,這個時候換牌策略的重要就顯現出來了。. 5.2 未來方向 因為這次想要改良的是葉俊廷的程式,所以也是把葉俊廷的程式當作主要的 實驗對象。未來希望可以以真人當對手,更加改進我的程式。然後希望可以將蜜 月橋牌程式的經驗應用在一般橋牌的程式,因為一般的橋牌牽涉到團隊合作的關 係,所以在實作上更加複雜。有了蜜月橋牌程式的經驗,相信在設計一般橋牌的 會更有幫助。. 56.

(64) 參考文獻 [1]葉俊廷,不完全資訊賽局 - 蜜月橋牌之研究,國立台灣師範大學資工所碩士 論文,2009。 [2]張瓈文, 「德州撲克」 不完全資訊賽局之研究,國立台灣師範大學資工所碩士 論文,2005。 [3] Wikipedia, http://zh.wikipedia.org/wiki/Wiki. [4]勞永祥,電腦暗棋之人工智慧改良,國立臺灣師範大學資工所碩士論文,2011。 [5] J. V. Neumann, ”Zur Theorie der gesellschaftsspiele”, Math. Ann, 1928. [6] J. Nash, ”Non-cooperative Games”, Math. Ann, 1951. [7] Honeymoon Bridge, http://www.pagat.com/boston/honeymoon.html. [8] S. J. Russell, P. Norvig, Artificial Intelligence: A Modern Approach, Pearson International Edition, 2003. [9] T. H. Cormen, C. E. Leiserson, R. L. Riverst, C. Stein, Introduction to Algrithms, MIT Press, 2003. [10] Contract Bridge, http://www.rpbridge.net/1a00.htm. [11] J. Swanson, Game Theory and Poker., 2005 [12] Chessprogramming, http://chessprogramming.wikispaces.com/.. 57.

(65)

參考文獻

相關文件

應用閉合電路原理解決生活問題 (常識) 應用設計循環進行設計及改良作品 (常識) 以小數加法及乘法計算成本 (數學).

W ing )教授在美國電腦權 威期刊《 C ommunications of the

西元 1998 年,G oogle 的創辦人之一賴利佩吉發表了網 頁排序的演算法,涵蓋 G oogle

本論文之目的,便是以 The Up-to-date Patterns Mining 演算法為基礎以及導 入 WDPA 演算法的平行分散技術,藉由 WDPA

本章將對 WDPA 演算法進行實驗與結果分析,藉由改變實驗的支持度或資料 量來驗證我們所提出演算法的效率。實驗資料是以 IBM synthetic data generator

本研究採用的方法是將階層式與非階層式集群法結合。第一步先運用

關鍵字: : : :測驗理論 測驗理論 測驗理論 測驗理論, 基因演算法 基因演算法 基因演算法 基因演算法, Bloom 認知分類.. 認知分類

本文在於使用有限差分去逼近導數,解決泰勒級數法(Taylor series