电脑围棋门径

电脑围棋门径
——陈志行
 
 
显示棋盘棋子及其他必须显示的内容;设置黑白选择、进子及有关的功能。
设置计算和记录棋子串气数的功能,赋予提子和禁着的功能。
设计一种函数,表征每个棋子对周围的影响,用以划分势力范围,作为静态 形式判断的基础。
对盘上各着点分别试进黑子和白子,比较进子前后的静态形势,以估算该点 的进子价值,成为着点选择的基本依据。
用多步搜索法判断棋子串是否可以歼灭或逃出,并分别记为“死”、“活” 和“半死”。这种搜索还可以包括“双吃”(叫吃一串后歼灭另一串)的可 能性。
规定开局时的一些大点及其价值,设置随机地选取等价大点的功能。开局大 点可以纳入定式的范畴。
把棋子划分为块,考虑各块的眼位和出路以及块间的相邻关系,以估算各块 的危险性(负目数),从而构成静态形势判断的完整体系。
建立棋形效率模式,指明愚形、忌形和急所,从而增建由静态形势判断所估 算的进子价值。
估算棋子串被歼与逃出的静态形势 以估算歼逃价值。
设置定式库,规定定式中每步的价值;设置从定式库取数据来行棋的程序段。
设置大场、中盘侵分、收官等的数据库和程序段。
记录先手着点及其价值,以供寻劫、收官、做眼等参考。
设置利用以上各种数据按照适当方式选择着点的程序段。
设置在优势和劣势下采用不同策略的功能。
设置搜索广度和深度的选择功能使思考时间得以随时调整。
设置终局判断、PASS(弃权一手)及在对方PASS后如何处理的功能。
设置棋谱记录、计时、发声、显示形式对比、计算胜负等功能。
首先必需完成1、2部分。其次不妨先解决3、4,这样程序就算是会下棋了。不过,叫吃也不会逃,或者只会逃叫吃却不懂征子,也是不堪一击的。这样应解决5。第一步可以先解决二气问题、即三气就算已经逃出。

棋子分块以及眼位估计是获得战斗力的重要环节。这一功能解决后,棋力可望达 到高手让不了30子的程度。然后设置行棋模式又是一个关键,解决后让25子恐怕 也困难了。
 

“手谈”的编程技术
“手谈”的走棋主要决定于静态评价。直至1994年的早期版本, 走棋选点没有用到搜索法。1995年试把搜索法用于走棋选点, 但棋力未见提高。近年虽有些提高, 搜索法的作用还是不能满意的。最近我做了一个选点不用搜索的“手谈”版本。它在与有选点搜索法的版本对弈时似乎差些, 但对其他程序时显得与有选点搜索法的版本一样强。

“手谈”的棋力主要依靠静态评价的精细计算。关键是棋子分块和块安全性的估计。

棋子的分块
“手谈”的棋子分块与陈克训提出的相似, 首先决定于棋子的“影响”, 再辅之以某些连接模式。
**影响
“手谈”的影响函数与陈克训的明显不同。一个正常白子的影响是:
对其邻位为 4;
对其斜邻位为 3;
对其关位和小飞位为 2;
比关和小飞稍远的某些位置,影响为 1。
黑子辐射出负数的影响。
死子辐射出反号的影响。半死或受伤的棋子辐射出较少的影响。

多个棋子对一个点的影响可以叠加,但非线性叠加。例如,某点若同时与黑子和白子相邻,则其值为0,不问有多少个黑子和白子。若某点影响的代数和为 1 或 -1, 则取为 0 (保留 1|-1 表示假眼位)。若影响值大于 2, 则先作为白方的全控制点, 再作圆滑处理(见下); 若影响值小于-2, 则先作为黑方的全控制点再作圆滑处理。黑|白全控制点取值 6|-6。

影响的单位称为小点(dot)。

圆滑处理方案包括如下规则:

与0或负影响相邻的点,不得超过3小点;
与1或2小点相邻的点,不得超过5小点;
负值(黑影响)有类似的规则;
1|-1小点代表白|黑假眼位。
**块的构成
相互邻接的白非死子、黑死子、以及 1 或超过 3 小点的空点合并成一白块; 邻近的、相互不能分割的白块再合成一白块。黑块亦按类似的方法构成。
块危险性估算
块危险性可表为有适当单位的一个量。围棋中常用于形势判断的单位为目。块危险性也可以用目为单位。

块危险性的因素为:1. 不足两眼, 2. 没有足够的自由度。作定量估算时, 还要计及块的大小。因此, 块危险值应为3个自变量的函数:欠眼数、自由度、大小。函数的具体形式应经验地确定,并可在调整时改变。

**自由度
陈克训把自由度解释为块周围的敞开程度。
块的自由度可表为封锁它所需的手数。业已探明,有关的函数应为指数型的:封锁手数每增1,块危险值应减半。

然而,封锁手数恐怕不容易由程序计算。这就有必要设计适当的方案来计算自由度,以代替封锁手数。

“手谈”有两个自由度方案。

早期方案:自由度由与块(棋子或空点)的邻位和斜邻位计算。

第二方案:自由度由属于块的棋子的关位和小飞位计算。

第二方案视野较广,似较合理。然而围棋编程中,模糊的估算常会有某些优越性,故第一方案在某些情况下会较合适,并使棋走得更好。“手谈”的近年版本计算越来越精细,就需要更精细的自由度第二方案。

