李淑琴,陳子鵬,鄭藍舟,孟坤
(1. 北京信息科技大學 計算機學院,北京 100101; 2. 北京信息科技大學 感知與計算智能聯合實驗室,北京100101; 3. 微智娛(北京)科技有限公司,北京 100101)
國家體育總局棋牌運動管理中心以“創新、協調、綠色、開放、共享”的發展理念為指導,以提升國民素質與人民健康水平為發展目標,提出了“傳統棋牌項目趣味化”和“趣味棋牌項目競技化”的重要發展戰略。在鞏固傳統五棋一牌項目(圍棋[1-3]、象棋[4]、國際象棋[5]、國際跳棋[6]、五子棋[7]、橋牌[8])基礎的同時,針對趣味棋牌競技化的發展戰略,國家體育總局棋牌運動管理中心首先推出了以民間趣味棋牌運動“斗地主”[9]為原型的競技二打一撲克項目。2016年9月3日,舉辦了首屆全國競技二打一撲克錦標賽(China competitive poker championship,CCPC)[10],錦標賽中引入了復式賽制[11],復式賽制就是在不同的牌桌上,同一個方位的選手發一模一樣的牌,把相同牌面下打出的成績進行匯總,看誰能打出最好的效果,這樣就完全避免了發牌的偶然性,達到競技化的目的。復式賽制的這些特點決定了二打一游戲等項目能夠被納入智力運動這一體系。但與傳統線下的比賽不同,在互聯網環境下,復式賽制尚存在一些不公平因素,例如,兩個不同方位的人很容易通過語音、視頻等方式互相告知自己的手牌,存在網上作弊的問題。同等牌力賽制不需要把同樣的牌發給每個參賽的人,而是發同樣牌力的牌,以此杜絕網絡上打相同牌帶來的作弊問題。同時,在同等牌力賽制中,用戶不再需要同時開賽,可以充分利用其碎片時間隨時參賽,也可以中途停頓,而不會影響整個競賽的過程,等完成打牌的人數滿足比賽要求時就計算排名,比復式賽制更加方便。同時,同等牌力的相關研究成果還能應用于能力評測系統。目前該項目已列入中國大學生計算機博弈大賽暨全國錦標賽競標賽中[12-14]。因此,本文擬對競技二打一比賽中的同等牌力問題進行研究。
競技二打一是一種玩法簡單、娛樂性強的3人撲克牌游戲。一局牌需3個玩家,1個玩家稱為地主,地主的逆時針第1個農民稱為下家,逆時針第2個農民稱為上家或頂家。在每一局游戲中,地主獨立存在,而其他兩名玩家以農民的身份組成一隊與地主對抗。農民隊伍只要有一人比地主先出完手中的牌,農民便可獲得游戲勝利,否則地主勝,并計算本局地主得分。
一副完整的紙牌共54張牌,由1張紅色小丑牌、1張黑色小丑牌和52張標準牌組成。52張標準牌共包括大小不同的13種牌(2、A、K、Q、J、T(10)、9、8、7、6、5、4、3),每一種牌各有4張,且大小相同。在每一輪開始時,地主將持有20張牌,其他人每人有17張牌。地主先出牌,且可以打一張牌或任何合法的組合。按逆時針順序玩家依次出牌,每個后續玩家必須要么“過”(不打牌),要么通過打出相同數量的牌和相同類型的牌的更高組合來擊敗前一個玩家。最先出完手中的所有牌的玩家為獲勝者。如果對局結束,統計此次對局每個玩家的得分。
對于競技游戲,每一場牌局可以被視為一次考試,給選手發的初始手牌可以看作考試試題。試題的區分度計算可以參照心理學著名的經典測試理論[15-16](classical test theory,CTT),在CTT框架下,通過每個試題與總測試分數的相關關系來反映試題區分度?;诖讼敕ǎ墨I[17]通過統計真人牌譜,計算初始手牌的得分均值和方差,利用得分的均值和方差劃分將初始手牌劃分為10個分類,認為同一類中的手牌具有同等牌力。然而,這種用得分均值和方差來劃分區間的分類方法存在較大的誤差,為此文獻[18]對其進行了改進,通過統計真人牌譜計算初始手牌的得分概率分布,并以得分概率分布為特征進行聚類從而將初始手牌劃分成若干個分類。然而,其仍存在兩個問題:1)通過統計不同批玩家的得分分布,來計算不同初始手牌的得分概率分布,作為該初始手牌的特征,這個方法在小樣本的情況下,由于不同批玩家統計的得分概率分布不同,實驗結果難以驗證;2)聚類個數是人為預設定的,無法在實際應用中準確地設定出準確的類別數。為解決第1個問題,本文訓練了多個不同水平的“競技二打一AI程序”,作為固定的“玩家”,打牌生成大量的牌譜,易于同等牌力的驗證;為解決第2個問題,本文提出同等牌力的選取方法。
同等牌力就是初始手牌的難度近似。本文通過等級評估指標(grade difficulty index,GDI)來表示初始手牌的難度。等級難度評估指標的含義是:假設一局牌玩完對應的得分共有k種,得分按從小到大排列,將它們看成k個等級。本文認為如果玩家能達到第i個等級,則玩家必能達到第i?1個等級,不必考慮比他低的等級。故玩家能達到第i個等級的難度就是玩家能達到第i個及其以上等級的概率。由于玩家達到第1個等級的概率是100%,所以不考慮玩家達到第1個等級的難度。等級評估指標由k?1個等級概率值組成。
定義1 等級難度評估指標。衡量一副牌難易程度的指標,記為G=(g1,g2,···,gk?1), 其中gi表示固定玩家能達到第i個及其以上等級的概率,k表示二打一規則中規定得分的數量。
定義2 具有同等牌力的初始手牌。兩副初始手牌,由同一批玩家打,得到的兩個GDI的歐氏距離小于一定閾值,則兩副初始手牌具有同等牌力。
然而,從現有的真人打牌數據中難以找到同一批玩家打若干副初始手牌的數據集,短時間內召集一批玩家打若干副初始手牌同樣不現實。因此,本文提出生成多個不同水平的“二打一AI程序”來代替真人打牌,以保證一副牌所得等級難度評估指標的可靠性。
利用“二打一AI程序”生成的大量牌譜數據,本文構建了一個可指定難度的同等牌力生成系統。同等牌力生成系統主要由4部分構成:1)訓練多個不同水平的DDZAI來產生大量牌譜;2)統計牌譜,計算每個初始手牌的等級難度評估指標;3)基于等級難度評估指標,指定1個或幾個難度作為同等牌力的中心,設定閾值,進行不同牌譜分類,即得到不同級別的同等牌力;4)驗證同等牌力生成方法的可靠性。同等牌力系統框架如圖1所示。

