機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

iPadのNeural Engineで将棋AI part10 CSAプロトコルに対応する

前回まででiPadで動作する将棋エンジンのコアはできましたが、USIプロトコルMac上で動作している将棋所と通信する仕様となっており、iPad単独では世界コンピュータ将棋選手権やfloodgateでの対局がまだできませんでした。選手権等での対局にはCSAプロトコルが用いられているため、これを実装する必要があります。

CSAプロトコルの説明は以下のリンクから参照できます。今回は最新のバージョン1.2.1に対応します。

CSA通信プロトコル

CSAプロトコルは汎用性が高く、駒落ち対局などの特殊な条件にも対応しています。CSAプロトコル全体を実装するのは大変なので、選手権とfloodgateで必要となる最低限の機能だけを実装します。

最低限必要なステップは以下の通りになります。

  • TCPでサーバに接続する
  • LOGIN送る
  • 相手が決まると、対局条件が来る
    • "Your_Turn:+"で自分が先手か後手かを知る
    • "END Game_Summary"を待つ
  • "AGREE"を送る
  • "START"を待つ
    • これが来たら対局開始、時間計測開始
    • 先手番の時、STARTを待たずに初手を送る実装をするとトラブルにつながるケースもあるようで注意
  • 手番なら、思考して手を返す ("+7776FU")
  • サーバからの指し手(自分、相手両方の指し手)を待つ("+7776FU,T12")
    • 相手が投了すれば"%TORYO,T4"など
  • 指し手によって対局が終わる場合、指し手の次の行で、"#SENNICHITE"や"#WIN"などが来る
    • "#ILLEGAL_MOVE"の場合があり、その場合直前の手の表記は間違っている可能性がある(厳格に対処するのは大変なので気にしない)
    • 指し手の行が来た時点で思考に入るが、対局終了のメッセージが来たらそれを打ち切って終了画面に移行することが望ましい(できなくても負けにはならないと思うが)
    • LOGOUTを送るほうがより適切
  • floodgateで連続対局したい場合は、TCP接続が切れたら新しく接続しなおして、LOGINから通信をやり直す実装が必要。
    • floodgateでは、拡張モードを用いることでTCP接続を切らずに連続対局したり読み筋を送ったりすることが可能。しかし選手権のサーバでは対応していないため、拡張モードは実装しない。

CSAプロトコルのちょっと困る・USIより面倒なポイント

  • 千日手が成立する手と、指し手の後に千日手成立のメッセージが分かれて送られてくる
    • 手が来た時点で思考を始めてしまうため、それを止める機構を実装しないと連続対局に支障がある(手動で再起動する分には問題ないが)
  • 指し手の表記("+2726FU")に駒の種類や手番が含まれている
    • USI形式での指し手には「移動元、移動先」が含まれており、思考部でもこれだけの情報で十分であるため指し手を表すオブジェクトに駒の種類は含まない。CSAプロトコル用の指し手文字列を生成するためには、局面情報から移動元にある駒の種類を取り出す必要がある。局面情報の管理手段をUSIと変える必要が生じる。
    • 思考部とは別に、通信部側で現局面を管理し、局面クラスのインスタンスメソッドとして"parseCSA"を実装して指し手表現を変換するようにした。
  • 持ち時間の管理をクライアント側で行う必要がある。
    • 送られてくるのは指し手ごとの消費時間であり、フィッシャールールにおける加算などを加味して残り時間を計算する機能が必要。
    • プロトコルで流れてくる持ち時間に関するルールは解釈せず、大会のルールに準拠した時間(初期持ち時間、1手ごとの加算時間)をGUI上で入力する仕様とした。
  • 通信をkeepaliveする必要がある。
    • CSAプロトコル特有の話ではないのですが、インターネット経由でTCP接続を行う場合、数分間通信がないと接続が切れてしまう場合があります。
    • 対局相手が長考している場合、送受信できるメッセージがないので接続が切れる恐れがあります。
    • CSAプロトコルでは、これに対応するためこちらの手番でない場合でも空行(LF)を送ることは許可されていますが、直前の送信より30秒以内に送ると反則になる場合があります。そのため、タイマーを用いて前回の送信から30秒以上経過したら空行を送るという実装が必要です。

これらの実装をして、CSAプロトコルでfloodgateに接続してiPad単独での対局が可能になりました。ただし、選手権のルールでは画面に最低限表示すべき内容が規定されており、将棋所を使うことで自動的に満たされていた要件を独自に実装する必要があります。次回は画面について記事にします。