近年还用过一个第三方案,但已发现它有错误。修正了的方案已用于另一程序“弈侣”的新版本。

模式与效率
“手谈”棋力的另一关键是进子价值的效率修改。好着点(急所、手筋等)设为正效率,而坏着点(愚形、俗手等)设为负效率。
进子价值被乘以一个因子:正效率对应的因子大于1,负效率对应的因子小于1。

效率主要由模式识别来赋值。不过“手谈”用了笨拙的模式识别方法:只用指令来处理而没有用模式库。这就使模式难以修改补充,只能包括少量模式。

模式的大小是不固定的,但不超过下列范围:

        ...
       .....
      .......
      ...*...
      .......
       .....
        ...


这份材料由“手谈”的作者陈志行提供。
1999-03-14
“乌鹭”的编程技术
陈志行, 乌鹭小组的指导者
“乌鹭”是我指导编写的, 故“乌鹭”有不少与“手谈”相近之处。

首先, “乌鹭”采用了“手谈”的主要数据结构, 因此可以在“乌鹭”中找到与“手谈”类似的数据。“乌鹭”用了“手谈”的有关围棋规则的处理程序, 只作了很少的修改。

“乌鹭”用了与“手谈”相同的定式管理程序, 但定式库比“手谈”的大得多。“手谈”的定式完全是人工输入的, 而“乌鹭”的定式是由主要编写者雷秀瑜所编的一个程序半自动地生成的。

“乌鹭”中有不少重要技术与“手谈”大不相同。

影响, 气位的级别
“乌鹭”定义了如下图的气位级别。气位都是空位。

      y2y
     yz1zy        mn
     21O12        OX
     yz1zy        mn
      y2y
      (a)         (b)

图(a)的O是白子, 带其他字符的位置都是空位。邻位(1)称为一级气位; 关位(2)称为二级气位; 斜邻位(z)称为1.5级气位; 小飞位(y)称为2.5级气位。

图(b)的O是白子, X是黑子, m、n是空位。m是那黑子的扳位, 也是黑子的二级气位; n是那白子的扳位, 也是白子的二级气位。

从一种颜色的棋子对某点的影响仅决定于离该点最近(具最小级数)的该色棋子:

     气位级别     1     1.5    2    2.5
     白影响      6     5      3    2
     黑影响      -6    -5     -3   -2

黑白影响可以互消。“乌鹭”中也有与“手谈”类似的圆滑方案, 但有些不同。

由于影响的计算比“手谈”简单得多, 评价函数的计算也就快得多。

自由度
自由度的计算仅考虑二级和2.5级气位。由于计算影响时记录了各级气位, 自由度的计算也就十分简单而比“手谈”快得多。

搜索法
1996应氏杯的版本没有用到搜索法, 一局棋的后期“乌鹭”就显得太弱。1998年的“乌鹭”用了搜索法。由于评价迅速, 搜索法中就可以包括更多的计算而取得更多的信息。结果“乌鹭”的搜索法比“手谈”成功得多。若取消了搜索法, “乌鹭”就要弱得多。

串安全性的模式识别
“乌鹭”中有一大段程序由陈国宝编写的, 是关于串安全性即歼逃可能性的程序。它是用模式识别来作判断的。不过, 这里用了像“手谈”那样的老方法, 难以维护。
模式管理
1997年秋我们设计了一个新的模式管理方案, 首先用于“乌鹭”。

模式由字符构成的图形代表。这些字符是:

    O = 白子        X = 黑子      o = 白或空      x = 黑或空
    * = 模式中心    . = 空位      空格 = 任意     # = 棋盘外

用一个程序把这些图形编译成为汇编语言的指令以作模式识别。模式中的条件也表达为某些语句, 并由该程序一起编译成为汇编指令。

雷秀瑜用此法编出有关模式的一个大模块。模式的数量就比“手谈”多得多。主要的调试归结为这些模式的修改。雷秀瑜作了长期的调试, 结果使“乌鹭”成为世界顶尖程序之一, 并在1998应氏杯中获亚军。
弈侣的编程技术
“弈侣”是老冠军程序“手谈”的新一代围棋程序。它用汇编语言编写, 但不久将改为C++与汇编结合编写。

1998应氏杯的“弈侣”, 核心部分约有1/3是新的, 其余2/3保留自“手谈”。这其余的2/3, 绝大部分将在近年改写或另编。

1998年的“弈侣”新编部分未臻完善, 故棋力未能超过“手谈”, 甚至更弱。在第四届FOST杯(1998年8月)前, 它对“手谈”的胜率只有1/3。赛后经两个月的调整, 似有明显改善。

从“手谈”到1998年的“弈侣”, 主要改变是模式管理和扩充知识。

“弈侣”用了“乌鹭”那样的模式管理, 但作了更多子程序应用以使模式更为完善。下面的图(a)是一例。

              O..O     X..X
     O.O      .O.O     .O.O
     .*.      ..*.     ..*.
     O.X      OO.X     XO.X
     (a)       (b)      (c)

对于这个模式, 若*位为黑所占, 白的两个“关”将受威胁。“手谈”把*位设为急所。但是, 这种威胁与白两个“关”的环境有关。若环境类似图(b), 威胁即可忽略, *位不急; 而像图(c)那样的情况, 威胁甚大, *位就急得多。于是, “弈侣两次转到如图(d)的另一模式以考察其情况:
     O*O
     .X.
     (d)

