/var/log/messages

Jun 9, 2016 - 2 minute read - Comments - shogi programming

やねうら王オープンソースプロジェクト

興味深いドキュメントをご紹介頂きました。

開発環境が VS なのでアレなんですが、Linux で動くのだったかどうか。とりあえず空き稼動を使って読み始めることにしました。

ドキュメント見つつで確認が必要なナニを以下に列挙してみます。

  • pext 命令、popcnt 命令
  • engine 配下のソース確認
  • エンジンは標準入出力経由で、とのこと
  • 手番を表現する Color な enum は shogi.h にて定義 (別途掘削
  • 筋は File で段は Rank
  • 盤上の升目も enum で表現されてて右上 (11) が 0 で左下 (99) が 80
  • | な operator 定義していた (別途確認
  • class や struct ではなく enum を使う
  • 筋、段、升目、指し手も enum
  • 升目 (square) は 7bit 必要なのか (81 升)
  • ほとんどすべての enum について is_ok という手続きを用意
  • 指し手 16bit で評価値が 16bit
  • ループ内における shift の最適化な話が出てます
  • 指し手から情報を落とすことによる高速な指し手生成
  • Piece という enum は先後の区別を持っていて変数名は pc
  • 先後の区別の無いものも Piece を使い、変数名は pt
  • pr は Raw Piece (成っていない駒)

Piece について

  • Piece のアイデアは Apery のものとのこと
  • MoveList が指し手生成器で LEGAL が合法手の種別
  • 指し手種別は色々あるので別途確認 (shogi.h にて enum 定義)
  • EVASIONS は王手回避の指し手種別
  • NON_EVASIONS と王手回避のあたり、再度確認
  • 合法手であるかどうかをチェックする手続きあり (legal 手続き)

Position について

  • 指し手は Move という enum
  • do_move 手続きに渡す StateInfo というものは何か
  • undo_move という手続き
  • その局面で捕獲した駒の情報を保持
  • do_move 一回につき、StateInfo のインスタンスが一つ必要
  • 探索は再帰手続きとして書くのでスタックに置いときゃ良い
  • undo する時のために previous というポインタも保持

局面の Hash 値

  • Position#state() が StateInfo の参照を戻すのでそのオブジェクトの key() を呼び出すことで hash が取得できる
  • hash は辞書の鍵にする模様 (この辞書を置換表と呼んでいる模様
  • あら? これ系のソレって何って呼んでたっけ (ナチュラル
  • Zobrist Hash については別途確認
  • tt て置換表のことだろうな (TranspositionTable か
  • 置換表は実装によって異なっている模様