“手谈”的编程技术

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

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

棋子的分块

“手谈”的棋子分块与陈克训提出的相似, 首先决定于棋子的“影响”, 再辅之以某些连接模式。

**影响

“手谈”的影响函数与陈克训的明显不同。一个正常白子的影响是: 黑子辐射出负数的影响。

死子辐射出反号的影响。半死或受伤的棋子辐射出较少的影响。

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

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

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

**块的构成

相互邻接的白非死子、黑死子、以及 1 或超过 3 小点的空点合并成一白块; 邻近的、相互不能分割的白块再合成一白块。黑块亦按类似的方法构成。

块危险性估算

块危险性可表为有适当单位的一个量。围棋中常用于形势判断的单位为目。块危险性也可以用目为单位。

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

**自由度

陈克训把自由度解释为块周围的敞开程度。

块的自由度可表为封锁它所需的手数。业已探明,有关的函数应为指数型的:封锁手数每增1,块危险值应减半。

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

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

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

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

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

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

模式与效率

“手谈”棋力的另一关键是进子价值的效率修改。好着点(急所、手筋等)设为正效率,而坏着点(愚形、俗手等)设为负效率。

进子价值被乘以一个因子:正效率对应的因子大于1,负效率对应的因子小于1。

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

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

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

这份材料由“手谈”的作者陈志行提供。
1999-03-14