Ayaneとは、python Adaptor to YaneuraOuの略で、やねうら王をpythonから呼び出して便利に使えてしまうアダプターです。
- ※ AdaptorのAと、YaneuraOuのYaneの部分でAyaneです。また、YaneuraOuのYane-r--uの部分を取って、Ayaneru(あやねる)の愛称で呼ぶことがあります。
python側で少しコードを書くだけで棋譜解析や並列自己対局などができます。
USIプロトコルのエンジンであれば他のエンジンでもpythonから呼び出して使えますが、USIプロトコルでは規定されていない拡張を使いたいので、やねうら王以外のサポートはしません。
動作を確認しているpythonは3.7系です。それ以前のpythonの動作確認はしていません。
import shogi.Ayane
# 通常探索用の思考エンジンの接続テスト
# 同期的に思考させる。
def test_ayane1():
# エンジンとやりとりするクラス
usi = ayane.UsiEngine()
# デバッグ用にエンジンとのやりとり内容を標準出力に出力する。
# usi.debug_print = True
# エンジンオプション自体は、基本的には"engine_options.txt"で設定する。(やねうら王のdocs/を読むべし)
# 特定のエンジンオプションをさらに上書きで設定できる
usi.set_engine_options({"Hash":"128","Threads":"4","NetworkDelay":"0","NetworkDelay2":"0"})
# エンジンに接続
# 通常の思考エンジンであるものとする。
usi.connect("exe/YaneuraOu.exe")
# 開始局面から76歩の局面
# ※ "position"コマンド、"go"コマンドなどについては、USIプロトコルの説明を参考にしてください。
# cf.「USIプロトコルとは」: http://shogidokoro.starfree.jp/usi.html
usi.usi_position("startpos moves 7g7f")
# multipv 4で探索させてみる
# 2秒思考して待機させる。
usi.send_command("multipv 4")
usi.usi_go_and_wait_bestmove("btime 0 wtime 0 byoyomi 2000")
# 思考内容を表示させてみる。
print("=== UsiThinkResult ===\n" + usi.think_result.to_string())
# エンジンを切断
usi.disconnect()
if __name__ == "__main__":
test_ayane1()
ね、簡単でしょう?
-
Ayaneを使えば、エンジン同士の対局をさせるのも、わずかなコードで実現できます。
-
sfen文字列の取扱いなどは、下記のライブラリを使うと便利だと思います。
- 2019/06/28 : pythonからやねうら王を駆動できるアダプターAyane、公開しました
- 2019/07/04 : あやねるサーバー、あやねるゲート出来ました
自己対局のための補助クラス。
import shogi.Ayane as ayane
import time
# あやねるサーバーを使った対局例
def test_ayane5(self):
print("test_ayane5 : ")
server = ayane.AyaneruServer()
for engine in server.engines:
engine.set_engine_options({"Hash":"128","Threads":"1","NetworkDelay":"0","NetworkDelay2":"0","MaxMovesToDraw":"320" \
, "MinimumThinkingTime":"0"})
engine.connect("exe/YaneuraOu.exe")
# 持ち時間設定。
server.set_time_setting("byoyomi 100") # 1手0.1秒
# server.set_time_setting("time 1000 inc 2000") # 1秒 + 1手2秒
# これで対局が開始する
server.game_start()
# 対局が終了するのを待つ
while not server.game_result.is_gameover():
time.sleep(1)
# 対局棋譜の出力
print("game sfen = " + server.sfen)
print("game_result = " + str(server.game_result))
server.terminate()
if __name__ == "__main__":
test_ayane5()
あやねるサーバーの並列対局版。クラス名 : MultiAyaneruServer
マルチあやねるサーバーを用いた並列対局を実現するスクリプト。 勝率、レーティング差、95%信頼下限~信頼上限のレーティング差などを自動計算して表示。
あやねるサーバーを用いた複数ソフト間の対局を自動化するスクリプト。
Apache License Version 2.0とします。