Go言語で将棋(2024春)

Pythonのイベントに呼ばれていた頃はメインで弄っていたのはGo言語でした。

非常にシンプルで並列性能が出るのが魅力ですね。Googleらしい言語です。

言語の習作として将棋のエンジンをフルスクラッチで作り始めたのが世界選手権優勝した2018年の末です。

Go言語雑感 - 48's diary

構想としては当時非同期プログラムが書きにくかったPythonに代わればプログラム自体が見通しよく発展的改造をするのにも便利だなという動機と、もう一つは完全にフルスクラッチでゲーム系の一通りのアルゴリズムをコピペせずに実装する練習という意味でもあります。

前者としては2019年以降の白ビールのMulti PonderシステムがGo言語に完全に置き換わっており非同期で複数のエンジンを操ります。類似の例としてはGPS将棋が大規模クラスタとして有名ですがこちらは1秒刻みの同期並列ですので全く仕組みが違います。(非同期で多数のクライアントと通信するので所謂今風のサーバの仕組みです)

後者の方はいろいろと遊べますので並列化にしても古典的アルゴリズムをわざわざ実装した実験などがあり下記のTSEC3ではYBWCを実装しその性能を計測しています。

電竜戦TSEC3予選の結果 - 48's diary

ちなみにこのYBWCモデルでfloodgateレートが約2500、YSS1000Kにやや劣る程度でした。

スクラッチ勢の行方(その2) - 48's diary

 

ほかにもGo言語のバージョンアップなので仕様変更があった場合のテストコードとして利用しています。下記の件では書式が変わっていますが性能的にはあまり影響なかった例ですね。

Go 1.22のrange over int - 48's diary

 

最近、追加で思い付きの改造をしましたが思いの外影響がなく、相変わらずYSS1000Kに勝ち越すのは難しそうです。

 

 

昨年と比べシングルスレッドで2倍近い探索速度が出るようになりましたが探索深さは一つ変わるか変わらないかくらいで、結果棋力への影響は微差のようです。(YBWC外してます)

1fileマッチ関係で確認したことはC言語で類似実装をすれば更に2倍程度速いことでやはりビット演算や小さいループ・分岐を多く使うプログラムは高級言語向きではないようです。

 

ほかにも独自実装のエンジンを複数持っておくのは電竜戦運営側のテスト対局でも多く役に立ちます。

Electron将棋のデバッグにもお役に立てたようです。

USIプロトコルにおけるScoreの扱い · Issue #786 · sunfish-shogi/electron-shogi · GitHub

#色々弄ってますがすぐ忘れてしまうので自分用のメモです。

---

追記:

YSS1000kはStockfishを参考にされているらしいのでフルスクラッチで勝ちに行くのはさすがに難問だったかもしれません。