eye_catching

「Sayuri」とは、僕が作ったオープンソース(MIT License)の UCI対応チェスエンジンです。
GitHub で公開しています。

目次

チェスエンジンとしての特徴

feature

特徴 1 : UCI に対応している

「UCI」とは GUI とエンジン間の通信プロトコルのことです。
「通信プロトコル」というのは通信するためのルールで、どのような内容のデータをどのタイミングでやり取りするかの約束事です。
「UCI」では「UCI コマンド」と呼ばれるテキストデータをやり取りすることで実現されています。

uci

ちなみに将棋エンジンの世界では「USI」という「UCI」をベースにしたプロトコルが主流のようです。

特徴 2 : 本格的な探索アルゴリズム

「Sayuri」は個人で作ったエンジンではありますが、以下のような本格的な探索アルゴリズムを搭載しています。

  • 指し手の生成に「マジックビットボード」を使用。
  • 「トランスポジションテーブル」「ヒストリーヒューリスティクス」「キラームーブヒューリスティクス」などの「簡易学習機能」。
  • 「Futility Pruning」「Aspiration Windows」「Late Move Reduction」「Null Move Reduction」「Internal Iterative Deepening」などの「前向き枝刈り」アルゴリズム。
  • 「SEE」を使った「ムーブオーダリング」。

他にもいくつか搭載していますが、それらは「Sayulisp」を使って有効・無効を設定したりパラメータの調整をすることができます。

特徴 3 : チェスの戦略理論に忠実な評価関数

これは「長所」でもあり、実は「短所」でもあるのですが、「Sayuri」はかなり細かなところまで評価関数で評価しています。
そしてそれらはチェスの「戦略理論」に従った評価関数であるため、「Sayulisp」を使った調整が容易にできます。

さらに、盤上の駒の数に合わせて評価関数のウェイトを変化させることにより、ゲームのフェーズに従って評価方法を変えることができます。
もちろん各ウェイトをどのタイミングでどのように変化させるのかも「Sayulisp」で調整可能です。

チェスエンジンとしての強さ

strength

エンジンを同じハッシュサイズ、同じスレッド数で設定した時の「Sayuri」の強さは、チェスエンジンの中では比較的弱い方です。 (それでもチェス中級者レベルの僕より圧倒的に強いです。)

この弱さの主な理由は「カスタマイズ性」を重視したため、ハードコーディングされていないアルゴリズムがものすごい数あるからです。

普通のチェスエンジンでは、どの「枝刈りアルゴリズム」を使うか、それら枝刈りを「どのパラメータ」で実行するか、どの「特徴」をどれくらいの「ウェイト」で評価するかなどはソースコードに直接コーディングされているので、ビルド時に上手く最適化され、非常に高速に動きます。

しかし「Sayuri」は「Sayulisp」でそれら全てをカスタマイズできるという特徴があるため、ビルド時の最適化がされず探索速度がとても低くなります。

なので「Sayuri」は「強いチェスエンジン」が好きな方にはあまりふさわしくないチェスエンジンといえます。

Sayulisp - 独自 Lisp インタープリタ

sayulisp

「Sayuri」の最も他のエンジンとは違う特徴は「Sayulisp」という、独自 Lisp のインタープリタです。
「Scheme」を元に作っていて、「Scheme」が使えるならすぐに理解できるようになっています。

「Sayuri」の実行コマンドを、

$ sayuri --sayulisp <スクリプトファイル名>

にすることでスクリプトを実行できます。

「Sayulisp」でできることは

  • 探索関数のカスタマイズ。
  • 評価関数のウェイトのカスタマイズ。
  • Sayulisp スクリプトの実行。

です。

Sayulisp Editor

「探索関数」や「評価関数」のカスタマイズには「Sayulisp Editor」というツールを使うと簡単にできます。 (Sayulisp Editor on GitHub)

「Sayulisp Editor」で作成したスクリプトは「Sayulisp」の実行コマンドで通常の「UCI チェスエンジン」として実行できるので、GUI のエンジンの起動コマンドに

sayuri --sayulisp <スクリプトファイル名>

を設定してやれば問題なく動きます。

Sayulisp インタープリタとしての応用

「Sayulisp」でチェスエンジンを「ライブラリ」として使うことで、「チェス用便利ツール」を作成することができます。
GitHub の Tools ディレクトリにいくつかの使用例があります。

主な使用法としては、

  • 「PGN」「FEN」フォーマットを用いたツール作成。
  • チェスを使った「Sayulisp アプリ」の作成
  • 「機械学習」用の関数を用いた「ウェイト学習ツール」の作成

実は、このブログで使われているチェスビューアの「指し手のリスト」の作成に「Sayulisp」が使われています。
チェスの棋譜は普通「PGN」と呼ばれるファイルフォーマットで記録されます。
しかしチェスビューアを「PGN」に対応させるのは「面倒くさい」という理由で、「Pure Coordinate Notation」という記法を使い、独自形式の Javascript のオブジェクトとして直接 Webページに記述しています。
そしてその記述を作る時に「Sayulisp」を使って「PGN」から「独自形式のオブジェクト」を生成しています。

「チェスエンジンにプログラミング言語のインタープリタを埋め込むとか、馬鹿じゃね!?」とか思われるかもしれませんが、少なくとも僕はとても便利にたくさん利用しているのでとても満足しています。


あとがき

「Sayuri」は「強さを追求したチェスエンジン」ではありません。
「Sayuri」は「可能性を追求したチェスエンジン」です。

・・・ごめんなさい、カッコ良く言い過ぎました。
もっと俗っぽく言うと、「『Sayulisp』で何か色々できそう・・・という感じのチェスエンジン」です。
「強いチェスエンジン」が好きな人にとっては無用の長物でもあります。

兎にも角にも、「こんな変なチェスエンジンが世の中にはあるんだ・・・w」ってな感じで受け取っていただければ嬉しく思います。

尚、「Sayuri」に関する「疑問・質問・バグ報告」などは

で受け付けています。 (日本語でも書き込み OK です。)