xqbase / eleeye

ElephantEye - a XiangQi (Chinese Chess) Engine for XQWizard with Strong AI
http://www.xqbase.com/
GNU Lesser General Public License v2.1
326 stars 107 forks source link

关于禁止着法的问题 #5

Closed peteryuanpan closed 7 years ago

peteryuanpan commented 7 years ago

看了2天中国象棋官方规则,读了你们的代码

我发现,eleeye并没有对禁止着法进行分析,是吗,而是采用读入界面给的banmoves来排除禁止着法。然而,现在的象棋巫师可以分析禁止着法吗?我记得象棋百科网上说是没有这个功能的。

我看了genmoves.cpp中 int PositionStruct::ChasedBy(int mv) const 函数,关于捉的检测。这个函数只对上一步走了 车、马、炮 后进行捉的检测,而根据官方规定,捉的检测当然不止此。

我也注意到eleeye是有对长将和长捉进行判定的,一旦在搜索时出现长将或长捉,会判定为无害裁剪而剪枝掉。

我想问的是,官方定义的很复杂很复杂的 禁止着法 的那一套规则,不把其加入引擎中,不会有大问题吗?

谢谢。

auntyellow commented 7 years ago

README里提到eleeye只识别长将而没有识别长捉,其实后来部分长捉已经支持了。 正如你看到的,只对亚洲规则中最常见的情况做了判断,其他情况,比如捉士象兵,就不做判断了,因为情况非常复杂。 另外,这里的ChasedBy还有很多Bug,最典型的是车捉双炮,车会被认为是炮架子而误以为双炮连保,把原本真的长捉(应当判负)误判为长捉有根子(判和)。

peteryuanpan commented 7 years ago

那,你们有进行对这个BUG进行修改吗? 在象棋巫师付费升级版引擎里。这个BUG我觉得还是挺重要的。

除此外,我想多问一个,象棋旋风算是目前最厉害的引擎了吧,它有没有用到机器学习相关知识?

auntyellow commented 7 years ago

付费版引擎里没有这个BUG。

peteryuanpan commented 7 years ago

关于“当前局面是否是禁止着发”的判断,我认为按理来说,是能够编程判断的。虽然可能会很复杂很麻烦(我看了11年的官方规则,认为规则描述的也不是非常清晰)。关于这个判断,你们可以公开算法/代码吗?或者有没有哪里有公开的?

非常感谢,我现在在做一个小引擎,需要考虑这个。

auntyellow commented 7 years ago

无论是亚洲规则还是中国规则,都没有完全匹配的算法,因为规则本身并不是非常严格的。在eleeye里,只针对亚洲规则做了非常简单的处理,能识别90%以上的长打,付费版引擎对亚洲规则匹配得更好,但不可能100%匹配的。

peteryuanpan commented 7 years ago

明白了,多谢,根本原因是规则的不严格