鬥地主之用蟻群演算法整理牌型-如何進行牌力估計
04-22
我們在前面講到過,各牌手的牌力估計就是我們在用蟻群演算法構造最優牌型時的啟發性知識。啟發性知識其實就是我們利用自己的經驗對事物做出的判優性評估,或者說就是對事物價值的判斷。
原則上,應用蟻群演算法需要用到兩類啟發性的知識:- 單步擇優:用來在單只螞蟻決定下一步如何走時各選擇的加權概率,其決定了優化方向- 結構評分:單步最優未必全局最優,所以當單只螞蟻圍繞每輪次的優勝解爬出一個新解時,對這個解的質量需做一個總體評價
對於我們的牌型整理問題來說,單步擇優是每手牌的牌力大小,結構評分是對所有牌手威力最大化的綜合評價。那麼,三張2和A23456789這兩手牌的牌力該如何估算呢?!如果分不清這兩手牌的大小,那麼我們就無法判斷2到底應該組成哪一手才更好。嗯,大家都會打鬥地主吧?如果不會的話,以學習的名義去找人打幾把鬥地主吧:) 記得是上海三打一啦:兩副牌、四個玩家的鬥地主首先我們得把所有的牌手做一個區分:炸彈和其它。因為其它類型的牌手都只能打同類型的牌手,而炸彈可以炸掉所有比自己小的牌手,包括其它類型的牌手和比自己小的炸彈。我們做IT的有所謂三個世界的說法:
- 真實世界:這個不需要解釋,就是我們所感知到的客觀現實- 數字世界:這個也不需要解釋,對我們做IT的來說,就是計算機、IT系統中運行的、處理的代碼和編碼後的信息- 想像世界:這是只存在於我們IT人的頭腦中,是從真實世界跨越數字鴻溝抵達數字世界的橋樑,就是我們如何看待、思考、解決真實世界中的問題,然後如何將其在數字世界中加以實現的請大家務必牢記:由於真實世界和數字世界的巨大差異,所以當我們看到一個問題時首先就要將其轉換一下,不能實際問題怎麼樣,我們就按實際問題來思考!這種轉換有兩個要點:
- 保持實際問題的核心本質,這裡是能正確反映實際打牌時的大小關係,但4張3的炸彈和3張3的區別也要能體現出來- 便於計算機處理,這裡是歸一化(即螞蟻進行計算時不管什麼牌型都得到一個合理的牌力大小估計)、數值化(真實世界中我們是對各種牌的大小關係有個排序,IT的叫法是存在偏序關係;這裡是將其轉化為一個具體的數值,大小關係就看數值大小)這時我們就看到牌力這個真實世界中的概念的問題了:牌力反映了牌手的大小,但反映不出來4張3的炸彈和3張3的本質區別!這個本質區別就是:3張3可以被比3大的其它三張打停,而4張3的炸彈則只能用炸彈才能打停!這可不是廢話,這就是我們解決牌型整理問題時跨越數字鴻溝的關鍵!
我針對這個問題,引入了自己的一個概念:**剩餘牌手數**。即這手牌,需要消耗的炸彈數。鬥地主的關鍵就是爭奪牌權,剩餘牌手數反映的就是這手牌需要消耗掉自己多少炸彈才能得到打出去的機會。
我把剩餘牌手數的取值範圍定義在:【-1,1】:- 越靠近1則說明這手牌想順利的打出去就需要消耗自己多少的炸彈數量- 越接近-1則表明這手牌如果打出去了,反而會消耗掉對方的多少炸彈來阻止你繼續出牌- 0則表明該手牌容易順出去,既不會放在手裡需要用炸彈來開路,也不會打出來讓對方無法大過只好用炸彈停住
這樣一來,牌力的大小隻要看兩手牌誰更小就可以簡單比較了,比如三張2我定義的剩餘牌手數是-0.95,而A23456789我定義的是0.55(既不好順也不大),所以如果不考慮其它牌,三個2、A、3-9各一張這些牌最有可能組成的兩種牌型分別是:- 牌型一:一張A、三張2和3456789的小順子,單A我定義的剩餘牌手數是0.2,三張2是-0.95(除了炸彈沒有再大的三張了),3456789是0.63,共計-0.12- 牌型二:對2和A23456789的順子,對2我定義的剩餘牌手數是-0.4(有對大鬼、對小鬼,所以不是太大),A23456789是0.55(順子除了頂頭的A,其它都不會太大,因為順子對方也容易組成,同時對家放給你恰好長度順子的可能性也不大,而順子如果拆出來幾個單牌,效果更差),共計0.15,因此要比牌型一差因此理論上,就給出的牌,2應該組成三張2。所以,剩餘牌手數反映的是初始情況下不考慮任何對家的情況(即在叫完牌,對其它三家是什麼樣的牌還是零知識的情況下),只看自己手中的牌做出的一個基本估計。那麼,問題來了:三張2我定義的剩餘牌手數是-0.95,而A23456789我定義的是0.55,這是否意味著三張2要比A23456789大?!當然是不!剩餘牌手數反映的是想打出本手牌需要消耗的炸彈數(如果需要消耗-1手炸彈則代表消耗的是對家的炸彈哦,我們用正負就完成了消耗誰的炸彈的轉換),不同牌型之間的剩餘牌手數只表明了本手牌的有利程度而已(價值)。這個就是我們前面所說的轉換,要從真實世界各手牌的大小比較,轉換到各手牌的有利程度的比較上!即本手牌能貢獻多大的牌權但是,問題又來了:單張大鬼和對大鬼的剩餘牌手數都是-0.95,那豈非我們把對大鬼拆為兩個單張的大鬼更為有利?!不是的,如果我們手中所有的牌組合完後,留有兩張以上的單張,那麼兩個單張的大鬼確實要比對大鬼有利,但如果我們手中沒有單張,對方打了次單張之後判斷另外一張大鬼還在我們手中,從此就不出單張了,那所謂的兩個單張大鬼的價值就不是很大了(當然對方的牌型要非常整齊)。所以,剩餘牌手數的正確用法其實是把本類型所有牌手的剩餘牌手數全部累加之後看看還需要消耗多少炸彈!同類型累加後的剩餘牌手數反映了我們打了一手小牌之後能不能收回來,即不需要額外消耗炸彈而繼續保有出牌權。所以我才會把它叫做剩餘牌手數。比如,我有單張3(0.99)、單張4(0.99)、單張小鬼(-0.4)、單張大鬼(-0.95),那麼單張的剩餘牌手數就是這四手牌各自的剩餘牌手數的累加值:0.63。也就是說我們估計:這樣的四手牌需要消耗自己0.63手炸彈才能出完。所以除了炸彈,其它類型的牌手,如果剩餘牌手數累計小於某個門限之後,就屬於牌力過剩了(只具有阻擊的用途,但對家判斷該類型你比較強之後就會選擇嘗試其它攻擊路線,這種情況下這些牌力就浪費掉了),我們在計算剩餘牌手數時就不能統計在有效的剩餘牌手數中了:此即再多的大對,也擋不住對家出三帶二的。最後總結下:- 我用了剩餘牌手數來估計牌手的價值,剩餘牌手數最大的用處其實是估計同一類型的牌手是否具有攻防能力- 解決問題需要我們首先在想像世界中完成問題的轉換,這是IT工程師的基礎技能,問題轉換的好壞直接決定了我們能否解決問題以及解決的成本- 各牌手的剩餘牌手數的大小估計以及剩餘牌手的門限等都需要我們自行指定,而這種指定是先驗的、固化的常識性知識,這就限制了人工智慧的能力:沒有這些先驗性的知識,人工智慧就是一個智障患者,而先驗先驗,就是人類依靠自己的經驗預先設定好的,只靠人工智慧自身無法習得!也就是說,我們可以自己設計一種新的玩法(如摜蛋),然後叫上幾個人慢慢打就學會了,而人工智慧目前還沒有這種學習能力,給他一個新玩法,不導入人類已經打過的牌局,人工智慧就無從學起類似剩餘牌手數這樣的先驗性的領域常識、啟發性知識很令人頭疼,如果不抽出來,則人工智慧沒有通用性;可抽出來,又存在數量龐大、處理/應用效率極低的毛病。可能,這也正好對我們人類來說是個福音吧,我們暫時還可以不需要太過憂慮被人工智慧所取代:)====================================================================================================關注我的公眾號及時獲取推送的最新文章推薦閱讀:
※推薦-2018年最值得讀的12本深度學習相關的書
※人工智慧學習筆記
※玩遊戲、學AI兩不誤,遊戲網站帶來在線學習新思路
※他研究了5000家AI公司,說人工智慧應用該這麼做!
※靈聲機器人重塑電話銷售新模式