后一模式就作为子程序被前一模式调用两次, 以考察白的“关”受到黑何等程度的威胁, 从而确定图(a)的*位急到什么程度。
电脑围棋中的人工智能技术
 

电脑围棋中的人工智能技术

Jay Burmeister和Janet Wiles
澳大利亚昆士兰大学心理学与信息技术学院
http://www.psy.uq.edu.au/~jay/
翻译:LKF

摘要
 
    本文通过研究几个有出色表现的程序,从认知科学的角度介绍电脑围棋,并特别针对电脑围棋编程人员(或有意投身于此的程序员)揭示围棋作为一个认知科学研究领域的日益增长的重要性。手谈,Go4++,Many Faces of Go,Go Intellect 和Explorer是几个目前最优秀的电脑围棋程序,我们概括这些程序用到的人工智能技术,必须面对的关键性挑战和博弈树搜索中牵涉的问题,以此解释为什么计算机国际象棋技术不能被很好的移植到围棋领域。

1. 挑战围棋的程序
    围棋是正规游戏的一种,在这块地盘上过去即便是对付一个普通水平的人类棋手计算机也难以有所作为。有几个一年一度的电脑围棋赛事,如为第一名提供2,000,000日元奖金的FOST杯赛等,而台湾的应氏基金则为第一个能在分先七番棋中击败顶尖职业棋手的围棋程序许诺140万美元的奖金。
    尽管直到1968年(Zobrist,1970)才有程序第一次下了盘完整的棋,但最早以围棋为对象把电脑围棋纳入研究工作却是在1962年。随着电脑围棋赛事的举行和第一个商业程序的发放,电脑围棋作为一个研究领域于80年代被正式创立,并在90年代变得兴旺起来。目前活跃在电脑围棋竞赛中的顶尖程序有Explorer,Go Intellect,Go4++,手谈和Many Faces of Go等,它们的水平大致在4-8级之间。

2. 围棋博弈树搜索
    二人完美信息博弈中典型的人工智能方法是搜索博弈树以决定走哪一步。标准博弈树搜索由四部分组成:1.状态表示,2.候选棋步产生,3.确定目标状态,以及4.一个确定相对优势状态的静态评估函数。有效的博弈树剪枝方法(比如α-β)增强了程序的表现。
    博弈树这条途径很成功,如我们在国际象棋程序中所看到的,基于典型的完全广度α-β剪枝博弈树搜索的程序甚至击败了世界冠军。这一节我们从透视电脑围棋的角度检查博弈树搜索的四个构件。
    2.1 状态表示
    从完全信息的角度看,围棋盘面有19X19的3次方格,每个交叉点要么空要么被黑子或白子占据。状态空间的大小(例如可能的位置数)是3的361次方(或10的172次方),相比之下国际象棋大致为10的50次方而Othello棋为10的30次方(Allis,1994)。另外,博弈树的大小(例如可能的博弈数)在10的575次方和10的620次方之间,对比国际象棋的10的123次方和Othello棋的10的55次方(Allis,1994)。
    由于空间的组合尺寸,用19X19格的形式严格表示状态空间对人或机器来说都层次太低而不能有效使用。接下来的层面的描述是把正交的邻接棋子组成串(或链)。所有的程序把串搜集到更大的单元,然而没有通用的处理方法——即便是对专业棋手来说——把串组合到更大的单元中。依靠他们的围棋理论,程序员开发了他们自己的启发式,当串有效的连接在一起时用做评估之用(叫做模糊组或块)。
    另外,恰当层次的表示能改变对运行时子任务的依赖,例如,战术分析,死活分析,或实地评估。
    2.2 走棋
    棋手在禁止自杀和同型反复(劫)的规则限制下轮流把棋子投放在空的交叉点(包括角和边)。象国际象棋一样,围棋在给定位置的上下文中只有所有合法走法中的一部分是有效的。围棋的平均分枝因子是很大的,大约是国际象棋的六倍(200对35,Burmeister & Wiles,1995)。
    注意这个分枝因子在全盘中的考虑。而在某些情形下只有局部的考虑是重要的。例如,直接目标搜索被用来判断通常只有一两种可能走法却可以多达60手深度的征子。
实际的走棋是个复杂的问题:参见3.4部分。
    2.3 目标状态
    围棋的最终目标是获得比对手更多的实地。有两种方法用来争取实地:建棋子城墙围空以及用棋子包围并吃掉敌方的棋串。实际上很难确定目标状态,因为实地的获得是靠慢慢积累起来的(不象国际象棋那样将军的最终的目标是突然死亡并且集中在一个子上)。由于在接近终局前很难精确地计算实地,故启发式估计用的较多。这样的启发方式通常要归并组件和指示领地安全潜力的(例如死活组和影响)次要目标(例如国际象棋里的材料优势)。
    当对局双方依次弃权时结束。棋手通常在没有走法能增加所得和/或无论怎么走都会减少所得时选择弃权。实际上,要确定对局结束(即何时弃权)是相当困难的。人们下棋,计算结果时如果遇到有关死活的争执要通过继续下直到最终结果出现。在电脑围棋比赛中,如果程序出现算法不能解决的得分争执,计分就由组织比赛的人员来做。
    2.4 评估函数
    在判断盘面的形势优劣时棋块的死活是个重要的考虑点。死活判断是很费时间的,并且是典型的通过战术搜索(参见3.5部分)或死活搜索(参见3.6部分)来获得的。有意思的是,另一评估棋块死活的复杂之处在于它可能需要评估全盘的形势:如果要一个棋块在劫争中是可活的(即它必须赢得打劫来使自己活下来),就必须估算所有和对手相比用来决定棋块死活的劫材的数量和大小。如果出现双重或三重劫的形势,打劫分析会变得更复杂。
    评估的结果有时不确定,因为明确的死活定义在受限的战术搜索里也许是不可能的,即一个绝对的死活回答可能超出了战术或死活搜索的范围。
    从复杂的类型分析看,由一个绝对位置来确定赢家是P空间难题(Lichtenstein & Sipser,1980),决定一个棋手能否左右输赢需指数时间来完成(Robson,1983),由此也就不奇怪要用到启发式了。这些理论结果显示不存在从一个绝对局势出发决定领地结果的多项式时间算法。

3. 参赛程序里的博弈树搜索和人工智能技术
    当前活跃在各电脑围棋赛事里的程序有Martin Muller(1995)的Explorer(EX),陈恳(陈,1989;1990;1992)的Go Intellect(GI),Michael Reiss 的Go4++(Go4),陈志行的HandTalk(HT)以及David Fotland 的Many Faces of Go(MFG)。针对第2节讨论的博弈树搜索和围棋专用的人工智能技术:战术搜索,死活搜索和势函数,我们报告这些程序的细节。
    3.1 位置表示
    所有的程序都有子、串、块的表示,确认串属于某个组的典型方式是采用基于模式的启发来确定串与串之间的关联性。敌方(或块)表示也被用在EX和GI 中,启发式用来确定敌方的影响(GI)和领地区域(EX)。
    盘面(例如棋块、敌方)表示的对象属性包括它们的死活状态(也指安全性或生命力)、实地数、眼数和势。某些情况下这些属性值由战术搜索决定。
