GithubHelp home page GithubHelp logo

xqbase / eleeye Goto Github PK

View Code? Open in Web Editor NEW
314.0 314.0 104.0 1.65 MB

ElephantEye - a XiangQi (Chinese Chess) Engine for XQWizard with Strong AI

Home Page: http://www.xqbase.com/

License: GNU Lesser General Public License v2.1

C++ 40.71% Shell 0.16% HTML 28.45% PHP 0.13% Java 1.63% C 9.16% Inno Setup 1.10% Batchfile 0.42% Visual Basic 6.0 18.25%
artificial-intelligence board-game chinese-chess xiangqi

eleeye's Issues

关于禁止着法的问题

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

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

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

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

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

谢谢。

建议用Rust语言

建议用Rust语言重写一遍。Rust不只是安全,运行速度还有概率快过C语言,C语言的运行速度不一定能追上Rust。

建议转换成UTF-8编码

目前的编码是GBK,在Linux下默认字符集是UTF-8,输出的中文都是乱码(我就试了一下联赛引擎)。用iconv转换成UTF-8之后重新编译即可正常输出中文。

建议通过类似的脚本批量转换成UTF-8字符集,以处理多平台的中文乱码问题

for file in *.cpp
do
    iconv -f GBK -t UTF-8 -o "${file}.new" "${file}" && mv -f "${file}.new" "${file}"
done

关于重复裁剪的问题

仔细的阅读了你们的代码,关于重复局面裁剪,你们采用了判断长捉和长将的方法来裁剪。
的确,如果不裁剪,程序会出现死循环。
我认为裁剪的一个思路就是:如果该点 在博弈树中该点到根的路径上 出现过,则这个点就没有意义再搜索下去。换句话说,如果对手下了一步棋给我,这个局面 在到根路径上 出现过,则对手下这步棋一定是没意义的。
那么,我有个疑问。我看了你们的代码,你们是在递归搜索函数一开始的时候就进行重复裁剪的。可是为什么不选择在生成着法的时候就进行裁剪呢。虽然后者会有其他的代价,但总的来说,还是后者的“搜索剪枝能力”更强。

为什么空着裁剪那么厉害?

我把你们search.cpp中的空着裁剪打了注释,同样让引擎搜10个局面,每个都只搜1秒。
我发现有空着裁剪比没有空着裁剪要多搜2层!
有空着裁剪时,1s可平均搜9层,没有只能搜7层

之后,我在自己的引擎上尝试了下空着裁剪,搜索层次大大提升,而且没有搜挂

我百思不得其解,为什么?你们能为我解答一下吗?多谢
空着裁剪的一个条件是要当前局面的分数不小于200分,但这种局面很多吗?为什么会裁剪得那么厉害?

movesort.cpp第134行到141行

// 2. MVV(LVA)启发,可能要循环若干次;
case PHASE_GOODCAP:
if (nMoveIndex < nMoveNum && mvs[nMoveIndex].wvl > 1) {
// 注意:MVV(LVA)值不超过1,则说明吃子不是直接能获得优势的,这些着法将留在以后搜索
nMoveIndex ++;
__ASSERT_PIECE(pos.ucpcSquares[DST(mvs[nMoveIndex - 1].wmv)]);
return mvs[nMoveIndex - 1].wmv;
}

我认为应该改成这样:

// 2. MVV(LVA)启发,可能要循环若干次;
case PHASE_GOODCAP:
if (nMoveIndex < nMoveNum && mvs[nMoveIndex].wvl > 1) {
// 注意:MVV(LVA)值不超过1,则说明吃子不是直接能获得优势的,这些着法将留在以后搜索
nMoveIndex ++;
__ASSERT_PIECE(pos.ucpcSquares[DST(mvs[nMoveIndex - 1].wmv)]);
return mvs[nMoveIndex - 1].wmv;
}
else {
nPhase = PHASE_KILLER1;
}

否则 NextFull函数永远不会跑到 case PHASE_KILLER1 部分,也自然不会跑到后面的 case PHASE_KILLER2,case PHASE_GEN_NONCAP,case PHASE_REST等部分。。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.