⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 结语——国际象棋程序剖析.htm

📁 象棋程序设计全资料集(介绍编写象棋程序的方法思路)
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0048)http://www.elephantbase.net/computer/anatomy.htm -->
<HTML><HEAD><TITLE>结语——国际象棋程序剖析</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.3790.2817" name=GENERATOR><!-- This document was created from RTF source by rtftohtml version2.7.5 --></HEAD>
<BODY background=结语——国际象棋程序剖析_files/background.gif>
<DL>
  <DIV align=center>
  <CENTER>
  <DT><FONT size=3>《对弈程序基本技术》专题</FONT> </CENTER></DT></DIV>
  <DT>  
  <DIV align=center>
  <CENTER></DIV>
  <DT><FONT face=隶书 size=6>国际象棋程序剖析</FONT> </CENTER>
  <DIV></DIV>
  <DIV align=center>
  <CENTER></DIV>
  <DT>  </CENTER>
  <DIV></DIV>
  <DIV align=center>
  <CENTER></DIV>
  <DT><FONT face="Times New Roman" size=3>T.A. Marsland */ </FONT><FONT 
  size=3>文</FONT> </CENTER>
  <DIV></DIV>
  <DIV align=center>
  <CENTER></DIV>
  <DT><FONT face="Times New Roman" size=3>* </FONT><FONT 
  size=3>阿尔伯达大学计算机科学系</FONT> </CENTER>
  <DIV></DIV>
  <DIV align=center>
  <CENTER></DIV>
  <DT>  </CENTER>
  <DIV></DIV>
  <DT><FONT face=楷体_GB2312 size=5><STRONG>一、简介</STRONG></FONT> 
  <DT>  
  <DT><FONT 
  size=3>  从理论上说,让机器下国际象棋是一个简单的游戏,只要每一步都考虑各种可能的着法,以及每种着法的后续变化,如此下去直到将死或和棋。但是实际操作中,这种策略是不可行的,因为需要考虑的每种着法加起来会是天文数字。</FONT> 

  <DT><FONT 
  size=3>  不管人类还是机器去下棋,都有一整套下棋的理论,人类好几百年前就开始下棋,在近二百年里有很多理论资料,而机器下棋只有五十多年的历史,在机器下棋的诸多理论中,最著名的属</FONT><FONT 
  face="Times New Roman" size=3>Claude Shannon</FONT><FONT size=3>在</FONT><FONT 
  face="Times New Roman" size=3>1949-50</FONT><FONT 
  size=3>年提出的两个完全对立的策略——用蛮力考虑所有着法的策略</FONT><FONT face="Times New Roman" 
  size=3>(A</FONT><FONT size=3>策略</FONT><FONT face="Times New Roman" 
  size=3>)</FONT><FONT size=3>,以及靠知识来选择其中一部分着法的策略</FONT><FONT 
  face="Times New Roman" size=3>(B</FONT><FONT size=3>策略</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT size=3>。尽管早在</FONT><FONT 
  face="Times New Roman" size=3>Shannon</FONT><FONT 
  size=3>以前,就有一些电子机械可以下比国际象棋简单的棋类,然而</FONT><FONT face="Times New Roman" 
  size=3>Shannon</FONT><FONT size=3>的理论却是现代电脑象棋发展的基础。</FONT> 
  <DT>  
  <DT><FONT size=3>  如今的象棋程序把棋局看成树状结构,每个局面表示成棋局树中的一个结点,每个着法代表它的一个分枝</FONT><FONT 
  face="Times New Roman" size=3>(</FONT><FONT size=3>一个结点和深一个结点的连接</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT 
  size=3>。这样,树就由双方不同层面上的所有着法组成</FONT><FONT face="Times New Roman" 
  size=3>(</FONT><FONT size=3>树的一个层面用“层”</FONT><FONT face="Times New Roman" 
  size=3>(Ply)</FONT><FONT size=3>这个术语表示,代表一方走的一步棋</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT size=3>。</FONT> 
  <DT><FONT size=3>  现在通常的策略是,把树由浅至深分为三个阶段,第一阶段用蛮力搜索</FONT><FONT 
  face="Times New Roman" size=3>(Shannon</FONT><FONT size=3>的</FONT><FONT 
  face="Times New Roman" size=3>A</FONT><FONT size=3>策略</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT size=3>,第二阶段用选择性搜索</FONT><FONT 
  face="Times New Roman" size=3>(B</FONT><FONT size=3>策略</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT size=3>,第三阶段用称为“静态搜索”</FONT><FONT 
  face="Times New Roman" size=3>(Quiescence Search)</FONT><FONT 
  size=3>的策略,来处理最后变化非常剧烈的局面,在最后一个阶段里,程序只评价吃子着法,兵升变的潜力,将军产生的后果,以及一些强制性着法。所有的程序都使用相同的算法——深度优先的</FONT><FONT 
  face="Times New Roman" size=3>Alpha-Beta</FONT><FONT 
  size=3>算法,而不同之处在于每个阶段选择什么样的深度。</FONT> 
  <DT><FONT 
  size=3>  通常搜索的深度不是固定的,而是根据当前搜索到的着法在小范围内变动,例如某个结点是将军的局面,那么它的分枝数很少,这个区域内搜索应当加深一些。策略上有非常多的选择,使得程序使用相同模型的时,他们的走棋风格和搜索速度会有显著的差别。</FONT> 

  <DT>  
  <DT><FONT face=楷体_GB2312 size=5><STRONG>二、树状搜索</STRONG></FONT> 
  <DT>  
  <DT><FONT 
  size=3>  人类下棋时,往往分析一小部分着法并作展开,相比选择着法而言,机器更愿意考虑得完备,所以需要发展一套逐步求精的技术。“迭代加深”</FONT><FONT 
  face="Times New Roman" size=3>(Iterative Deepening)</FONT><FONT 
  size=3>这一技术取代了固定的深度,让机器一次次做更深层的搜索</FONT><FONT face="Times New Roman" 
  size=3>(</FONT><FONT size=3>先是搜索</FONT><FONT face="Times New Roman" 
  size=3><EM>N</EM></FONT><FONT size=3>层,然后搜索</FONT><FONT face="Times New Roman" 
  size=3><EM>N</EM> + 1</FONT><FONT size=3>层,</FONT><FONT face="Times New Roman" 
  size=3><EM>N</EM> + 2</FONT><FONT size=3>层,等等</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT 
  size=3>,直到按计划分配的时间用完为止,这样就可以让机器在有限的时间内找出最好的着法。诸如反驳表和置换表等技术,在与迭代加深结合起来后,可以对着法重新排序,使得下一次迭代时“主要变化”</FONT><FONT 
  face="Times New Roman" size=3>(Principal Variation)(</FONT><FONT 
  size=3>上一次找到的最好着法</FONT><FONT face="Times New Roman" size=3>)</FONT><FONT 
  size=3>优先考虑。</FONT> 
  <DT><FONT 
  size=3>  另一个排序着法的技术就是记录一些“杀手”着法,这些着法要优先试探,杀手着法就是在搜索树的其他位置能产生截断或裁剪的着法。杀手着法通常是吃子的着法,因此可以简单地认为,吃子的着法应该在其他着法之前考虑。在很多程序中,这个技术被拓展为“历史启发表”</FONT><FONT 
  face="Times New Roman" size=3>(History Heuristic Table)</FONT><FONT 
  size=3>,通常是</FONT><FONT face="Times New Roman" size=3>64x64</FONT><FONT 
  size=3>的数组,每个元素存放了该着法引起裁剪的次数。</FONT> 
  <DT>  
  <DT><FONT size=3>  排序着法可以大幅度提高深度优先</FONT><FONT face="Times New Roman" 
  size=3>Alpha-Beta</FONT><FONT size=3>搜索的效率,此外还有三个算法也起到同样作用——</FONT><FONT 
  face="Times New Roman" size=3>Pearl</FONT><FONT size=3>的侦察</FONT><FONT 
  face="Times New Roman" size=3>(Scout)</FONT><FONT 
  size=3>算法以及相关的负值侦察</FONT><FONT face="Times New Roman" 
  size=3>(NegaScout)</FONT><FONT size=3>和主要变例搜索</FONT><FONT 
  face="Times New Roman" size=3>(Principal Variation Search</FONT><FONT 
  size=3>,简称</FONT><FONT face="Times New Roman" size=3>PVS)</FONT><FONT 
  size=3>方法,它们具有同一个思想:当主要变例找到时,可以先去验证其他着法是否都不如这个着法好,如果验证下来不是这样,那么它们必须重新搜索</FONT><FONT 
  face="Times New Roman" size=3>(</FONT><FONT 
  size=3>因为它们是更好的着法,必须做完全的搜索</FONT><FONT face="Times New Roman" 
  size=3>)</FONT><FONT size=3>。</FONT> 
  <DT><FONT size=3>  另一个能减少搜索量的技术称为“期望搜索”</FONT><FONT face="Times New Roman" 
  size=3>(Aspiration Search)</FONT><FONT size=3>,根据当前局面估计一个范围</FONT><FONT 
  face="Times New Roman" size=3>(</FONT><FONT size=3>通常正负半个兵</FONT><FONT 
  face="Times New Roman" size=3>)</FONT><FONT 
  size=3>,用这样一个窗口进行搜索。尽管期望搜索并不那么有效,但是用它的人还是很多的,因为它比主要变例搜索更容易理解。</FONT> 
  <DT>  
  <DT><FONT 
  size=3>  深层次的搜索到底能提高多少精确度,这是很难衡量的。任意局面其搜索树的大小有很大的差异,很多残局每方有约</FONT><FONT 
  face="Times New Roman" size=3>8</FONT><FONT 
  size=3>种着法,而复杂的中局里每方可能有多达</FONT><FONT face="Times New Roman" 
  size=3>80</FONT><FONT size=3>种着法,就现在的技术而言,一般程序在中局阶段能完全考虑</FONT><FONT 
  face="Times New Roman" size=3>7</FONT><FONT size=3>到</FONT><FONT 
  face="Times New Roman" size=3>10</FONT><FONT size=3>层的变化</FONT><FONT 
  face="Times New Roman" size=3>(</FONT><FONT 
  size=3>有个程序设计师声称选择性地搜索能达到</FONT><FONT face="Times New Roman" 
  size=3>40</FONT><FONT size=3>层!</FONT><FONT face="Times New Roman" 
  size=3>)</FONT><FONT size=3>。</FONT> 
  <DT><FONT size=3>  “选择性延伸”</FONT><FONT face="Times New Roman" 
  size=3>(Selective Extension)</FONT><FONT 
  size=3>是对一些关键着法作更深入的探索,每个程序设计师对这些着法都有自己的界定——可以是防御杀棋的着法,或是为避免失子而作的反击。选择性延伸不能和“单步延伸”</FONT><FONT 
  face="Times New Roman" size=3>(Singular Extension)</FONT><FONT 
  size=3>混淆起来,后者是对最好的一步着法进行的更深层次的检查,来验证这个着法是否仍旧是最好的。从某种意义上说它对主要变例进行了短的延伸,是一种很花时间但很有意义的方法。</FONT> 

  <DT>  
  <DT><FONT size=3>  而用得最广泛的做法是“空着启发”</FONT><FONT face="Times New Roman" 
  size=3>(Null-Move Heuristic)</FONT><FONT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -