曹風(fēng)云,趙衛(wèi)華
(1.合肥師范學(xué)院 計(jì)算機(jī)學(xué)院,合肥 230601;2.合肥師范學(xué)院 電子信息系統(tǒng)仿真設(shè)計(jì)安徽省重點(diǎn)實(shí)驗(yàn)室,合肥 230601)
針對(duì)當(dāng)前博弈比賽中的五子棋博弈平臺(tái)[1-8]諸多問(wèn)題,為五子棋算法設(shè)計(jì)實(shí)現(xiàn)一個(gè)完善的比賽平臺(tái)、平臺(tái)調(diào)用算法的接口及實(shí)現(xiàn)此接口的五子棋算法引擎。實(shí)現(xiàn)的五子棋算法運(yùn)行平臺(tái)能夠全程在沒(méi)有人工干預(yù)的情況下調(diào)用五子棋算法引擎完成多類別比賽規(guī)則的自動(dòng)對(duì)局。支持指定開(kāi)局、三手交換、五手N打、禁手等規(guī)則,另外具有控制對(duì)局的暫停、繼續(xù)與強(qiáng)制結(jié)束等功能,并附有多步悔棋的功能,同時(shí)開(kāi)啟限時(shí),可以在平臺(tái)界面實(shí)時(shí)顯示棋手單步和單局的耗時(shí),也可以保存和加載平臺(tái)保存的棋局文件恢復(fù)對(duì)局。另外,平臺(tái)具有簡(jiǎn)易的引擎接口函數(shù)并提供對(duì)應(yīng)的API、引擎框架及示例引擎,通過(guò)這些可以極大方便快速編寫出在此平臺(tái)下運(yùn)行的五子棋算法引擎。
采用Java作為平臺(tái)編寫語(yǔ)言,可選Java、C或 C++ 作為算法引擎的編寫語(yǔ)言,采用JavaFX作為平臺(tái)界面的編寫框架,采用Maven作為此項(xiàng)目的構(gòu)建工具。另外,使用dom4j解析引擎配置文件,使用fastjson讀取存儲(chǔ)棋局、平臺(tái)設(shè)置,使用JNA調(diào)用動(dòng)態(tài)鏈接庫(kù)中的函數(shù)。
設(shè)計(jì)主要分為平臺(tái)、引擎和公共類3部分,引擎可選Java、C或C++作為編寫語(yǔ)言,每個(gè)部分具有一個(gè)獨(dú)立的項(xiàng)目。平臺(tái)部分負(fù)責(zé)選擇對(duì)局引擎、設(shè)置五子棋對(duì)局規(guī)則、發(fā)送規(guī)則至引擎、計(jì)時(shí)、接收與發(fā)送引擎落子、判定引擎落子、控制對(duì)局等,引擎部分需要實(shí)現(xiàn)平臺(tái)調(diào)用引擎的接口,除了平臺(tái)內(nèi)已有的引擎,開(kāi)發(fā)者可以根據(jù)平臺(tái)的接口實(shí)現(xiàn)自己的引擎。引擎根據(jù)平臺(tái)發(fā)送的棋規(guī)及接收平臺(tái)發(fā)送過(guò)來(lái)的對(duì)方的落子或者整個(gè)棋局的所有落子決策出一個(gè)優(yōu)勢(shì)落子作為引擎執(zhí)子方的落子。公共類部分是將平臺(tái)與Java編寫的引擎中存在的都需要或者可以使用的類抽取出來(lái)單獨(dú)作為一個(gè)項(xiàng)目存在,在平臺(tái)及引擎的項(xiàng)目中引入項(xiàng)目作為依賴。這樣既簡(jiǎn)化引擎接口的參數(shù)及返回類型,也方便平臺(tái)直接調(diào)用引擎中的函數(shù),提高了調(diào)用引擎的性能。平臺(tái)架構(gòu)如圖1所示。
圖1 博弈平臺(tái)架構(gòu)
界面采用JavaFX作為編寫框架,除棋盤面板外,其他面板均使用fxml來(lái)編寫界面達(dá)到快速編寫界面的目的且方便修改,另外使用CSS來(lái)渲染界面也達(dá)到美化的作用。主界面如圖2所示。
圖2 平臺(tái)主界面
平臺(tái)啟動(dòng)時(shí)會(huì)將各面板的。fxml文件加載到內(nèi)存并進(jìn)行唯一一次初始化,任何一個(gè)面板對(duì)應(yīng)的。fxml文件都需要一個(gè)對(duì)應(yīng)的控制類,通過(guò)這個(gè)控制類一方面實(shí)現(xiàn)各個(gè)界面的初始化與控件的調(diào)整和變化,另一方面與整個(gè)平臺(tái)運(yùn)行的邏輯控制類實(shí)現(xiàn)數(shù)據(jù)交互與傳遞。
棋盤面板不借助fxml來(lái)實(shí)現(xiàn)界面顯示,完全通過(guò)一個(gè)專門的類來(lái)達(dá)到目的。在這個(gè)類中利用JavaFX中的畫布與圖形上下文來(lái)實(shí)現(xiàn)繪制網(wǎng)格和棋子。通過(guò)堆棧來(lái)順序存儲(chǔ)落子,方便實(shí)現(xiàn)撤回操作也方便獲取最后的一個(gè)落子,從而方便在界面中體現(xiàn)棋手的最后一個(gè)落子。
從點(diǎn)擊右面板的“新一局”按鈕到對(duì)局結(jié)束的簡(jiǎn)化流程如下:
創(chuàng)建雙方棋手對(duì)象
檢查規(guī)則
if(時(shí)間限制){
創(chuàng)建新的計(jì)時(shí)線程計(jì)時(shí)
while(未超時(shí)){
時(shí)間累加、更新界面時(shí)間顯示
}
to "end step"
}
創(chuàng)建新的對(duì)局線程
if(正式比賽規(guī)則){
向棋手請(qǐng)求五手N打打點(diǎn)數(shù)、請(qǐng)求開(kāi)局落子
等待開(kāi)局落子后,向另一個(gè)棋手發(fā)送開(kāi)局落子并
請(qǐng)求是否進(jìn)行三手交換
if(交換){
執(zhí)行交換過(guò)程
} else {
請(qǐng)求白四落子
}
請(qǐng)求黑五的幾個(gè)落子
while(黑五落子無(wú)效){
請(qǐng)求黑五的幾個(gè)落子
}
將黑五的所有落子發(fā)送給白手并獲取黑五的實(shí)際落子
通知黑手黑五實(shí)際落子
while(未定勝負(fù)){
輪流向白黑手請(qǐng)茫落子
while(落子無(wú)效){
通知棋手棋子無(wú)效、同時(shí)請(qǐng)求新的落子
}
}
} else {
while(落子總數(shù)<9){
輪流向黑白手請(qǐng)求落子
while(落子無(wú)效){
通知棋手棋子無(wú)效、同時(shí)請(qǐng)求新的落子
}
}
while(未定勝負(fù)){
向下一個(gè)落子棋手請(qǐng)求落子
while(落子無(wú)效){
通知棋手棋子無(wú)效、同時(shí)請(qǐng)求新的落子
}
}
}
end step: 停止向棋手請(qǐng)求落子、提示結(jié)束本局、保存結(jié)束信息、銷毀相關(guān)對(duì)象等
點(diǎn)擊“新一局”按鈕后,利用平臺(tái)控制器中的監(jiān)聽(tīng)器通知棋盤面板控制器開(kāi)始新的一局,調(diào)用當(dāng)前對(duì)局狀態(tài)類中相應(yīng)函數(shù)恢復(fù)對(duì)局狀態(tài)類至新的一局初始狀態(tài);調(diào)用棋手庫(kù)類中創(chuàng)建棋手對(duì)象的函數(shù)依據(jù)當(dāng)前選定的黑白手棋手創(chuàng)建對(duì)應(yīng)的棋手對(duì)象;檢查棋規(guī),根據(jù)棋規(guī)決定是調(diào)用引擎中還是由棋手手動(dòng)選擇五手N打數(shù)量及開(kāi)局落子;利用監(jiān)聽(tīng)器通知UI控制器開(kāi)始新的一局,更新界面的一些控件狀態(tài),通過(guò)創(chuàng)建并啟動(dòng)一個(gè)GameThread線程對(duì)象來(lái)不斷進(jìn)行黑白手輪流落子;最后利用log4j輸出開(kāi)始新一局的通知信息。右面板接收到開(kāi)始新的一局的通知時(shí),會(huì)先更新相關(guān)控件的狀態(tài),根據(jù)是否限時(shí)設(shè)置右面板顯示時(shí)間的控件及設(shè)置計(jì)時(shí)類是否工作的標(biāo)志。在GameThread中使用JDK API中的ExecutorService配合Future來(lái)獲取棋手函數(shù)的執(zhí)行結(jié)果。
平臺(tái)目前可加載實(shí)現(xiàn)平臺(tái)引擎規(guī)范和接口的.jar、.dll、.so文件。其中后兩者通過(guò)C/C++編寫項(xiàng)目并導(dǎo)出成.dll或.so文件,前者是利用Maven將Java引擎項(xiàng)目打包的.jar文件。
對(duì)于.jar格式引擎,需要一個(gè)專門的Java引擎加載器來(lái)加載并創(chuàng)建對(duì)應(yīng)的引擎對(duì)象。引擎加載器首先獲取.jar文件中保存引擎配置信息文件EngineConfigs.xml的文件輸入流,接著使用dom4j解析文件生成所有的引擎配置信息對(duì)象。因?yàn)橐粋€(gè).jar引擎文件中的EngineConfigs.xml文件可能存儲(chǔ)多個(gè)引擎配置信息,所以一個(gè).jar文件可以被解析出多個(gè)可用的引擎配置信息。使用URLClassLoader類加載器加載引擎配置信息中存儲(chǔ)的引擎入口類并得到對(duì)應(yīng)的Class對(duì)象,并利用此Class對(duì)象和反射創(chuàng)建該引擎入口類的對(duì)象,因?yàn)槠脚_(tái)與引擎的項(xiàng)目都依賴公共類項(xiàng)目定義的棋手基類,所以平臺(tái)可以直接調(diào)用Jar引擎中引擎類的函數(shù)無(wú)需通過(guò)反射進(jìn)行間接調(diào)用。
對(duì)于動(dòng)態(tài)鏈接庫(kù)格式引擎,規(guī)定動(dòng)態(tài)鏈接庫(kù)文件名必須規(guī)范化將其表示的引擎配置信息體現(xiàn)在其中,平臺(tái)通過(guò)解析文件名生成對(duì)應(yīng)的引擎配置信息,平臺(tái)通過(guò)此配置信息創(chuàng)建DllEngine類來(lái)表示動(dòng)態(tài)鏈接庫(kù)格式的引擎。具體來(lái)說(shuō)需要?jiǎng)?chuàng)建一個(gè)接口繼承com.sun.jna.Library類,在接口中添加動(dòng)態(tài)鏈接庫(kù)中需要被調(diào)用的函數(shù)的聲明,函數(shù)名必須與動(dòng)態(tài)鏈接庫(kù)中被調(diào)用的函數(shù)名完全一致。平臺(tái)調(diào)用DllEngine中接口函數(shù),DllEngine再調(diào)用接口中對(duì)應(yīng)的函數(shù),JNA在底層會(huì)自動(dòng)調(diào)用動(dòng)態(tài)鏈接庫(kù)中相應(yīng)函數(shù)。這樣就實(shí)現(xiàn)平臺(tái)調(diào)用外置C++引擎函數(shù)的目的。
因?yàn)镴ava與C/C++在數(shù)據(jù)類型上無(wú)法通用,如果平臺(tái)直接把表示棋手落子的對(duì)象作為參數(shù)傳遞給動(dòng)態(tài)鏈接庫(kù)引擎中的函數(shù),函數(shù)是無(wú)法識(shí)別的,導(dǎo)致無(wú)法成功調(diào)用對(duì)應(yīng)函數(shù)的。所以在平臺(tái)內(nèi)和平臺(tái)外都需要對(duì)函數(shù)的參數(shù)類型和執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)化,轉(zhuǎn)化的結(jié)果使兩者都可以識(shí)別,在已發(fā)布的C/C++引擎接口項(xiàng)目中具有相應(yīng)的函數(shù)直接供調(diào)用。上述過(guò)程如圖3所示。
圖3 平臺(tái)與外置動(dòng)態(tài)鏈接庫(kù)引擎交互
平臺(tái)內(nèi)外都有一個(gè)實(shí)現(xiàn)引擎接口的引擎框架,在此框架的基礎(chǔ)上,可以減少算法外其他代碼的編寫,縮短編寫算法的時(shí)間,同時(shí)也減少實(shí)現(xiàn)引擎接口函數(shù)的數(shù)量。內(nèi)外引擎中的引擎框架在結(jié)構(gòu)和邏輯上是一樣的。引擎框架的架構(gòu)如圖4所示。
圖4 引擎框架架構(gòu)
在架構(gòu)中,BaseEngine預(yù)先實(shí)現(xiàn)好平臺(tái)規(guī)定的接口函數(shù),轉(zhuǎn)而只預(yù)留一個(gè)生成下一步落子的函數(shù)需要繼承BaseEngine的類去手動(dòng)實(shí)現(xiàn)。在自己實(shí)現(xiàn)的引擎類中可以覆蓋BaseEngine中接口函數(shù)中的獲取五手N打打點(diǎn)數(shù)的函數(shù)、獲取開(kāi)局落子的函數(shù)、獲取黑手引擎第五手的所有落子的函數(shù)和決定對(duì)方第五手落子的函數(shù)。BaseAnalyzer負(fù)責(zé)分析棋局產(chǎn)生值得落子、對(duì)我方具有威脅和我方有利的位置。BaseEvaluator負(fù)責(zé)對(duì)棋局上某個(gè)位置和整個(gè)棋局進(jìn)行評(píng)估。PredictedBoard表示預(yù)測(cè)的落子產(chǎn)生的新的棋局。BaseSearch負(fù)責(zé)搜索棋局,并將產(chǎn)生最佳落子發(fā)送給引擎。最后平臺(tái)通過(guò)接口函數(shù)獲取引擎的落子。
當(dāng)接收到平臺(tái)發(fā)送過(guò)來(lái)的對(duì)方落子,首先根據(jù)存儲(chǔ)的所有落子列表,生成一個(gè)棋局狀態(tài),即BoardState對(duì)象,這個(gè)棋局狀態(tài)除了用一個(gè)二維數(shù)組來(lái)表示當(dāng)前的棋子分布情況,還需要用一個(gè)填滿64位隨機(jī)整數(shù)的三維數(shù)組,三維數(shù)組可看成由2層大小為15×15的二維數(shù)組組成,兩層分別表黑白棋,該數(shù)組就是Zobrist數(shù)組,另外還需要一個(gè)64位隨機(jī)值來(lái)唯一表示當(dāng)前棋局,可稱這隨機(jī)值為當(dāng)前棋局的ID。每下一步棋,則用當(dāng)前ID異或Zobrist數(shù)組里對(duì)應(yīng)位置的隨機(jī)數(shù),得到的結(jié)果即為新的ID。如果是刪除棋子或悔棋,則再異或一次即可。使用過(guò)Zobrist數(shù)組方便后面使用Zobrist緩存。生成棋局后,還需要給將當(dāng)前的棋局發(fā)送給棋盤分析器、估值類及博弈樹(shù)搜索引擎。另外還需要一個(gè)四維數(shù)組表示每個(gè)位置周圍落子情況。因?yàn)榭梢曰诳蚣芑A(chǔ)上實(shí)現(xiàn)的示例引擎,所以引擎中的棋局表示工作在框架中已經(jīng)做好了。
算法開(kāi)始下子初,首先調(diào)用棋盤分析器分析棋局的形式。從棋盤的[A,1]位置開(kāi)始分析每個(gè)位置周圍的落子來(lái)填充那個(gè)表示每個(gè)位置周圍落子情況的四維數(shù)組,同時(shí),如果位置有落子,分析位置對(duì)我方及對(duì)方的有利及威脅程度,如對(duì)方的活三、沖四等,我方的活四、沖四、活三等。如果滿足條件,將對(duì)應(yīng)棋型的對(duì)策落子添加到一個(gè)列表中,并為之形成的新的預(yù)測(cè)棋局設(shè)置一個(gè)初始估值,分析完棋盤后直接將該列表返回做下一步處理。如果沒(méi)有上述棋型,再接著分析棋局上值得的落子的地方,這些地方首先一定是空位置并且不能離有落子地方太遠(yuǎn),否則要么落子無(wú)效要么落子的意義不是很大還會(huì)增大計(jì)算時(shí)間,只要分析以某個(gè)棋子為中心,周圍2個(gè)棋子范圍內(nèi)的位置即可。
對(duì)每個(gè)值得分析的位置,需要評(píng)估出該位置的分?jǐn)?shù),等對(duì)棋盤上所有值得的位置做出評(píng)估得到對(duì)應(yīng)分?jǐn)?shù)后,默認(rèn)使用啟發(fā)式搜索,即將它們的評(píng)分從高到低進(jìn)行排序,認(rèn)為分?jǐn)?shù)越高對(duì)我方越有利就越先搜索,但是這個(gè)有利并不是絕對(duì)的。最后將得到的新的順序的落子產(chǎn)生的對(duì)應(yīng)預(yù)測(cè)棋局返回,到這里棋局分析的工作完成。同樣自己實(shí)現(xiàn)的引擎可以直接調(diào)用這一部分的函數(shù),也可以通過(guò)重寫框架中的棋局分析函數(shù)實(shí)現(xiàn)自己的棋局功能。
平臺(tái)中的默認(rèn)引擎在上述框架的基礎(chǔ)上進(jìn)行編寫的,引擎以廣泛使用的α-β剪枝算法為搜索博弈樹(shù)的基礎(chǔ)算法,并加上迭代加深、啟發(fā)式搜索、Zobrist緩存這些優(yōu)化方法,結(jié)構(gòu)如圖5所示。
圖5 示例引擎結(jié)構(gòu)
2.5.1 估 值
對(duì)棋盤上某個(gè)位置估值時(shí),在分析有利威脅落子的時(shí)候,對(duì)應(yīng)的預(yù)測(cè)棋型根據(jù)產(chǎn)生棋局的棋子是活四、沖四還是活三分別設(shè)置固定的分?jǐn)?shù)。但是在分析值得落子位置時(shí),使用另一種估值的方法。
方法簡(jiǎn)單來(lái)說(shuō)根據(jù)當(dāng)前被評(píng)估位置某個(gè)方向能形成連五的數(shù)量來(lái)評(píng)估該位置的分?jǐn)?shù)。如圖6所示,當(dāng)前的執(zhí)子顏色是黑色。估值開(kāi)始時(shí),獲取某位置某方向棋子數(shù)組的第i(1 >=i>=5)個(gè)棋子,然后再獲取該棋子后面的j(i+1 <=j<=i+4)棋子,根據(jù)是空位置還是當(dāng)前分析的棋手執(zhí)子顏色,如果是的,對(duì)應(yīng)的計(jì)數(shù)加一,再獲取j+1棋子顏色,重復(fù)上述操作,直到j(luò)+4棋子結(jié)束,如果空位置的數(shù)量和我方顏色為數(shù)量之和為5,則進(jìn)行一次計(jì)分,否則必定有對(duì)方棋子摻雜進(jìn)來(lái)一定無(wú)法構(gòu)成連五,所以不進(jìn)行計(jì)分。再獲取該方向棋子數(shù)i+2棋子,接著重復(fù)上述操作直至第五個(gè)棋子結(jié)束。如果是對(duì)方的棋子顏色,不用再繼續(xù)獲取下一個(gè)棋子,直接獲取方向棋子數(shù)i+2棋子,接著重復(fù)上述操作直至第五個(gè)棋子結(jié)束。
圖6 估值計(jì)分
2.5.2 基于啟發(fā)式α-β搜索算法
α-β剪枝搜索和剪枝與子節(jié)點(diǎn)的排列順序有關(guān)。在MAX層節(jié)點(diǎn)的值是子節(jié)點(diǎn)中的最大值,按節(jié)點(diǎn)值從大到小的順序排列MIN層節(jié)點(diǎn)的話,計(jì)算第一個(gè)MIN層節(jié)點(diǎn)后會(huì)更新其父節(jié)點(diǎn)即MAX層的最大下屆,如果在計(jì)算后面MIN層更新其最小上屆的值比其父節(jié)點(diǎn)MAX層的最大下屆還要小,那么該MIN層后面的節(jié)點(diǎn)就沒(méi)有繼續(xù)搜索下去的必要了,因?yàn)镸IN層最大值都比MAX層的最小值還要小,直接觸發(fā)剪枝,沒(méi)有必要在繼續(xù)搜索下去。同理MAX層按子節(jié)點(diǎn)值從小到大排列也會(huì)有同樣的效果。
如圖7中,第二層中的B和C節(jié)點(diǎn),按照現(xiàn)在的順序排列,因?yàn)锽節(jié)點(diǎn)的值3比較小,更新父節(jié)點(diǎn)A的最大下屆為3,而節(jié)點(diǎn)C第一個(gè)子節(jié)點(diǎn)的值是6比3大,還要繼續(xù)計(jì)算下一個(gè)子節(jié)點(diǎn)的值,也就是需要完整計(jì)算第二層C節(jié)點(diǎn)的所有子節(jié)點(diǎn)。如果將它們互換位置,因?yàn)榈谝粋€(gè)節(jié)點(diǎn)B的值6比3大,計(jì)算完后更新父節(jié)點(diǎn)A的最小下屆為6,計(jì)算C節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)后更新C節(jié)點(diǎn)的最大下屆為5,比父節(jié)點(diǎn)A的最大下屆還要小,那么C節(jié)點(diǎn)后面的子節(jié)點(diǎn)就沒(méi)有繼續(xù)搜素計(jì)算下去的必要了,觸發(fā)了剪枝。所以,α-β剪枝的效率和節(jié)點(diǎn)排序有很大關(guān)系,如果最優(yōu)的節(jié)點(diǎn)能排在前面,則能大幅提升剪枝效率。
圖7 α-β剪枝
但是節(jié)點(diǎn)的值是通過(guò)遞歸計(jì)算出來(lái)的,也就是在之前是無(wú)法精確對(duì)節(jié)點(diǎn)進(jìn)行排序的,對(duì)節(jié)點(diǎn)做出一個(gè)大致的排序。在博弈樹(shù)中,每個(gè)節(jié)點(diǎn)代表一個(gè)預(yù)測(cè)的棋局,節(jié)點(diǎn)的值是該棋局的評(píng)分,所以對(duì)節(jié)點(diǎn)排序時(shí),可以根據(jù)產(chǎn)生棋局的落子的評(píng)分進(jìn)行排序,雖然只是一個(gè)大概的排序,但是會(huì)很好的提升搜索的速度和剪枝的效率。在每次分析完棋局后,首先將值得落子的評(píng)分臨時(shí)設(shè)置為落子對(duì)應(yīng)的預(yù)測(cè)棋局評(píng)分,因?yàn)椴捎秘?fù)極大值的α-β剪枝搜索,所以這里將棋局按照其評(píng)分從大到小進(jìn)行排序得到一個(gè)新的預(yù)測(cè)棋局列表,再將這個(gè)列表送至搜索引擎使用α-β剪枝進(jìn)行搜索。
建立了通用五子棋博弈平臺(tái)。采用Java作為平臺(tái)主體的編寫語(yǔ)言,并附有Java和C/C++編寫的引擎接口。研究結(jié)果表明:
(1)與現(xiàn)有的博弈平臺(tái)相比,使用者只需將自己編寫的引擎文件拷貝到自動(dòng)被加載的目錄或者通過(guò)平臺(tái)菜單欄中的“加載引擎”按鈕即可實(shí)現(xiàn)加載引擎。
(2)平臺(tái)即可代替人工全自動(dòng)進(jìn)行五子棋算法間的對(duì)局,且提供調(diào)用引擎的接口和引擎設(shè)計(jì)的參考,及方便快速編寫出自己的五子棋算法引擎,也方便操作。且平臺(tái)完全支持正式五子棋比賽使用的禁手、指定開(kāi)局、三手交換等規(guī)則,在各類計(jì)算機(jī)博弈比賽五子棋賽中也具有較好的實(shí)用性。
參考文獻(xiàn)(References):
[1] 李卓軒,李媛,冉冠陽(yáng),等.基于PVS搜索算法的亞馬遜棋博弈系統(tǒng)的設(shè)計(jì)[J].智能計(jì)算機(jī)與應(yīng)用,2018,8(5):92—94
LI Z X,LI Y,RAN G Y,et al.Amazons Game System Based on PVS Search Algorithm[J].Intelligent Computer and Application,2018,8(5):92—94(in Chinese)
[2] 郭琴琴,李淑琴,包華.亞馬遜棋機(jī)器博弈系統(tǒng)中評(píng)估函數(shù)的研究[J].計(jì)算機(jī)工程與應(yīng)用,2012,48(34):50—54
GUO Q Q,LI S Q,BAO H.Research on Evaluation Function Computer Game of Amazon.Computer Engineering and Applications,2012,48(34):50—54(in Chinese)
[3] 涂智豪.人工智能五子棋系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].廣州:華南理工大學(xué),2016
TU Z H.System Design and Implementation of Gobang Artificial Intelligence[D].Guangzhou:South China University of Technology,2016(in Chinese)
[4] 王驕,徐心和.計(jì)算機(jī)博弈:人工智能的前沿領(lǐng)域—全國(guó)大學(xué)生計(jì)算機(jī)博弈大賽[J].計(jì)算機(jī)教育,2012,163(7):14—18
WANG J,XU X H.Computer Game:The Frontier of Artificial Intelligence:National University Student Computer Game Contest[J].Computer Education,2012,163(7):14—18(in Chinese)
[5] 張明亮,吳俊,李凡長(zhǎng).五子棋機(jī)器博弈系統(tǒng)評(píng)估函數(shù)的設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用,2012,32(7):1969—1972
ZHANG M L,WU J,LI F Z.Design of Evaluation-function for Computer Gobang Game System[J].Journal of Computer Applications,2012,32(7):1969—1972(in Chinese)
[6] 王云霞.智能五子棋博弈算法研究[J].江蘇技術(shù)師范學(xué)院學(xué)報(bào),2013(2):62—66
WANG Y X.The Algorithm Research of Intelligent Gobang Playgame[J].Journal of Jiangsu Teachers University of Technology,2013(2):62—66(in Chinese)
[7] 李虎陽(yáng),羅旭,常永虎.基于可信度的多次重復(fù)博弈研究[J].重慶工商大學(xué)學(xué)報(bào)(自然科學(xué)版),2016,33(1):70—72
LI H Y,LUO X,CHANG Y H.Research on Multiple Repeat Games Based on Credibility[J].Journal of Chongqing Technology and Business University(Natural Science Edition),2016,33(1):70—72(in Chinese)
[8] 周代平,李康奇,賀琳.誘導(dǎo)信息條件下車輛路徑選擇:基于有限理性模糊博弈[J].重慶工商大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,32(12):31—35
ZHOU D P,LI K Q,HE L.Research on the Model of Vehicle Routing Choice Based on the Condition of the Bounded Rationality Fuzzy Game with Inducing Information[J].Journal of Chongqing Technology and Business University(Natural Science Edition),2015,32(12):31—35(in Chinese)
重慶工商大學(xué)學(xué)報(bào)(自然科學(xué)版)2021年2期