donta1024 / Chess-Commentary-Automatic

3 stars 3 forks source link

チェスエンジン候補 #2

Open AyatsujiP opened 7 years ago

AyatsujiP commented 7 years ago

ひとつのIssueに複数のテーマがあると混乱しそうなので独自にIssue切ります。

チェスエンジンの候補を挙げておきます。 Stockfish (https://stockfishchess.org/) GNU chess (https://www.gnu.org/software/chess/) Komodo 9 (https://komodochess.com/Komodo9-43a.htm)

必須要件としては、  ・プロプライエタリでない  ・評価値出力機能がある  ・読み筋出力機能がある ことがあると思っています。

選定基準としては、  ・APIの充実度  ・GUIとの相性 があるかなと思っています。

interimadd commented 7 years ago

少しだけpythonでチェスエンジンを触っていた時の経験なのですが、 チェスエンジンはいろいろなソフトで使えるようにUCIとかいうフォーマットで 機能が規定されているというイメージです。 http://wbec-ridderkerk.nl/html/UCIProtocol.html

とりあえずnode.jsで動くstockfish.jsを動かしてみました。 FENでポジションを指定してあげて解析を始めさせると、評価値と読み筋はもちろん、 評価値の詳細(キングの安全性、駒の効き、パスポーン、マテリアル)も出力してました。 この辺は棋譜解説に使えそうですねー

出力内容の全文は長いので、下記からどうぞ output.txt

donta1024 commented 7 years ago

interimadd stockfish.jsを動かした実績があるなら、チェスエンジンはstockfishを用いるのが良さそう 評価値の詳細で、キングの安全性、駒の効き、パスポーン、マテリアルなどに加えて、どんな情報が出力できるか調査お願いできますか? 解説文作成のために使えそうな情報がどのくらいあるのだろう

interimadd commented 7 years ago

あるポジションを与えたときに出力できる評価値は以下の通りです それぞれに対してCentiPawn単位で評価値が出力されます

●マテリアル:単純なコマ数 ●インバランス:NvsB、ポーン形、QvsR+Bとかの差 ●ポーン:孤立ポーン、バックワードポーン、ダブルポーン、コネクテッドポーンとかを加味したポーンの評価 ●ナイト:アウトポストに行けるかとかを考慮したナイトの評価 ●ビショップ:同色ポーンの数とかを考慮したビショップの評価 ●ルーク:オープンファイルとかを考慮したルークの評価 ●クイーン:ピンされてるとかを考慮したクイーンの評価 ●モビリティ:駒の効き ●キングの安全性:文字通り ●スレット:駒が取られそうかどうかとか ●パスポーン:ブロックされてるかとかを考慮したパスポーンのボーナス ●スペース:自分が支配してるエリアの広さ

stockfishの盤面評価の詳細は全て以下のサイトに載ってて、 完全にルールベースなんだなあと思いました https://hxim.github.io/Stockfish-Evaluation-Guide/

基本はこのポジション評価を手ごとに繰り返して、 何十手先を考慮したベストムーブを出力する感じですね

donta1024 commented 7 years ago

>interimadd 評価値の調査ありがとうございます。 stockfishの手の指し方のおおよそのイメージが付きましたね

チェスエンジンについてstockfishで問題なさそうなので、 このIssueはクローズしたいと思いますがいかがですか?

AyatsujiP commented 7 years ago

良いと思います。

interimadd commented 7 years ago

ポジションを引数に渡すとstockfishで解析して評価結果を出力する機能をクラスっぽくまとめられないかなと思って書いたコードをトピックブランチにプッシュしてみました node.jsが動く環境があればevaluate_board.jsが実行できると思います https://github.com/interimadd/Chess-Commentary-Automatic/tree/TOPIC_Evaluate_Board

javascriptは初めて書くぐらいの勢いなので、怪しい点がないかコードを見てもらえると嬉しいです。 特に以下の点が怪しいです。 ・評価結果はメンバー変数に格納する実装だがもっといい方法はないか ・jsでは解析が終わってから次の処理に進むようなことはしないらしいが、全体のシステムの中でうまく動作させるためにはどうすればいいか。今は解析終了フラグをメンバ変数に入れていて、定期的にフラグをチェックして、解析が終了していたら評価値を使った何かしらの処理をするという実装。

AyatsujiP commented 7 years ago

ソースコードはまだ見られていないですがいくつか提案です。 私もjavascriptをそこまで触っていないのでおかしなところがあればご指摘ください。

・評価結果はDB格納がいいかと思います。MongoDB使って、JSON形式で格納するのがいいかと思います。  - WebGUIから参照、評価できるように。モジュール間がDB結合になる(結合度が高くなる)かもしれないので、そこは注意して実装。 ・解析終了時にcallback関数を呼ぶようにするのがNode.jsらしいかなと思います。

時間があれば今ある実装をExpress+MongoDBに合う形に直してみようと思います。

interimadd commented 7 years ago

AyatsujiP コメントありがとうございます!とても助かります

・評価結果 DBがインターフェースになるんですね JSONとMongoDB勉強してみます ・callback関数 なるほど、これで非同期で動かせるんですね クラス内にcallback関数定義したらすっきりしたので、改めてpushしておきました

AyatsujiP commented 7 years ago

interimadd JSON形式で(Pythonのdictのように)まとめられると、見た目もすっきりすると思います。 DBはおそらくGUIを使うときに役に立つかと思います。

MongoDBは sudo apt-get install mongodb sudo systemctl enable mongodb でインストール&起動可能です。

AyatsujiP commented 7 years ago

土日でバックエンド側整備+Ansibleでインストールできるようにしてみます。