• 沒有找到結果。

五、 電腦象棋

5.2 人工智慧演算法

我們知道電腦象棋之所以會思考主要是依賴核心的評估函數,而評估函數主要的功 用在於評估盤面的敵我情勢,透過評估值可以判斷目前的局勢消長,以決定下一步棋的 走法,其中影響評估函數的估計結果,主要有下列三項:

1. 棋子的價值

棋子的價值是評估局勢最簡單的方法,高手讓對手雙馬或一車來平衡雙方的棋力,

就是最好的說明,我們可以看看前人怎麼來設計,應該特別注意的是,象棋的規則勝負 在於看誰先吃掉對方的主帥,所以將(帥)的重要性最大但他的價值並不高,我們引用的 人工智慧程式其棋子的價值如下所示:

// 將 士 象 馬 車 炮 兵

const base[7] = {300 ,300 ,300 ,500 , 850 ,500 ,300}; //平均價值

const range[7] = { 0 , 0, 0, 20, 10, 0 , 40}; //價值的變動範圍 const int BV1[7] = { //計算基本價值

base[0]-base[0]*range[0]/100, base[1]-base[1]*range[1]/100, base[3]-base[2]*range[2]/100, base[3]-base[3]*range[3]/100, base[4]-base[4]*range[4]/100, base[5]-base[5]*range[5]/100, base[6]-base[6]*range[6]/100 };

2. 棋子的棋盤位置價值

在象棋的開局裡,比賽雙方通常會儘速的將車馬包移到重要位置上,尤其是車一定 要搶住重要的線,可見棋盤位置對局勢的影響。在為位置評分時,可以為每個不同的棋 子設計一個二維陣列,用以記錄棋盤上每一個位置的重要性,下面是兵(卒)在棋盤位 置的價值設定例子。

//兵卒在不同位置的價值,數位越大價值越高 const int ManBPlus[2][12][11]={

{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0}, { 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0}, { 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0}, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, { 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, { 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0}, { 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0}, { 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} } };

3. 棋子在棋盤位置上的靈活度

在棋盤裡,每一種棋子都有它自己的走法與可走的範圍,如果在下棋的過程中,讓 棋子的可走範圍限制變很多,將會使棋子的平均價值降低,所以在評估局勢時,棋子的 靈活度也是考慮的因素,下面是棋子在棋盤位置上的靈活度例子。

// 將 士 象 馬 車 炮 兵 const base[7]= {300,300,300,500, 850,500,300}; //平均價值

const range[7]= {0 , 0, 0, 20, 10, 0, 40}; //價值的變動範圍 const int BV2[7]=//計算靈活度

{

2*base[0]*range[0]/100/4, 2*base[1]*range[1]/100/4, 2*base[2]*range[2]/100/4, 2*base[3]*range[3]/100/8, 2*base[4]*range[4]/100/17, 2*base[5]*range[5]/100/17, 0,

};

前述是影響評估函數估計結果的三個主要因素,接下來我們說明遊戲樹與搜尋方 法。下象棋時,棋力越高的人,就能看到越遠的步數,一個能看到十三步以後的棋手,

比一個只能看到五步棋手的棋力肯定要高。在電腦象棋中可藉由建立遊戲樹來達到往前 看的能力。如圖 25 所示。

圖 25 遊戲樹範例

當建立好遊戲樹之後,可用廣度搜尋或深度搜尋最佳的走法,為使搜尋的速度加 快,通常會以廣度搜尋先搜尋到某個深度之後,再針對幾個重要走法做深度搜尋。要特 別注意的是,評估函數設計得越精準棋力固然越高,但是越精準的評估函數需要越久的 計算時間,因為評估函數對遊戲樹的每一個結點都會以遞廻的方式呼叫自己一次,如果 評估函數計算太久,在有限時間內,遊戲樹就不能建立太多層,這將影響到電腦的棋力,

因此如何取得一個平衡,就需靠經驗了。

因為象棋的變化很多,如果對所有可能的走法都要建立遊戲樹,那麼遊戲樹將會變 得非常龐大,所以需利用修減演算法來限制遊戲樹的大小,目前配合 Min-Max Tree 最 常用的當屬 Alpha-Beta 修減法[9],我們使用的也是此種方法。

A

B C I

B1 B2 B3 B4 C1 C2 C3

輪到紅方下棋的遊戲樹

炮二進四

俥五進二

兵三進一

六、 實作結果

本章將呈現實作的結果,我們以 Fly3d v.102 三維電腦遊戲引擎作為系統開發平台,並以 C++物件導向語言及 OpenGL 實作出完整的三維電腦象棋程式,在設備為 P4-3.2G , RAM 512MB 的 PC 平台上,測試我們的結果,測試的影像大小為 800x600,實作結果 說明如下。

圖 26 是 PR Silhouette 的場景執行速率約 29 FPS,圖 27 是柳葉描技法模擬左邊範 例、右邊模擬結果,圖 28 是減筆描技法模擬左邊範例、右邊模擬結果,圖 29 是竹葉描 技法模擬左邊範例、右邊模擬結果,圖 30 是琴弦描技法模擬左邊範例、右邊模擬結果,

圖 31 是棗核描技法模擬左邊範例、右邊模擬結果,圖 32 是綜合技法模擬,表 7 為各種 繪圖狀態之執行速率表列,表 8 表列為我使用模型的頂點數量、三角面數量及場景物件 總數量、頂點總數量與三角面總數量。

圖 26 PR Silhouette 場景

圖 27 柳葉描模擬(stroke_mode = 0)

圖 28 減筆描模擬(stroke_mode = 1)

圖 29 竹葉描模擬(stroke_mode = 2)

圖 30 琴弦描模擬(stroke_mode = 3)

圖 31 棗核描模擬(stroke_mode = 4)

圖 32 綜合技法模擬(stroke_mode = 5)

表 7 執行速率表列

影像大小 800 x 600

State A State B State C State D 平均速率

PR Silhouette 場景 29 FPS 無 無 無 無

NPR 靜態場景 1~4 FPS 無 無 59 FPS >20FPS

NPR 動態場景 1~4 FPS 1~4 FPS 1~4 FPS 59 FPS >11FPS

表 8 場景與模型的三角面與頂點數量

頂點數量 三角面數量

將 429 729

士 519 862

象 290 572

車 1389 2426

馬 840 1445

包 413 672

(A : 動畫模型)

505 A : 1028

875 A:1606

場景總計 :

物件數量 127

頂點總數 21604 (A : 24219)

三角面總數 37388 (A : 41043)

相關文件