?? 解剖大象的眼睛——中國象棋程序設計探索(八):后臺思考和時間策略.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0054)http://www.elephantbase.net/computer/eleeye_ponder.htm -->
<HTML><HEAD><TITLE>解剖大象的眼睛——中國象棋程序設計探索(八):后臺思考和時間策略</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.3790.536" name=GENERATOR></HEAD>
<BODY background=解剖大象的眼睛——中國象棋程序設計探索(八):后臺思考和時間策略_files/background.gif>
<DL>
<DIV align=center>
<CENTER>
<DT><FONT face=隸書 size=6>解剖大象的眼睛</FONT><FONT
size=6><STRONG>——</STRONG></FONT><FONT face=隸書 size=6>中國象棋程序設計探索</FONT>
</CENTER></DT></DIV>
<DIV align=center>
<CENTER>
<DT> </CENTER></DT></DIV>
<DIV align=center>
<CENTER>
<DT>黃晨 <FONT face="Times New Roman">*</FONT> <FONT
face="Times New Roman">2005</FONT>年<FONT
face="Times New Roman">6</FONT>月初稿,<FONT
face="Times New Roman">2005</FONT>年<FONT face="Times New Roman">11</FONT>月修訂
</CENTER></DT></DIV>
<DIV align=center>
<CENTER>
<DT><FONT face="Times New Roman">( * </FONT>聯系地址:復旦大學化學系表面化學實驗室,<FONT
face="Times New Roman">eMail</FONT>:<A
href="mailto:webmaster@elephantbase.net"><FONT
face="Times New Roman">webmaster@elephantbase.net</FONT></A><FONT
face="Times New Roman">)</FONT> </CENTER></DT></DIV>
<DT>
<DT><FONT face=Arial size=5><STRONG>(</STRONG></FONT><FONT face=楷體_GB2312
size=5><STRONG>八</STRONG></FONT><FONT face=Arial size=5><STRONG>)
</STRONG></FONT><FONT face=楷體_GB2312 size=5><STRONG>后臺思考和時間策略</STRONG></FONT>
<DT>
<DT> 在閱讀本章前,建議讀者先閱讀《<A href="http://www.elephantbase.net/"
target=_blank>象棋百科全書</A>》網站中《<A
href="http://www.elephantbase.net/computer/outline.htm"
target=_blank>對弈程序基本技術</A>》專題的以下幾篇譯文:
<DT> <FONT face="Times New Roman">(1) </FONT><A
href="http://www.elephantbase.net/computer/other_ponder.htm"
target=_blank>其他策略——后臺思考</A><FONT face="Times New Roman">(Bruce
Moreland)</FONT>。
<DT>
<DT><FONT face=Arial size=4><STRONG>8.1 </STRONG></FONT><FONT face=楷體_GB2312
size=4><STRONG>后臺思考</STRONG></FONT>
<DT>
<DT> <FONT face="Times New Roman">UCCI</FONT>協議不需要對后臺思考作特別處理,如果引擎接收了指令“<FONT
face="Times New Roman">go ponder ...</FONT>”,那么搜索過程中時鐘暫時不起作用,直到收到“<FONT
face="Times New Roman">ponderhit</FONT>”指令后才啟用時鐘。因此,后臺思考實際上相當于無限制的思考。
<DT> <FONT face="Times New Roman">ElephantEye</FONT>從<FONT
face="Times New Roman">1.04</FONT>版本開始就不再支持淺紅象棋協議,而此功能被適配器<FONT
face="Times New Roman">UCCI2QH</FONT>所代替,該程序中的大量的代碼是用來解決后臺思考問題的,其中狀態變量<FONT
face="Times New Roman">nStatus</FONT>的控制是關鍵,該變量的設置規則可參考<FONT
face="Times New Roman"><ucci2qh.cpp></FONT>源程序中的相關注釋。
<DT>
<DT><FONT face=Arial size=4><STRONG>8.2 </STRONG></FONT><FONT face=楷體_GB2312
size=4><STRONG>時間策略</STRONG></FONT>
<DT>
<DT> 時間策略在各個象棋程序中差異很大,有的程序根本沒有時間策略,只能設定固定的搜索深度,或者在固定的時間中止思考,例如淺紅象棋協議目前就沒有時間策略。<FONT
face="Times New Roman">UCCI</FONT>協議可以把時限規則告訴引擎,由引擎自動分配時間,時限規則可以是以下兩種:
<DT> <FONT face="Times New Roman">(1) </FONT>時段制,即在限定時間內走完規定的步數,用“<FONT
face="Times New Roman">go time <time> movestogo
<moves_to_go></FONT>”命令;
<DT> <FONT face="Times New Roman">(2)
</FONT>加時制,即在限定時間內走完整盤棋,但每步會加上幾秒,用“<FONT face="Times New Roman">go time
<time> increment <increment></FONT>”命令。
<DT> <FONT face="Times New Roman">ElephantEye</FONT>的時間策略由<FONT
face="Times New Roman"><search.h></FONT>里的<FONT
face="Times New Roman">SearchMain()</FONT>函數來處理,不管處理哪個規則,都會分配一個合適的時間<FONT
face="Times New Roman">(ProperTime)</FONT>用來走棋,這個時間是這樣計算的:
<DT> <FONT face="Times New Roman">(1) </FONT>時段制:分配時間 <FONT
face="Times New Roman">= </FONT>剩余時間 <FONT face="Times New Roman">/
</FONT>要走的步數;
<DT> <FONT face="Times New Roman">(2) </FONT>加時制:分配時間 <FONT
face="Times New Roman">= </FONT>每步增加的時間 <FONT face="Times New Roman">+
</FONT>剩余時間 <FONT face="Times New Roman">/ 20 (</FONT>即假設棋局會在<FONT
face="Times New Roman">20</FONT>步內結束<FONT face="Times New Roman">)</FONT>;
<DT> 在搜索過程中,超時是由<FONT
face="Times New Roman">Interrupt()</FONT>函數來控制的。如果時間超過分配時間的兩倍,或者即將花完所有剩余時間,則強行中止搜索。另外,搜索過程每進行一段時間,都會由<FONT
face="Times New Roman">SetOutputMove()</FONT>函數給出一個新的結果,此時看一下用時是否超過分配時間的一半,超過的話就中止搜索。
<DT> 由此看出,<FONT face="Times New Roman">ElephantEye</FONT>每步的耗時在 <FONT
face="Times New Roman">nProperTime / 2 </FONT>和 <FONT
face="Times New Roman">nProperTime x 2
</FONT>之間,而這個時間段在大多數情況下會給出一個新的著法,因此不太會有浪費的時間。如果程序的時間策略僅僅是每步限制固定的時間,那么在做迭代加深時,淺一層搜索早就做完,而深一層搜索遲遲出不了結果,就被強行中止了,那么從淺一層搜索做完到強行中止的這段時間白白浪費了。
<DT>
<DT><FONT face=Arial size=4><STRONG>8.3 </STRONG></FONT><FONT face=楷體_GB2312
size=4><STRONG>搜索殺棋的策略</STRONG></FONT>
<DT>
<DT> <FONT face="Times New Roman">ElephantEye</FONT>沒有專門搜索殺棋的功能,如果存在殺棋的話<FONT
face="Times New Roman">(</FONT>不管是殺死對方還是被對方殺死<FONT
face="Times New Roman">)</FONT>,會在搜索中自動找到。是否能找到殺棋和搜索深度有關,某一深度下找不到殺棋,但深一層搜索就可能找到;但和一般局面不同的是,如果一定深度能找到殺棋,那么再深的深度會得到同樣的結果。因此,如果找到殺棋,那么程序要使用不同的策略。<FONT
face="Times New Roman">ElephantEye</FONT>處理殺棋局面時,用到以下幾個策略:
<DT> <FONT face="Times New Roman">(1)
</FONT>置換表的存取策略,前面曾經介紹過,如果置換表中存儲的某個局面已被確認找到殺棋,那么探測到這樣的局面時就不需要考慮深度條件。
<DT> <FONT face="Times New Roman">(2) </FONT>根結點做迭代加深時,找到殺棋后搜索就立即停止。<FONT
face="Times New Roman">ElephantEye</FONT>為殺局設定了邊界<FONT
face="Times New Roman">WIN_VALUE</FONT>,其值略比<FONT
face="Times New Roman">MATE_VALUE</FONT>小一些,局面分值在區間<FONT
face="Times New Roman">(</FONT><FONT face=Symbol>-</FONT><FONT
face="Times New Roman">WIN_VALUE, WIN_VALUE)</FONT>以外,就說明該局面有殺棋。
<DT> <FONT face="Times New Roman">(3) </FONT>如果根結點的所有著法中,除了一個著法可以支撐<FONT
face="Times New Roman">(</FONT>即分值大于<FONT face=Symbol>-</FONT><FONT
face="Times New Roman">WIN_VALUE)</FONT>以外,其余著法都會輸掉<FONT
face="Times New Roman">(</FONT>即分值都小于<FONT face=Symbol>-</FONT><FONT
face="Times New Roman">WIN_VALUE)</FONT>,那么應該立即返回這個唯一著法。
<DT> 最后一點是<FONT
face="Times New Roman">ElephantEye</FONT>最有特色之處,這就是說,當迭代加深過程中遇到這種情況時,就沒有必要做更深的搜索了。在對某個深度的完全搜索完成后,對最佳著法設為禁著,再對根結點作一次搜索,如果分值小于<FONT
face=Symbol>-</FONT><FONT
face="Times New Roman">WIN_VALUE</FONT>,則說明除這個最佳著法以外其余著法都會輸掉,這種搜索稱為“唯一著法檢驗搜索”,<FONT
face="Times New Roman"><search.cpp></FONT>中需要用變量<FONT
face="Times New Roman">bCheckUnique</FONT>來控制。啟用唯一著法檢驗搜索時,有兩個地方要注意:
<DT> <FONT face="Times New Roman">(1) </FONT>使用零窗口的技巧,即用<FONT
face="Times New Roman">(</FONT><FONT face=Symbol>-</FONT><FONT
face="Times New Roman">WIN_VALUE, 1 </FONT><FONT face=Symbol>-</FONT><FONT
face="Times New Roman"> WIN_VALUE)</FONT>窗口作搜索,以減少搜索的結點數;
<DT> <FONT face="Times New Roman">(2) </FONT>根結點不記錄到置換表中。 </DT></DL>
<DIR>
<LI>上一篇 <A
href="http://www.elephantbase.net/computer/eleeye_book.htm">中國象棋程序設計探索<FONT
face="Times New Roman">(</FONT>七<FONT face="Times New Roman">)</FONT>:開局庫</A>
<LI>下一篇 <A
href="http://www.elephantbase.net/computer/eleeye_evaluate.htm">中國象棋程序設計探索<FONT
face="Times New Roman">(</FONT>九<FONT face="Times New Roman">)</FONT>:局面評價函數</A>
<LI>返 回 <A href="http://www.elephantbase.net/computer.htm">象棋百科全書——電腦象棋</A>
</LI></DIR>
<DIV align=center>
<CENTER>
<TABLE border=0>
<TBODY>
<TR>
<TD>
<P align=center><A href="http://www.elephantbase.net/" target=_blank><IMG
height=31 src="解剖大象的眼睛——中國象棋程序設計探索(八):后臺思考和時間策略_files/elephantbase.gif"
width=88 border=0></A></P></TD></TR>
<TR>
<TD><A href="http://www.elephantbase.net/" target=_blank><FONT face=Arial
size=2><STRONG>www.elephantbase.net</STRONG></FONT></A></TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -