日升家园

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 499|回复: 0

中国象棋软件引擎审局揭秘系列4下

[复制链接]

864

主题

1936

帖子

2191

积分

理事长

Rank: 9Rank: 9Rank: 9

UID
39
精华
0
威望
3
贡献值
24
金币
21325
在线时间
1237 小时
注册时间
2013-8-28
最后登录
2021-7-19

优秀版主论坛元老

QQ
发表于 2013-10-25 14:12:32 | 显示全部楼层 |阅读模式
两者的差别列举如下
      a. 延伸的差异, 根据特定棋形做了depth+1的搜索, 也就是越搜反而越深(当然TogaII有手段防止过深)
      b. 剪枝的差异, 包括打开futility, delta, 并且对底层也做了history pruning
      c. 对棋步稳定的盘面(只产生一个PV路径), 用渴望窗口搜索, 减少搜索量
      d. 对危险情况的搜索的加强

      两者差异原理分析
      简单概括TogaII的改进,那就是利用国际象棋的知识调整了fruit的搜索树,对危险的盘面进行了更深的搜索,否则就剪掉.

      首先,TogaII最有效的改进,是在叶子附近,利用history
      value把证明曾经无效的叶子节点丢弃掉,这是一个非常有效的算法,这里面的道理值得我们深思?为什么我们不能够发现一个这样的算法呢?

      如果光是观察futility和delta剪枝法, 我想肯定会有人对我提出疑问? 不是说这些根据子力情况剪掉的分支会漏掉杀棋步吗? 为什么还打开剪枝,
      OK, 我来一个简单的回答, 假如已经是用了知识判断过这类分支并不危险, 那就可以剪掉了.

      TogaII能改进fruit的原因基于对国际象棋的深刻理解(也许是大量的测试的证明), 它的剪枝和延伸, 是相辅相成的, 如果有人想尝试这个方向,
      千万不要只开剪枝或者只加延伸

      这个方向, 是在搜索树中, 加入对棋类知识的判断. 调整搜索树更适合某种棋规.

      4. fruit算法应用于中象引擎的分析及中象引擎算法改进分析

      下面的内容,是基于上述阐述的一些具体应用的例子,可对引擎做出一定的修正

      a. nullmove改进

&#160; &#160;&#160; &#160;nullmove限制条件中, 当depth<=4时, 进入nullmove. 这种情况会忽略了depth=1可能产生的杀棋步,
&#160; &#160;&#160; &#160;当审局的知识缺乏该方面的内容时, 会漏掉杀棋步

&#160; &#160;&#160; &#160;这个时候, 可以根据自己引擎的审局知识的特点, 做depth=1的search_verify

&#160; &#160;&#160; &#160;代码如下

&#160; &#160;&#160; &#160;if (depth<=4)
&#160; &#160;&#160; &#160;&#160;&#160;do_nullmove;

&#160; &#160;&#160; &#160;&#160;&#160;if (nullscore>=beta)
&#160; &#160;&#160; &#160;&#160; &#160;&#160;&#160;do_search_verify(depth=1);

&#160; &#160;&#160; &#160;这种方法可以避免一些杀棋情况的漏算, 这个也可以算是搜索和知识结合的一个典型例子吧

&#160; &#160;&#160; &#160;b. history pruning改进

&#160; &#160;&#160; &#160;考虑下面的情况

&#160; &#160;&#160; &#160;[炮]吃车1, 车2吃[炮], 车2移动, 和车1移动, 这两个棋步, 会引起同样的history value的减少, 虽然限制了history
&#160; &#160;&#160; &#160;pruning发生在不吃子的情况, 但是, 中象的交换频率远>国象,
&#160; &#160;&#160; &#160;这种情况对fruit中historyvalue<9830就剪枝(60%)显然不适合, 因为中象发生上面的情况要高多了,
&#160; &#160;&#160; &#160;而historyvalue<9834(60%)只要该棋步有一次被检索的情况就会发生, 这个时候, 修正historyvalue<16384*45%,
&#160; &#160;&#160; &#160;可以有效减少误判

&#160; &#160;&#160; &#160;c. futility剪枝及delta剪枝的意义分析

&#160; &#160;&#160; &#160;嗯, 这个, 首先参考TogaII和fruit对比的文章

&#160; &#160;&#160; &#160;futility和delta, 如果不会漏掉杀棋步, 或者, 在不会被对方杀死的情况, 非常有助于扩大自己的子力优势,
&#160; &#160;&#160; &#160;这是这两个剪枝法的机制决定的(注意,这两个剪枝法的依据是扩大子力优势,所以适用的范围是有限的,对双方对杀的盘面是会削弱攻击能力的)

&#160; &#160;&#160; &#160;我建议使用这两个剪枝法, 当然是建立在调整过搜索树以后(避免在容易引发杀棋的盘面使用,常见的手段是判断kingsafety,是否处于被攻击状态中)

&#160; &#160;&#160; &#160;d. 棋步排序的改进

&#160; &#160;&#160; &#160;从PVS搜索的原理出发, 搜索效率取决于搜索次序

&#160; &#160;&#160; &#160;常见的棋步排序是历史步->吃子步->killer->etc, 这是基于最大化子力优势的搜索, 当对杀时, 这种搜索排序效率是非常低的.

&#160; &#160;&#160; &#160;考虑killer棋步,如果能够发生一个killer步的分数是杀棋步,那么调整棋步排序为历史步->killer->吃子步->etc,这样就很好地把杀棋和吃子都结合起来了


&#160; &#160;&#160; &#160;5. fruit算法和象眼的差异, 如何提高象眼的棋力
&#160; &#160;&#160; &#160;通过本篇的介绍, 希望能够把开源的象眼程序, 改进到一个全新的高度, 假如有人希望一起完成象眼的改进, 请站内和我联系

&#160; &#160;&#160; &#160;下面是我认为可以有效提高象眼棋力的几个地方
&#160; &#160;&#160; &#160;a. 基于PV节点的nullmove pruning
&#160; &#160;&#160; &#160;b. qs加强
&#160; &#160;&#160; &#160;c. History pruning及TogaII剪枝法
&#160; &#160;&#160; &#160;d. 棋步排序
&#160; &#160;&#160; &#160;e. hash的改进
&#160; &#160;&#160; &#160;f. IID算法修正
&#160; &#160;&#160; &#160;g.search root move list

&#160; &#160;&#160; &#160;6. 建立以kingsafety为核心的审局, 以及审局模型的详细介绍

&#160; &#160;&#160; &#160;a. 对盘面区分阶段, 不同阶段采取的策略是不同的, 开中残差异是很大的

&#160; &#160;&#160; &#160;实际上, 开局通过开局库和子力位置分+若干简单知识, 是很容易走出正确的棋步盘面的, 这个研究不深, 我更多是依赖开局库解决这个问题

&#160; &#160;&#160; &#160;残局时候, 调整位置分表, 判断子力组合, 这个时候因为子力很少, 基本上难以进取, 更多是应该考虑防守, 控制搜索的危险程度和给予适当的分数,
&#160; &#160;&#160; &#160;很容易做到这点

&#160; &#160;&#160; &#160;中局是比较复杂的, 下面详细说说我所理解的地方

&#160; &#160;&#160; &#160;b. 对某个阶段的知识, 不要给引擎太多的选择, 避免引擎找出多个PV路径, 引起棋步的来回选择, 如中局, 应该集中思考杀棋或者扩大子力的优势

&#160; &#160;&#160; &#160;c. 上面1.讲述了搜索和知识之间的关系, 其中也提及了depth=1时候的杀棋知识评估的重要性, 但是, 只是局限于depth=1的杀棋知识,
&#160; &#160;&#160; &#160;我们的盘面判断力还是很有限的, 这个时候怎么办? 我们能不能对depth>=2的情况进行评估

&#160; &#160;&#160; &#160;我提供一个实践的方法, 那就是分层次打分.

&#160; &#160;&#160; &#160;比如: 三子归边的判断, 我们通过以下三种层次评分
&#160; &#160;&#160; &#160;&#160;&#160;(a) 有沉底炮, +分 (depth=3)
&#160; &#160;&#160; &#160;&#160;&#160;(b) 有沉底炮和车可做炮架, +分 (depth=2)
&#160; &#160;&#160; &#160;&#160;&#160;(c) 有沉底炮和车并且马进入了可以助攻的区域, +分 (depth=1)

&#160; &#160;&#160; &#160;刚才在上面的审局和搜索的关系中,我列举了4种知识,并且强调了知识只应该选择有效的,下面分别说说哪些知识是必须的,不在下面列表内的知识,我都不做判断了
&#160; &#160;&#160; &#160;a. 准确的杀型
&#160; &#160;&#160; &#160;&#160; &#160;利用位置分值提示车马兵攻击王周围,依赖搜索完成
&#160; &#160;&#160; &#160;b. 模糊的杀型
&#160; &#160;&#160; &#160;&#160; &#160;(a) 当头炮 (空头炮,镇中)
&#160; &#160;&#160; &#160;&#160; &#160;(b) 底炮 (三子归边)
&#160; &#160;&#160; &#160;&#160; &#160;(c) 双车杀
&#160; &#160;&#160; &#160;c. 子力组合,只做会引起问题的子力组合判断,如兑子后双马不佳
&#160; &#160;&#160; &#160;d. 某些特别容易出问题的知识的补充

&#160; &#160;&#160; &#160;7. 国际象棋Rybka的胜利以及将来棋软发展的一些展望

&#160; &#160;&#160; &#160;一些未来的研究方向, 所以个人的意见应该是一些胡言乱语,仅作笑料

&#160; &#160;&#160; &#160;上面所说的一切, 都是基于知识会有一个确定的分数, 但是, 这明显是错误的, 谁能说三子归边是400分,而不是395分呢? 有没有一种方法,
&#160; &#160;&#160; &#160;可以动态评估这个分数, 从而达到知识的最优化呢?

&#160; &#160;&#160; &#160;第二,传说中的根据知识排序棋步的方法

&#160; &#160;&#160; &#160;在国外流行的认为Rybka超越其他软件的原因是因为更聪明的搜索和知识, 从作者言论和Rybka反映的信息做一个猜测(nps超低, 搜索准确度超高),
&#160; &#160;&#160; &#160;一致认为Rybka在搜索和评估中, 都采取了全新的方法

&#160; &#160;&#160; &#160;其中一个流派3moves现在被认为是Rybka最有可能采取的方法(包含了我的理解补充)

&#160; &#160;&#160; &#160;什么是3moves? 首先, 当前盘面移动一步, 对可以攻击的子,计算3步内可以攻击的点集,这个点集每个点都有权重.那么,多个攻击子做交集的时候,
&#160; &#160;&#160; &#160;密度最高权重最高的区域, 就是当前盘面最容易攻击的位置, 这表明了这一个棋步的攻击能力

&#160; &#160;&#160; &#160;当这个棋步能攻击到王或者其他子时, 这自然就是一个好的棋步,这时候根据点集的情况进行算分,自然是非常准确的.
&#160; &#160;&#160; &#160;这种方法超越了子力表和知识分数的局限, 而且更好理解了棋规, 也难怪被认为是最有可能的.
&#160; &#160;&#160; &#160;2006.12.4 08:13 作者:fenon
&#160; &#160;&#160; &#160;介绍一下fenon曾经编写过的象棋软件程序
&#160; &#160;&#160; &#160;2004. 和台湾Poor合作, 推出棋海无涯, 并获邀参加计算机奥林匹克比赛
&#160; &#160;&#160; &#160;2005. 棋海无涯更新至version 4, 获得raylau的帮忙, 并于该年获得奥赛银牌
&#160; &#160;&#160; &#160;2006. 重新编写引擎, 并提供相关技术给Poor, 帮助Poor发布新版本象棋世家v5 build 95xxx系列
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;在过去研究象棋引擎/人工智能的过程中, 有一份恬然/投入的精彩!
                                                                                                           作者:fenon
在攻与防的對立统一中寻求突破...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|日升家园 ( 蜀ICP备18009257号 )

GMT+8, 2024-5-17 18:30 , Processed in 0.066277 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表