以前より不完全情報のボードゲームで強化学習のアルゴリズムを試したいと思ってる。
簡単すぎるゲームやマイナーなゲームでは、開発のモチベーションが続かない気がするので、日本で人気のある麻雀AIを開発したいと考えている。
麻雀は、「Lucky J」や「Suphx 」で強化学習が試されており、人間の高段者くらいの強さになっている。
それらのAIで使われている手法を自分で実装してみて理解したいと思っている。
また、MuZeroのようなモデルベースの手法を麻雀AIで試してみたいと思っている。
Pythonライブラリ
まず、Pythonで使える麻雀ライブラリを探したが、点数計算用のライブラリが見つかったが、1局通して対局できるライブラリが見つからなかったので、自分で作ることにした。
Python以外の言語向けのオープンソースのライブラリでは、対局までできるものが見つかったので、参考にして実装した。
以下のJavaScript用のライブラリが、書籍に解説があり参考にしやすかったので、ソースコードを参考にしながら実装することにした。
実装
向聴数の計算や役の判定は、そこそこ計算時間がかかるため、C++で実装して、Pythonから呼び出す方式にした。
同様にC++で実装しているcshogiではCythonを使っていたが、麻雀の場合、入出力が単純ではなく構造体が簡単に使えた方がよいため、pybind11を使用した。
以下が実装したライブラリである。
GitHub - TadaoYamaoka/cmajiang: Pythonの麻雀ライブラリ (A mahjong library for Python)
元のライブラリが関数や変数などの名称に中国語のピンインが使われており、ライブラリ名も麻雀の中国語「麻将」のピンインになっている。
それを踏襲して、ライブラリ名は「cmajiang」とした。
名称に中国語のピンインが使われているため、ドキュメントがないと理解できないので、sphinxでドキュメントを作成する予定だが、まだできていない。
一旦READMEに簡易的な説明だけ記載した。