MFG的表示方式中一些组件由评估函数控制(例如块、联接、眼、实地和势)。Go4的盘面只是简单的由评估函数(例如块、眼、安全性、实地)来表示。
    3.2 候选棋步
    通常,由模式或更常见的是由基于规则的专家系统产生候选棋步。棋步产生过程的最后是通过(线性的或加权求和的)相加棋盘上所有点的参考值为合适的棋步给出一个分值。全盘评估一般选最高得分点作为下一手的落子点。
    不同程序由全局水平变量估值得出的候选棋步数也有所不同:GI(陈,1997)有12手,MFG有10手,而Go4至少有50手。程序变量保持的规则数:EX大约100,MFG大约200。GI含有约20个走棋算法,它们或者基于模式库,或者基于面向目标的搜索,或者基于启发式规则(可能含有大量的规则)。
    模式通常既包含低级信息也包含高级信息。低级信息与黑白子的位置有关,那些点必须是空着的,已经被子占据的点不在此列。高级信息则是关于气的数量、安全性、眼位和领地的信息。模式匹配不仅与子的配置匹配,而且跟包含在子或串里的任何高级需求有关。大量的模式匹配计算是很耗时的,并且由于棋盘上的对称性而变得更复杂。这已经导致了发展特殊算法来克服与模式匹配有关的问题(比如MFG的哈希函数,EX的串匹配)。
    知识以不同的方式组合到程序当中:一些程序几乎完全依据第一原则工作,另一些根据存储的模式匹配当前位置。不同的程序其模式数量相差很大:Go4约有15个;MFG大约2000个;而EX则在3000个左右。有些程序也包含开放的棋步模式数据库(定式)(例如,MFG含有约45,000个定式模式)。
    3.3 目标
    多数情况下,大量的实地比起少量的实地加相应的外势更合乎需要。尽管有时也存在着实地和外势间地转化(特别是在布局和中盘阶段)。然而,虽然实地的启发式评估是可能的,实地依然不总是形势优劣最好的指示明灯。在对局的早期阶段,占有大量的实地可能表明一种过于集中的形势,从实地安全的角度看,这样的形对对局的后面阶段或许是有害的。开局造就最大可能的势而不是实地通常导致局末对更多实地的追求。外势是可能用来确定形势优劣的子目标的一个例子。
    用来确定形势优劣的大量子目标的相对优先度在电脑围棋中看来没有一致性可言。典型的块和实地的死活状态(安全性)被包含在目标和子目标中。在手谈中,战术手段是重点,而MFG集中在联接性、眼和块的生命力。Go4则好像完全贯注于联接性上,几乎任何东西都是从联接概率图上派生(直接或间接地)出来。
    3.4 评估过程
    评估围棋的形势是个很慢的过程(例如,比起国际象棋程序的每秒10,000-100,000次评估,MFG是以低于每秒10次的速度完成对整局棋不超过10,000种全盘形势的评估)。由于比赛时间的限制,程序执行的全局评估数通常是有限的(例如,MFG在选择下一步时全局的评估数不超过100)。
    Go4的50种候选棋步中每一个都通过一个六步的过程来评估:1.启用一个联接概率图。对于盘面上的每一个黑子和白子,计算它与32个(实际的或假定的)友好点的联接概率(要处理大量的数据)。确定联接性还要用到战术搜索;2.棋块由联接图和战术搜索来确定;3.眼位(利用模式)由联接性和棋块数据确定;4.眼位的数量确定了棋块的安全性;5.每个子的安全性按联接概率图的比率辐射并在所有棋子上相加;6.黑白领地由辐射值估计。黑白领地的差别作为一个给定棋步的评估结果返回。
    MFG的评估是个多步过程,并且在很大程度上依赖于战术搜索。战术搜索检查所有少于四口和一部分有四口气的串以确定是不是死串。战术搜索也被用来鉴别联接性和眼位。在这一环节,串组成了棋块。棋块的生命力由基于死活的考虑(例如,联接、眼位等)决定,并且用来确定黑白子在盘面每个点(在-50至+50的范围之间)行使控制的总量统计。在总和每个点的值的基础上确定领地,给出最终的估计值。多达6轮的静态搜索可以被执行,有时用一个特殊的模式集找出能使形势稳定下来的局部走法。
    GI的评估用在做全局搜索时。如果所有候选棋步中有一种棋步的得分要明显高于其它的棋步,它就被选为要走的下一步。如果候选棋步中有些棋步的得分大致相等,靠评估带来方便的全局搜索决定选择走哪一步。评估时,敌子的安全性是为盘上每个点指定一个在-64到+64之间的黑白控度的基础,所有点的分值加起来返回一个评估值。全局搜索检查的步数不多于6到7步,搜索的深度不超过6层。
    3.5 战术搜索
    战术搜索是有选择的、面向目标的搜索,并且为一大堆目的而使用,包括确定串是死是活(Go4,MFG,EX,GI)、联接是安全的还是可被切断的(Go4,MFG)、是否可以形成眼位(MFG)、产生候选棋步(GI)和确定棋块的死活(EX)。就是在全局的水平,战术搜索也要用来做棋步产生和评估。战术评估和全盘评估有区别,这跟搜索的目标(例如,一个串的气的数量)有关。由于时间上的制约,战术搜索通常在节点数、枝因子和层的深度上受到限制。因此,尽管象死活这类的问题通常被认为是战术性的,棋子却可以在战略上就死去了,即使它们可能不能通过战术手段被抓获。由此,从围棋评估的方方面面看,战术搜索只是一种启发式装备而已。
    MFG提供了一个战术搜索操作的很好的例证(通过“战术家”):每个有三口或更少的气的串和许多有四口气的串被“战术家”检查过。每个串检查两次,一次白先走一次黑先走。“战术家”决定一个串是否被抓(比如,即使它先走也不能活)、被威胁(比如,如果它先走则活,后走则死),或者是牢固的。“战术家”依靠简单的启发式(例如,气数和联接性)。
    “战术家”有两个分离的走棋器;一个执行攻击走法,一个执行防卫走法。走棋器建议的棋步按一些规则分类,这些规则包括二次气(气的气)、切点和简单的眼形。一旦分类,根据依赖棋步分类的质量的搜索的表现,一种α-β深度优先搜索被派上用场。走棋和分类解释了多数时间依靠战术搜索的原因。
    战术搜索直接针对目标并被限制一个最大节点数。抓子时这个限制是大约100,然而当只有一步可走时就不考虑这个限制。采用这种方式,可以毫不费力地确定征子的胜方。根据第一层走棋产生赋予棋步的分值,一次搜索的节点数分配到树枝中,因此不同的树枝可能在不同的深度结束。每一成功的层的枝因子被“战术家”逐步强化;枝因子从第一层5降到第五层的1或2。
    对局过程中,MFG作大约100,000-150,000次战术搜索,以每秒2,000-2,500个节点的速度遍历1.5-2百万个节点。平均起来每次战术搜索访问约10-20个节点,尽管由于一些搜索因节点限制而终止,许多搜索访问过节点数要少于5个。
    3.6 死活搜索
    不是所有的程序都做明确的死活分析,很多程序对此使用了战术搜索。MFG用与它的战术搜索过程类似的方式作死活分析,除了它是在块上作死活分析而不是分析串。
    一个静态死活评估器在多步过程中确定每个块的死活状态,而没有以从简单的结构中进一步产生复杂结构的方式向前搜索。静态死活评估器使用“战术家”并且为棋块中的每个合适的串至少调用两次。
    死活搜索是直接面向目标的(例如,拯救或杀死一个棋块)。如果在一个特定点没有获得搜索目标,合适棋步由死活搜索引擎自身的棋步产生器产生,并继续搜索。为了在一次死活搜索期间确定目标是否已经达到,静态死活评估器在每个点被调用。死活搜索引擎使用深度优先α、β搜索,每一个特定的枝的搜索深度由启发式决定。搜索树的大小是强制性的,通常可以达到7层的深度和20个节点的大小。死活搜索是很慢的,整棵树要装到缓存里以减少花在重复搜索上的开销。死活搜索的缓慢也意味着它不会被用在全盘评估中。
    3.7 势函数
    势是一种围棋概念,它表明了每一方棋子对空点的最大可能的控制潜力。通过确保开局时子力投放不过于集中,棋手在后面的对局中将取得最大限度获得领地的机会。
    势通过势函数建立可计算模型(Zobrist,1969;Ryder,1971;Chen,1989)。通常,子力以盘上每个点的辐射影响值的和(黑白子辐射正负相反的值)对周边的点施加辐射影响(MFG的黑白子的势是分离的)。子力辐射按距离函数递减:GI是2的距离次方分之一,MFG是距离分之一。但过于依赖势函数的程序表现不佳(EX和Go4不再使用势函数,尽管Go4的辐射函数很象一个势函数,EX采取另一些措施,象同色点或可联接点的距离)。
    应用势的启发包括确定联接性和敌子(GI),以及确定领地(MFG)。MFG的块势初始值依赖于块的强度等,强壮的块比弱块或将死的块辐射更大的影响。这也意味着死块辐射负影响等,因为它对敌方有利。在MFG和GI中势都没有通过子辐射;MFG也没有通过敌链辐射影响。

4. 讨论
    当前的围棋程序都使用了一定量的“知识”。由于建立在设计者下棋成功经验的启发之上,每个程序都可被看作一种(可能是含蓄的)围棋理论的一次以经验为依据的实验。围棋理论成立的关键要靠数据结构的选择,因为它们决定了编码不同类型知识的难易和应用这些知识的计算开销。随着程序员同时在围棋和电脑围棋方面获得技能,程序会有发展(例如,在过去的十五年中随着 Fotland 的棋力从15级发展到2段,MFG也增长了棋力并且代码长度增加到目前的4万行)。程序的性能由它最弱的部件决定,而向程序增加新知识的难易是提高程序性能的重要部分。
    由此可见,电脑围棋领域在关于怎样构筑一个围棋程序或者指配不同围棋知识的优先性(例如,Go4注重联接性而MFG注重死活)方面还没有一致性可言。必须提到的一点是:关于人类是怎样下围棋的至今也没个统一的说法。这是目前认知科学研究的一个课题(见Saito & Yoshikawa,1977,作为回顾),这个领域的任何进展都会对围棋理论有个直接的促进,并可能导致电脑围棋程序算法的改进。
    本文比较目前做得比较成功的几个程序,通过这项工作,我们在博弈树搜索的框架内分析了围棋,并通过对示例电脑围棋编程的观察把有关的问题暴露出来。这种困难在电脑围棋领域是常识,但在更为广泛的人工智能范畴却很少被人们认识和接受。围棋全盘评估需要确定棋块的死活状态,不管是通过死活搜索还是战术搜索,评估是非常消耗计算资源的。缺乏快速有效的评估函数是电脑围棋遭遇的一个基本问题,并且和巨大的树枝因素、用户和电脑比赛的实时需求(一般来说,相对于国际象棋的每秒180步围棋每秒只有24步)等搅和在一起。因此,计算机国际象棋通常要用到的完全广度博弈树搜索在电脑围棋里是行不通的。
    除了所列出的围棋领域固有的问题外,本文还探讨当前的程序怎样地处理这些问题,由此为未来的围棋程序员提供一个跳板。请注意电脑围棋是个商业的领域,程序本身(不是学术论文)就是它的主要产品。跟其它的参考不同的是,这里报告的细节都已经通过个人交流征询了(慷慨贡献自己的知识的)程序作者本人的意见,并且有相关的电脑围棋邮件列表和FTP站点的信息为依据。
    电脑围棋的挑战性在于要扩展当前的围棋理论或发展新理论——特别是与评估有关的,针对实时限制设计合适的数据结构和算法,解决知识瓶颈。目前还没有一个有力的程序使用学习技术,尽管有过几次这样的尝试(如,Pell,1991;Schraudolph, Dayan & Sejnowski,1994;Donnelly, Corr & Crookes,1994)。回顾这些程序已经超出了本文的范围,但我们推测这些程序也没有成功,因为它们的设计者的含蓄的围棋理论缺乏对围棋复杂性的必要理解。怎样把学习能力赋予现有的程序(或者它们暗示的围棋理论)是个等待解决的问题。
 

致谢
 
    感谢Ken Chen、陈志行、David Fotland、Martin Muller 和Mick Reiss向我们提供有关程序的细节和对本文不无裨益的反馈。

 


[注:本文翻译属义务工作,欢迎指出不当之处,也欢迎转载此文——指明出处即可]
2000.04.28

中文电脑围棋小组1999-2000

异军 :摘取珠穆琅玛峰顶的明珠
 

一 入门引路须口授

    最早的《海洋》是96年底在DOS下用C语言写出来的。当时看到一个软件《多面围棋》(MFGO),即后来成为98年应氏杯世界冠军的Fotland的DOS下的老程序,界面很漂亮,功能也不错,因此有把它汉化的想法。试验几次后,觉得单改界面意思不大,那么自己写一个吧。
    用了大概12天的时间,把程序的基本部分写好了。 做了一个海洋上巨轮航行的漂亮封面,又通过修改调色板,画了一个颜色很真实的棋盘,棋子边设上阴影,棋子上画上反光。棋子分串、算气、落子、提子、重画棋盘、悔棋、禁着等模块比较简单,写出来细心调试即可通过。打劫和保存文件则复杂一些,当时还没有SGF这种文件格式,用的是自己作的文件格式。
    因为没有什么资料可以参考。所以主要功能是输入棋谱,下棋只是布局几板斧而已,后面则无招可出。
    如何让电脑判断棋盘某个点价值的大小,这就涉及到很多人工智能的知识和具体围棋数学模型的建立。博弈树和图论的理论基本上是懂得的,围棋方面业余4段的棋力对于编写围棋程序那是绰绰有余的,但是还是难以下手。所以很长一段时间内,只是断断续续把《海洋》的辅助功能写一写,人工智能的模块没有什么进展。
    直到看到围棋报上连载的世界冠军陈志行教授写的《电脑围棋小洞天》(现在可以到围棋报电子版http://www.wqb.com.cn过刊中查询含“洞”字的文章),才逐步对电脑围棋的世界最高水平有了一些了解。陈教授为了推动我国电脑围棋事业的发展,把自己的研究成果无偿公开,其胸襟之宽广,令人敬佩。
    后来陈老师对我讲,那些文章只是提供一些基本思路,没有具体的设计方法。但是我觉得这就够了。
    看完《电脑围棋小洞天》中的大部分技术文章,用一年的时间起码可以编出一个20级水平左右的围棋对弈软件,如果做不到的话,那么只能说是计算机软件编程水平差得太远。
    大多数电脑围棋开发人员是用C/C++来编程,一般程序量都在几万行以上,而且必须开发自己专用的各种数据库管理系统,如定式库、模式库等。陈老师是用汇编语言,因为他使用得比较多,所以他觉得是非常好用的。但是汇编程序则需几十万行乃至上百万行源程序。日本99年新出现一个实力非常强的程序《遥远》也是用汇编语言,陈老师对我说,那个程序核心引擎比手谈大一倍,以致于用DEBUG程序竟然无法调试,令作者大伤脑筋。
    英国的Reiss和美国的Fotland都拿过世界冠军,他们的围棋水平并不高。目前开发围棋程序大致上围棋的棋力有业余2、3段就够用了,但是编程能力越强越好,而且要求有极高的独创能力,极其严谨的逻辑思维能力,丰富的想象能力,坚韧不拔的意志。
    如同攀援世界绝顶的珠穆琅玛峰,雪山看上去很美,但是越往空气稀薄的顶峰走,越是艰难,到了最后强烈的自信和顽强的毅力可能比技术原因更加重要。应氏杯世界电脑围棋锦标赛是台湾应昌棋围棋基金会在1985年创办的,台湾的计算机程序员得天时地利人和,编出了不少围棋对弈程序,也拿过世界冠军,可如今大多数人已经放弃了这项研究。中国科学院和西北大学利用国家科研基金开发过围棋对弈程序,但是后来也没有坚持下去。   

二 用力日久豁然通

    如果以现在电脑的速度,要深入彻底地把围棋盘上的问题计算清楚,可能一盘棋几百年也下不完。所以必须要依靠各种知识和一些比较好的数学模型尽量简化所要思考的问题。但是对当前局面评价得太简单的话,那么下出的招法效果不佳。要想下出比较好的着法,肯定要仔细思考,那么速度就会慢下来。如何解决这其中的矛盾,就体现出每个人的风格的不同和电脑围棋程序的水平所在。
    《海洋》后来用Borland C++开发出Windows版本,在1999年应氏杯的时候,陈志行教授强烈建议异军改用VC++来编程,理由是微软的产品与Windows的联系比其它公司做得更好。将《海洋》改用VC++ 6.0重新编写后,感觉利用控件编程确实可以加快界面设计的速度,可节省出时间来进行核心部分的设计。
    围棋程序在某点下子必须事先评估该点可能带来的价值。因此程序最核心最复杂的部分应该是对给定的一个局面进行形势判断。《海洋》形势判断的方法基本是以下步骤:
    1 计算棋盘上的黑白串的气数,根据气数清除盘面上的死子,并记录下来。
    2 计算串的安全性。为节约时间规定三气以上为安全,对一气、二气进行用博弈树的搜索法来进行判断安全与否。先进行歼灭测试,再进行逃出测试,根据结果进行判定,记录在串状态数组中。有时搜索树的计算量会极为庞大,特别费时。
    3 计算每个棋盘上存在的子对周围点的影响值,海洋采用的是黑值19,白值为-19,每隔一路则影响力减一。在角、边、中腹的辐射长度是不同的。如果有子挡在中间,还须计算绕路的长度。影响判定分简单判定和最终判定二次进行。最终判定是根据串状态数组和下面计算出的块状态数组综合评估得出的。
    4 分块。以影响分数组为依据把黑子或白子和它们控制的空位一起分成各个块。分块也分为简单判定和最终判定二个过程。
    5 计算块的安全性。分为死块、活块、不确定块。评估的过程比较复杂,要反复进行好几次,运用了串状态数组、影响数组、块状态数组、块记录数组等。经常需要用局部搜索法,必须评估块的自由度、块的眼位、块结构的强弱,相当耗时。
    6 得出一个当前局面的黑方和白方目数或子数的结果值。这个值有的时候《海洋》所计算出的和人工计算是完全吻合的,很多时候是有偏差的。
    程序非法提子、内存溢出、死机、无故不走棋等种种料想不到的错误纷拥而至,可能写一天的程序,需要三、五天来调试才能把所有隐蔽的错误全部清除。经过山重水复疑无路般长时间的排错,当柳暗花明的时候,用网上流行的话来讲,那真是“酷毙了”!
   

三 屈伸开合听自由

    围棋程序偏于进攻还是偏于防守,可以自由地发挥个人的风格。Micahel Reiss的程序《GO4++》典型的棋风是一上来占两个三三,然后分投大场,再平稳地拆二或大飞。《手谈》是比较擅长攻击的,对敌方棋形上的破绽感觉非常敏锐,常常一出手就打在要点上。
    《海洋》目前思考的方法是先防守对方的攻击,再伺机对敌方进行冲击。
    1 布局时先占角,再走定式。《海洋》准备了黑定式和白定式两套。
    2 对方落子后,如果打吃我串,或企图歼灭我弱串,攻击我弱块,一般情况我方必须想方设法进行防守,如果挽救弱子的可能性不大,则放弃援助。
    3 《海洋》的模式库收集不少有用的模式,如冲断小飞须挡,刺跳形须接等。模式的优先级是比较高的。
    4 防守我方断形,须用到局部搜索法,防守弱块须用到块状态数组。
    5 我方没有需要防守的子后,对敌方一气串、二气串、三气串、断点、小飞形、跳形、弱块等进行攻击。
    《海洋》的棋力现在可以战胜Reiss的比较弱的老程序GO2,与《手谈》、《GO4++》相比还差得极远。主要是因为对块的分析还不能做到很精确的缘故。


四 应敌变化示神奇

    陈志行教授已经连续三次失去了重夺世界冠军的机会。而国内新一代程序除《乌鹭》可以进入世界前六名的行列,其它程序如《围棋之星》、《烂柯》、《海洋》、《北国之星》等水平与顶尖程序差距是非常大的。这与国内电脑围棋赛事极少是有密切关系的。正如李宁所说,体操世界冠军是赛出来的,而不是练出来的。比赛对于选手水平的促进是所有选手都深有体会的。只有与高水平强手不断较量,不断增强自身的实力,“由招熟而渐悟懂劲,由懂劲而渐近神明”。才能深入研究人工智能深层次的规律,在世界电脑围棋赛上展示最新最强的科研成果。
    计算机界的最高荣誉奖是为纪念图灵而设立的“图灵奖”。图灵是英国的一位数学家和世界上最早最杰出的计算机科学家,他被后世尊称为“人工智能之父”。他毕生的心愿是造出一台让观察者分辨不出是机器还是人在思考的计算机。当然那个时代没有条件来实现。
    国内的网站可以拿出200万元支持大学生登山,但是目前还没有一个网站包括围棋网站来组织全国电脑围棋赛,可能是因为了解得不够。网络时代常谈“注意力”,而围棋是我们的国粹,电脑是高科技的象征,全世界有近五千万围棋爱好者,“深蓝”击败国际象棋世界棋王的新闻恐怕至少引起十几亿人的关注。知道《手谈》这个世界冠军围棋对弈软件的在中国至少有二、三百万人,这么高的“注意力”难道还引不起网站决策者的注意吗?期待有远见的网站能组织各种形式的全国电脑围棋赛。
    希望中国的程序员们奋发图强,不断提高程序的水平,争取早一天能摘下这颗珠穆琅玛峰顶上的明珠--世上最高难度的人工智能课题--电脑围棋。
 

电脑围棋门径 ——陈志行   1、显示棋盘棋子及其他必须显示的内容;设置黑白选择、进子及有关的功能。 2、设置计算和记录棋子串气数的功能,赋予提子和禁着的功能。 3、设计一种函数,表征每个棋子对周围的影响,用以划分势力范围,作为静态形式判断的基础。 4、对盘上各着点分别试进黑子和白子,比较进子前后的静态形势,以估算该点的进子价值,成为着点选择的基本依据。 5、用多步搜索法判断棋子串是否可以歼灭或逃出,并分别记为“死”、“活” 和“半死”。这种搜索还可以包括“双吃”(叫吃一串后歼灭另一串)的可能性。 6、规定开局时的一些大点及其价值,设置随机地选取等价大点的功能。开局大点可以纳入定式的范畴。 7、把棋子划分为块,考虑各块的眼位和出路以及块间的相邻关系,以估算各块的危险性(负目数),从而构成静态形势判断的完整体系。 8、建立棋形效率模式,指明愚形、忌形和急所,从而增建由静态形势判断所估算的进子价值。 9、估算棋子串被歼与逃出的静态形势 以估算歼逃价值。 10、设置定式库,规定定式中每步的价值;设置从定式库取数据来行棋的程序段。 11、设置大场、中盘侵分、收官等的数据库和程序段。 12、记录先手着点及其价值,以供寻劫、收官、做眼等参考。 13、设置利用以上各种数据按照适当方式选择着点的程序段。 14、设置在优势和劣势下采用不同策略的功能。 15、设置搜索广度和深度的选择功能使思考时间得以随时调整。 16、设置终局判断、PASS(弃权一手)及在对方PASS后如何处理的功能。 17、设置棋谱记录、计时、发声、显示形式对比、计算胜负等功能。 首先必需完成1、2部分。其次不妨先解决3、4,这样程序就算是会下棋了。不过,叫吃也不会逃,或者只会逃叫吃却不懂征子,也是不堪一击的。这样应解决5。第一步可以先解决二气问题、即三气就算已经逃出。 棋子分块以及眼位估计是获得战斗力的重要环节。这一功能解决后,棋力可望达到高手让不了30子的程度。然后设置行棋模式又是一个关键,解决后让25子恐怕也困难了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值