?? 國際象棋程序設(shè)計(jì)(六):局面評(píng)估函數(shù).htm
字號(hào):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://www.elephantbase.net/computer/basic_evaluation.htm -->
<HTML><HEAD><TITLE>國際象棋程序設(shè)計(jì)(六):局面評(píng)估函數(shù)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.3790.2759" name=GENERATOR></HEAD>
<BODY link=#0000ff background=國際象棋程序設(shè)計(jì)(六):局面評(píng)估函數(shù)_files/background.gif>
<DL>
<DIV align=center>
<CENTER>
<DT><FONT face=隸書 size=6>國際象棋程序設(shè)計(jì)(六):局面評(píng)估函數(shù)</FONT> </CENTER></DT></DIV>
<DIV align=center>
<CENTER>
<DT> </CENTER></DT></DIV>
<DIV align=center>
<CENTER>
<DT><FONT face="Times New Roman">Fran</FONT>ç<FONT face="Times New Roman">ois
Dominic Laram</FONT>é<FONT face="Times New Roman">e/</FONT>文
</CENTER></DT></DIV>
<DT>
<DT> 已經(jīng)六個(gè)月了,我知道你們有人覺得我不會(huì)閉嘴,但是你們錯(cuò)了,這是我的國際象棋程序設(shè)計(jì)連載的最后一篇。還有,我的<FONT
face="Times New Roman">Java</FONT>象棋程序<FONT
face="Times New Roman">(</FONT>看上去很爛<FONT
face="Times New Roman">)</FONT>已經(jīng)做好了,和這篇文章一起上傳給了<FONT
face="Times New Roman">GameDev</FONT>網(wǎng)站,這個(gè)程序還是可以驗(yàn)證這些連載內(nèi)容的。
<DT> 這個(gè)月的話題——局面評(píng)估函數(shù)——確實(shí)很特別,搜索技術(shù)大同小異,著法產(chǎn)生可以只根據(jù)規(guī)則來處理,而局面的評(píng)估則需要很深入徹底的分析。可以想象,如果我們不知道某個(gè)局面會(huì)導(dǎo)致哪方獲勝,那么評(píng)價(jià)這個(gè)局面的相對(duì)強(qiáng)弱將是不可能的。因此,很多要討論概念對(duì)于其他游戲來說就不是這么回事了,有的則根本不能用。對(duì)于你自己的游戲,考慮用什么樣的評(píng)估方法,這是你作為程序員應(yīng)該知道的。<FONT
color=#0000ff>【譯注:對(duì)于中國象棋要特別注意,很多概念不能從國際象棋照般,我寫過《中國象棋和國際象棋比較研究》一文,詳細(xì)闡述過這個(gè)問題。】</FONT>
<DT> 抓緊時(shí)間,讓我們來看一些局面評(píng)價(jià)的尺度,并且需要了解它們有什么作用。
<DT>
<DT><FONT face=楷體_GB2312 size=5><B>子力平衡</B></FONT>
<DT>
<DT> 簡單地說,子力平衡<FONT face="Times New Roman">(Material
Balance)</FONT>就是指雙方各有哪些棋子。根據(jù)象棋文獻(xiàn),后的價(jià)值是<FONT
face="Times New Roman">900</FONT>分,車<FONT
face="Times New Roman">500</FONT>,象<FONT
face="Times New Roman">325</FONT>,馬<FONT
face="Times New Roman">300</FONT>,兵<FONT
face="Times New Roman">100</FONT>,王是無價(jià)的。計(jì)算子力平衡是非常簡單的,每方的子力價(jià)值就是:
<DIV align=center>
<CENTER></DIV>
<DT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">MB = Sum (Np x Vp)</FONT> </CENTER>
<DIV></DIV>
<DT>
<DT> 這里<FONT face="Times New Roman">Np</FONT>是棋盤上這種類型的子的數(shù)目,<FONT
face="Times New Roman">Vp</FONT>是子的價(jià)值。如果你在棋盤上的子力價(jià)值比對(duì)手多,那么你的形勢好。<FONT
color=#0000ff>【說句提外話,外國人把“吃”說成“抓獲”</FONT><FONT face="Times New Roman"
color=#0000ff>(Capture)</FONT><FONT
color=#0000ff>,意思是棋子并非消失了,而是暫時(shí)退出戰(zhàn)場了,所以說子力價(jià)值時(shí)一定要強(qiáng)調(diào)“棋盤上”。】</FONT>
<DT> 看上去非常簡單是不是?但是這和象棋的局面評(píng)價(jià)還差很大距離呢。<FONT face="Times New Roman">CHESS
4.5</FONT>的作者估計(jì)了很多位置上的因素,例如機(jī)動(dòng)性和安全性差不多接近<FONT
face="Times New Roman">1.5</FONT>個(gè)兵。實(shí)際上,用不著考慮別的,這就足夠可以下出好棋了。<FONT
color=#0000ff>【注意,在把“兵值”這個(gè)概念運(yùn)用到中國象棋的時(shí)候,最好也把車設(shè)成</FONT><FONT
face="Times New Roman" color=#0000ff>500</FONT><FONT
color=#0000ff>,這時(shí)機(jī)動(dòng)性和安全性的因素就可以參考國際象棋,也不超過</FONT><FONT face="Times New Roman"
color=#0000ff>150</FONT><FONT color=#0000ff>分。具體的子力價(jià)值可參考《</FONT><A
href="http://www.elephantbase.net/other/compare2.htm" target=_blank><FONT
color=#0000ff>中國象棋和國際象棋比較研究</FONT><FONT face="Times New Roman"
color=#0000ff>(</FONT><FONT color=#0000ff>二</FONT><FONT face="Times New Roman"
color=#0000ff>)</FONT><FONT color=#0000ff>——子力價(jià)值</FONT></A><FONT
color=#0000ff>》一文。】</FONT>
<DT> 的確,有些情況下為了通過子力交換讓局面得到進(jìn)展,你必須犧牲某些棋子<FONT
face="Times New Roman">(</FONT>甚至是后<FONT
face="Times New Roman">)</FONT>。然而最好是通過搜索來發(fā)現(xiàn),例如棄后可以導(dǎo)致<FONT
face="Times New Roman">3</FONT>步殺,你的搜索函數(shù)不需要額外的代碼就會(huì)找到殺棋<FONT
face="Times New Roman">(</FONT>前提是它看得足夠深遠(yuǎn)<FONT
face="Times New Roman">)</FONT>。如果你硬是要在評(píng)價(jià)函數(shù)里寫特別的代碼,來確定是否應(yīng)該棄子,這種事情將是噩夢。
<DT> 很少有程序會(huì)用像我開始所說的那個(gè)評(píng)價(jià)函數(shù)。由于計(jì)算過于簡單,人們會(huì)在上面增加點(diǎn)東西,都是這么做的。舉一個(gè)眾所周知的例子,當(dāng)你子力上處于領(lǐng)先時(shí),交換相等的子力是有利的。交換一個(gè)兵是不錯(cuò)的選擇,因?yàn)樗鼮槟愕能囬_放棋盤,但是你必須在棋盤上保存一些兵直到殘局,以構(gòu)筑防御屏障或者升變成后。最后,如果開局庫里走出棄子的開局,你不用為程序擔(dān)心,因此你要把“藐視因子”<FONT
face="Times New Roman">(Contempt Factor)</FONT>加到子力平衡的評(píng)價(jià)中。例如當(dāng)子力落后<FONT
face="Times New Roman">150</FONT>分甚至更多時(shí),你仍然讓程序覺得是領(lǐng)先的。
<DT> 要注意,子力平衡在象棋和西洋棋里具有很高的地位,但是在黑白棋里卻是欺騙性的。的確,棋局最后你必須控制更多的格子才能贏,但是你最好在中局階段控制子的個(gè)數(shù)。在其他游戲像五子棋<FONT
color=#0000ff>【</FONT><FONT face="Times New Roman"
color=#0000ff>Go-Moku</FONT><FONT
color=#0000ff>確實(shí)應(yīng)該是五子棋,我想不出還有什么不吃子的黑白棋類了】</FONT>及其變種<FONT
face="Times New Roman"><I>N</I></FONT>子棋<FONT
face="Times New Roman">(Connect-<I>N</I>)</FONT><FONT
color=#0000ff>【具體怎么下我也不知道】</FONT>,子力平衡是不會(huì)變化的,因?yàn)槭冀K沒有被吃的子。
<DT>
<DT><FONT face=楷體_GB2312 size=5><B>機(jī)動(dòng)性和對(duì)棋盤的控制</B></FONT>
<DT>
<DT> 將死的特征之一是沒有合理的著法。直覺上,好像選擇余地越大約好,比如選手在<FONT
face="Times New Roman">30</FONT>種著法內(nèi)找出一步好棋,這種可能總要比限定在<FONT
face="Times New Roman">3</FONT>步內(nèi)高。
<DT> 在象棋中,機(jī)動(dòng)性是很好評(píng)估的 計(jì)算同一局面下每方的合理著法,你已經(jīng)能做到了<FONT
color=#0000ff>【還要復(fù)習(xí)一下《</FONT><A
href="http://www.elephantbase.net/computer/basic_movegen.htm"
target=_blank><FONT color=#0000ff>著法的產(chǎn)生</FONT></A><FONT
color=#0000ff>》嗎?】</FONT>。然而這個(gè)數(shù)字僅僅占一小部分。為什么呢?就因?yàn)楹芏嘀ㄊ锹o目的的。例如你每次讓車向后退一格,著法是合理的,但不產(chǎn)生作用。另外,不惜代價(jià)試圖限制對(duì)手的機(jī)動(dòng)性,會(huì)讓程序進(jìn)行一系列漫無目的的將軍,同時(shí)摧毀自己的防線。由于解除將軍通常只有<FONT
face="Times New Roman">3</FONT>到<FONT
face="Times New Roman">4</FONT>種合理著法,所以基于機(jī)動(dòng)性的程序會(huì)走出劣著去將軍對(duì)方,過會(huì)兒就會(huì)發(fā)現(xiàn)什么事也沒干成,并且自己的兵力也成一盤散沙了。<FONT
color=#0000ff>【我認(rèn)為這種結(jié)果的根源在于沒有把將軍著法考慮進(jìn)“靜態(tài)搜索”中,如果考慮進(jìn)去了,那么將軍的時(shí)候不做局面評(píng)價(jià),根本不存在對(duì)手機(jī)動(dòng)性很低的假象。】</FONT>
<DT> 但是,有些明智的機(jī)動(dòng)性評(píng)估方法,會(huì)起點(diǎn)作用。我的程序就“壞象”給予罰分,即象的行動(dòng)路線被一系列同色格的兵阻擋的情況,當(dāng)馬太靠近棋盤邊緣時(shí)也同樣處理。另一個(gè)例子是車,在開放或半開放線<FONT
face="Times New Roman">(</FONT>即沒有兵或只有一個(gè)兵的縱線<FONT
face="Times New Roman">)</FONT>上價(jià)值更高。
<DT> 和機(jī)動(dòng)性有密切聯(lián)系的是棋盤的控制能力。在象棋中,如果一方對(duì)某個(gè)格子產(chǎn)生攻擊的棋子數(shù)量超過對(duì)方,那么這一方就控制了這個(gè)格子。走到受控制的格子通常是安全的,走到被對(duì)方控制的格子則是危險(xiǎn)的。<FONT
face="Times New Roman">(</FONT>有一些例外,把后走到被敵方兵攻擊的格子里,不管你有多少子可以吃他的兵,這無論如何不是好主意。還有,你故意把子送到對(duì)方嘴里,但是對(duì)方有更重要的格子需要保護(hù)。<FONT
face="Times New Roman">)</FONT>在象棋中,控制中心是開局的基本目標(biāo)。但是,控制能力在某種程度上是很難計(jì)算的,它需要在任何時(shí)候都更新數(shù)據(jù)庫,來記錄棋盤上所有被攻擊的格子。很多程序都這么做,但我的沒有。
<DT> 機(jī)動(dòng)性對(duì)于象棋程序來說并不是非常重要的,但在黑白棋里卻非常重要<FONT
face="Times New Roman">(</FONT>在殘局中有很少子可走的一方會(huì)陷入很深的困境<FONT
face="Times New Roman">)</FONT>。而對(duì)圍棋而言,對(duì)棋盤的控制則是勝利的標(biāo)致。
<DT>
<DT><FONT face=楷體_GB2312 size=5><B>局勢發(fā)展</B></FONT>
<DT>
<DT> 有個(gè)教條,下象棋時(shí)輕子<FONT face="Times New Roman">(</FONT>象和馬<FONT
face="Times New Roman">)</FONT>要盡早投入戰(zhàn)斗,王要盡早易位,車和后盡量少動(dòng),直到關(guān)鍵時(shí)刻作出決定性的攻擊。這是有很多原因的,馬和象<FONT
face="Times New Roman">(</FONT>還有兵<FONT
face="Times New Roman">)</FONT>能控制中心,來支持后的火力,把它們調(diào)動(dòng)出去能為底線疏通車的路線。隨著棋局的進(jìn)行,車就可以跑到第七行<FONT
face="Times New Roman">(</FONT>即開始對(duì)對(duì)方的兵動(dòng)手<FONT
face="Times New Roman">)</FONT>,形成巨大的破壞力。
<DT> 我的程序用了一些因子來衡量局勢的發(fā)展。首先,任何王和后前沒有動(dòng)過的兵都要扣分,阻擋車的馬和象也要扣分,這樣可以讓后在其他子力出動(dòng)后才開始動(dòng),如果對(duì)手還有后,那么王易位到安全位置時(shí)則給予很大的加分<FONT
face="Times New Roman">(</FONT>有易位權(quán)但是沒有易位的也給予少量加分<FONT
face="Times New Roman">)</FONT>。
<DT> 你可以看到,局勢發(fā)展的因素在開局階段很重要,但是馬上將失去意義。在大約<FONT
face="Times New Roman">10</FONT>回合以后,要衡量的因素基本上都發(fā)生過了<FONT
color=#0000ff>【即能加分的都加了,要扣分的都扣了】</FONT>。
<DT> 注意,在西洋棋之類的游戲中,傾向于局勢發(fā)展可能很不好。事實(shí)上,先走的一方要空出后面一行的空位,這就已經(jīng)吃虧了,而在這些地方避免局勢發(fā)展,通常是不錯(cuò)的選擇。
<DT>
<DT><FONT face=楷體_GB2312 size=5><B>兵形</B></FONT>
<DT>
<DT> 象棋大師門常說,兵是象棋的靈魂。因此新手很難體會(huì)的是,強(qiáng)手在對(duì)局時(shí)會(huì)因?yàn)橐粋€(gè)兵的損失而早早認(rèn)輸。
<DT> 象棋書籍中提到很多兵的類型,有些是有利的,有些是有害的。我的程序考慮了以下幾點(diǎn)。
<DT> <FONT face="Times New Roman">1.
</FONT>疊兵或三疊兵,一方兩個(gè)或多個(gè)兵在同一列上是很壞的,因?yàn)樗鼈兊囊苿?dòng)相互阻礙了;
<DT> <FONT face="Times New Roman">2. </FONT>對(duì)兵,雙方兩個(gè)兵“頭碰頭”互相阻擋去路,會(huì)造成很大的障礙;
<DT> <FONT face="Times New Roman">3. </FONT>通路兵,當(dāng)兵進(jìn)展到不會(huì)有對(duì)方兵攻擊或阻礙時(shí)<FONT
color=#0000ff>【即同一列和相鄰列里都不能有對(duì)方的兵】</FONT>,就會(huì)變得非常強(qiáng)大,因?yàn)樗鼈兏菀椎竭_(dá)底線實(shí)現(xiàn)升變;
<DT> <FONT face="Times New Roman">4. </FONT>孤兵,兩邊都沒有同伴兵保護(hù)的兵,最容易受到攻擊,最需要尋求保護(hù);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -