dlshogiは、詰み探索にdf-pnを実装しているが、ループ局面が正しく判定できない場合があり、解けない問題がある。 実戦では、ほぼ現れないので、実用上は問題になっていない。 実戦では、35手くらいまでの詰みは数秒で解ける。 それ以上長い詰みは、時間がかかる場合があるため、探索の深さを制限している。
より長い詰みを高速で解けるように、df-pnをより完全な実装にしたいと考えている。
GPS将棋(OpenShogiLib)のdf-pn
オープンソースのdf-pnの実装では、GPS将棋(OpenShogiLib)のdf-pnがループ局面やガベージコレクトに対応した完全に実装になっている。
そこで、GPS将棋のdf-pnを、Aperyベースのdlshogiに移植することを試みる。
まず、手始めとして、GPS将棋をビルドして、デバッグできようにした。
ソース修正
ソースをダウンロードして、手順通りビルドすれば良いが、Ubuntu 22.04のg++では、コンパイルエラーになる箇所があるため、OpenShogiLibの以下の箇所の修正が必要である。
修正差分: Fix compile errors · TadaoYamaoka/osl@3528a3f · GitHub
修正したソースを、GitHubにプッシュしている。
OpenShogiLib: github.com
デバッグ環境
OpenShogiLibをビルドすると、dfpnstatというコマンドが生成される。
これをVSCodeで、gdbを使用してデバッグする設定を行う。
launch.jsonに、以下を記述する。
"configurations": [ { "name": "dfpnstat", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/sample/checkmate/dfpnstat", "args": ["-d", "-l", "11451419", "~/csa/zuko03.csa"], "stopAtEntry": false, "cwd": "${workspaceFolder}/sample/checkmate", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "Set Disassembly Flavor to Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ] } ]
argsのcsaファイルは、適当なテスト局面をcsaで与える。
例:将棋図巧第3番(zuko03.csa)
V2.2 N+ N- P1 * * -FU * -KI+TO * * * P2 * +FU * -FU * -FU-FU * * P3-KY * +FU * -KI * +GI-RY * P4+FU * +KA * +FU * -TO * * P5 * -FU * * * -KY * * * P6 * -OU+KE * * * * * * P7 * * * * * * * * * P8 * * +UM * * * * * * P9 * -HI * * * * * * * P+00KI00GI00KE00KE00FU00FU P-00KI00GI00GI00KE00KY00KY00FU00FU00FU00FU00FU +
"-l"で、探索局面数上限を設定する。
makeする際に、
make debug
で、デバッグ情報ありでビルドする。