圖1 同等牌力系統框架Fig.1 System framework of the equal card force
筆者將真人打牌日志進行整理,依據輸贏次數進行歸類,使用文獻[19-25]中提出的競技二打一出牌算法,該算法通過真人打牌日志使用CNN模型訓練出具有似人智能的出牌策略。訓練n個不同水平的“二打一AI程序”,具體如算法1。
算法1 訓練n個不同水平的DDZAI程序
輸入 真人打牌日志;
輸出n個不同水平DDZAI程序。
1)將同一玩家的牌譜劃分到同一個牌譜集;
2)清洗掉牌譜集中數據量少于10局的牌譜集;
3)統計玩家的勝率,并按照勝率對玩家進行非遞減排序;
4)將水平接近玩家對應的牌譜集劃分到同一個DDZAI訓練集中,共分為n個訓練集,要求每個訓練集中數據量盡量均衡。
使用文獻[21]中提出的競技二打一出牌算法,分別訓練出n個具有不同水平的DDZAI程序。為了驗證用上述方法選出的n個DDZAI水平是否有差異,本文通過讓這n個DDZAI進行復式賽,其中n個DDZAI的對手相同,并組成n桌。復式賽包括m場比賽,每一場比賽包括多輪比賽來保證n桌DDZAI的地主a1,a2,···,an的排名滿足:ai的水平高于aj的水平,i 圖2 多個DDZAI不同水平的驗證方法Fig.2 Verification methods at different DDZAI levels 為了對指定難度挑選同等牌力的初始手牌,需要將每副牌難度量化為GDI,初始手牌h的GDI的計算過程為:假設一局牌玩完對應的得分共有k種可能的分值,即s1,s2,···,sk;選取n個地主DDZAI,每個地主DDZAI,與同1個下家DDZAI和1個頂家DDZAI組成1桌,共構成n桌AI牌局。為每桌分發同一副初始手牌h,對局后記錄每桌的地主得分,假設得分分別為c1,c2,···,cn, 其中cu∈{s1,s2,···,sk},u=1,2,···,n按等級排序,統計得分對應的等級次數記為l1,l2,···,lk。計算初始手牌h對應的等級難度評估指標Gh=(g1,g2,···,gk),gj的計算公式為 一般來說,gi值表示玩家能達到等級i的概率,某等級對應的值越大代表能獲勝的難度越小。如例1,Gk的難度就表示地主的獲勝的難度是0.6,出炸彈能夠勝利的難度是0.4。 若兩副初始手牌的GDI值完全相同或差距足夠小,就認為這兩副牌的難度相同,即它們具有同等牌力。等級難度評估指標的n個值之間的差距可用歐氏距離計算,計算公式為 式中兩副初始手牌的等級難度評估指標分別為G1=(g11,g12,···,g1n) 和G2=(g21,g22,···,g2n), 若d12值小于預設距離閾值,則G1與G2具有同等牌力值,否則不具有同等牌力。 系統中也可以任意地或者有目的性地指定一個難度Gc。比如一輪同等牌力比賽中決定分發一副難度中等的手牌,就可以指定Gc=(0.75,0.52,0.25),Gc的難度就表示地主獲勝的難度是0.52,出炸彈能夠勝利的難度是0.25。然后設定一個閾值,通過找出GDI與Gc的距離小于ε的初始手牌,來生成與這個難度相對應的同等牌力的牌。 為驗證同等牌力生成方法的可靠性,本文指定了n個不同水平的地主DDZAI,與相同的1個下家DDZAI和1個上家DDZAI組成n桌,作為同一批比賽選手,分別進行復式賽、同等牌力賽和隨機發牌賽。復式賽指每一輪為每桌分發相同的初始手牌。同等牌力賽是指每一輪為每桌分發不同的具有同等牌力的初始手牌。隨機發牌賽指每一輪為每桌隨機分發不同的初始手牌。 3種比賽都采用同一批選手,分別進行r場比賽,每場比賽進行m輪。每輪比賽記錄每桌DDZAI的地主得分。m輪比賽后,統計每桌DDZAI地主總得分,并記錄每桌DDZAI的地主名次。r場比賽后,統計每桌DDZAI地主獲得每個名次的概率,并以概率最大對應的名次作為地主DDZAI的排名。由于比賽選手固定,如果r場比賽后,同等牌力賽后選手排名與復式賽后選手的排名基本一致,而與隨機發牌比賽后選手的排名不一致,就表明同等牌力生成方法是有效的,同等牌力賽代替復式賽是可行的。 本文使用Intel Xeon E5-2 640 CPU,NVIDIA 2080Ti GPU和Ubuntu 16.04系統的服務器,Python語言,對所提方法進行了3個實驗。 實驗1 生成多個具有區分度的DDZAI 利用國內某著名競技二打一游戲平臺提供的7 000萬條游戲日志,使用算法1,將地主的數據集劃分為70個,分別訓練了70個地主DDZAI;另外利用下家和頂家數據,訓練了1個下家DDZAI和1個頂家DDZAI。每桌固定下家和頂家DDZAI,與不同的地主共組成70桌牌局。本文隨機選取了其中的10桌DDZAI,根據圖2所示進行復式賽。10個DDZAI獲得每個名次的概率以及每個DDZAI的排名如圖3所示。 圖3 10個DDZAI獲得每個名次的概率Fig.3 Probability of ten DDZAI winning each place 實驗結果表明:10個DDZAI在不同名次的概率值是不同的,與復式賽得出的排名基本一致,表明生成的DDZAI是具有一定區分度的。 實驗2 具有同等牌力的初始手牌測試 隨機生成20萬副3家持有的炸彈總和數為1的初始手牌,發給70桌,共生成1 400萬個牌譜,分別計算20萬副初始手牌的GDI。 本文以初始手牌Center難度GDI=(0.96,0.91,0.79)作為參照,設置參數ε=0.15,選取了5個具有不同難度的GDI,如表1所示。利用式(2),分別計算與center的距離,計算結果顯示前3個都小于0.15,這表明三者具有同等牌力。后2個計算與center的距離大于0.15,表明這兩者不具有同等牌力。 表1 5個具有不同難度的GDITable 1 Five GIDs with different difficulties 首先從手牌對應的難度值上分析同等牌力情況。手牌Center難度GDI=(0.96,0.91,0.79)表明此牌有91%的概率贏得比賽,有79%的概率出炸彈[14]并贏得比賽,對于地主來說獲勝難度很小。Center1對應的初始手牌有95%的概率贏得比賽,有95%的概率出炸彈并贏得比賽,對于地主來說獲勝難度很小。Center2獲勝的概率是97%,出炸彈并能勝利的概率為82%,對于地主來說獲勝難度小。Center3獲勝的概率是85%,出炸彈并能勝利的概率為72%,對于地主來說獲勝難度較小。Center4獲勝的概率是67.7%,出炸彈并能勝利的概率為61.8%,對于地主來說打牌難度很大。Center5獲勝的概率是100%,出炸彈并能勝利的概率為100%,對于地主來說打牌獲勝過于簡單。 對應表1生成的初始手牌事例,如表2所示,下面從牌面對這5副初始手牌的難度進行分析。 表2 生成的與center具有同等牌力的初始手牌事例Table 2 Generated initial hand case with the same force as center 第1副初始手牌:地主持有最大的3張,且地主出順子6789TJ或者56789TJ后會將農民的手牌拆散,若農民的水平不夠,只要放走地主一手小單牌或者小對子,則地主能夠出炸彈并勝利,因此第1副初始手牌符合Center的難度。 第2副初始手牌:地主持有最大的3張,且2家農民掉張過多,會放走地主的小牌,地主能夠大概率出炸彈并勝利,因此第2副初始手牌符合Center的難度。 第3副初始手牌:地主持有最大的對子,如果農民拆AAA管地主的QQ,則地主的KKK又變成最大,地主能夠大概率出炸彈并勝利,因此第3副初始手牌符合Center的難度。 第4副初始手牌:農民持有最大的對子,且地主不善于打對子,農民有控制牌權的能力,且地主小牌較多,但是地主持有KKKAAA2D大牌和炸彈,能夠大概率勝利,但是難度要高于前3副牌。 第5副初始手牌:地主持有3個3張帶單,1個炸彈,2個對子,地主必能出炸彈勝利,此手牌過于簡單,因此第5副初始手牌也不符合Center的難度。 實驗結果表明,根據不同初始手牌GDI值的相近程度,來認定哪些牌具有同等牌力的方法是可行的。 實驗3 驗證同等牌力應用于比賽的可行性 本文共選取了5桌DDZAI參加比賽,復式賽、隨機發牌賽和同等牌力賽的比賽場數都為20,一場比賽的輪數分別設置為5、10、20。選取同等牌力的初始手牌時,設置Center難度為GDI=(0.96,0.91,0.79),ε的取值分別設置為0.15、0.20、0.25。復式賽每個DDZAI獲得排名1~5的概率如表3所示。 表3 復式賽中每個DDZAI獲得前5名的概率Table 3 Probability of each DDZAI winning the first five places in a duplicate tournament 隨機發牌賽每個DDZAI獲得排名1~5的概率如表4所示,參數ε不同取值的同等牌力賽后,每個DDZAI獲得排名1~5的概率如表5所示。 表4 隨機發牌賽中每個DDZAI獲得前5名的概率Table 4 Probability of each DDZAI winning the first five places in a random licensing tournament 表5 同等牌力賽中每個DDZAI獲得前5名的概率Table 5 Probability of each DDZAI winning the first five places in the equal card force 續表5 實驗結果分析:1)對比表3、4、5,可以看出當ε= 0.15時,同等牌力賽的DDZAI排名與復式賽的DDZAI排名一致,與隨機發牌賽的DDZAI排名不一致,說明了同等牌力生成方法的可靠性;2)從表4可以看出,當ε增大時,DDZAI獲得每個名次的概率分布越均衡,評估出AI名次的難度越大,ε<0.15是合適的取值,所以ε的選擇較關鍵。3)對比表3、4、5,可以看出當ε確定時,隨著比賽輪數的增加,DDZAI獲得每個名次的概率分布沒有變化,因此增加比賽輪數不會降低同等牌力賽評估出AI名次的難度。 本文創新性地提出由多個不同水平的“二打一AI程序”來代替真人打牌,產生牌譜,生成同等牌力并進行驗證的方法,以保證實驗結果的可靠性;提出了用等級難度評估指標GDI來表示初始手牌的難度,給出了判定具有同等牌力的初始手牌的方法;通過指定DDZAI分別進行隨機發牌賽、復式賽和同等牌力賽。實驗表明,在選擇合適閾值情況下,提出的同等牌力生成方法是有效的,用同等牌力賽代替當前的復式賽是可行的。 本文提出的方法需要通過DDZAI計算每一副初始手牌的GDI,消耗的時間較多,只能將得出的具有同等牌力的初始手牌提前存儲在牌庫中用于比賽,這就需要建立一個可動態、隨機生成指定難度的初始手牌系統。本文在接下來的研究中,將對動態的“同等牌力”生成系統進行研究。
2.3 計算初始手牌的等級難度評估指標


2.4 選取具有同等牌力的初始手牌

3 實驗與分析







4 結束語