TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Pythonの麻雀ライブラリを作る

以前より不完全情報のボードゲーム強化学習アルゴリズムを試したいと思ってる。
簡単すぎるゲームやマイナーなゲームでは、開発のモチベーションが続かない気がするので、日本で人気のある麻雀AIを開発したいと考えている。

麻雀は、「Lucky J」や「Suphx 」で強化学習が試されており、人間の高段者くらいの強さになっている。
それらのAIで使われている手法を自分で実装してみて理解したいと思っている。
また、MuZeroのようなモデルベースの手法を麻雀AIで試してみたいと思っている。

Pythonライブラリ

まず、Pythonで使える麻雀ライブラリを探したが、点数計算用のライブラリが見つかったが、1局通して対局できるライブラリが見つからなかったので、自分で作ることにした。

Python以外の言語向けのオープンソースのライブラリでは、対局までできるものが見つかったので、参考にして実装した。

以下のJavaScript用のライブラリが、書籍に解説があり参考にしやすかったので、ソースコードを参考にしながら実装することにした。

GitHub - kobalab/majiang-core: 麻雀基本ライブラリ

実装

向聴数の計算や役の判定は、そこそこ計算時間がかかるため、C++で実装して、Pythonから呼び出す方式にした。
同様にC++で実装しているcshogiではCythonを使っていたが、麻雀の場合、入出力が単純ではなく構造体が簡単に使えた方がよいため、pybind11を使用した。

以下が実装したライブラリである。
GitHub - TadaoYamaoka/cmajiang: Pythonの麻雀ライブラリ (A mahjong library for Python)

元のライブラリが関数や変数などの名称に中国語のピンインが使われており、ライブラリ名も麻雀の中国語「麻将」のピンインになっている。
それを踏襲して、ライブラリ名は「cmajiang」とした。

名称に中国語のピンインが使われているため、ドキュメントがないと理解できないので、sphinxでドキュメントを作成する予定だが、まだできていない。
一旦READMEに簡易的な説明だけ記載した。

まとめ

麻雀AIの開発に使えるように、Python用の麻雀ライブラリを開発した。
開発には、こちらの書籍のコードを参考にした。

ライブラリができたので、次はまずは簡単な強化学習のアルゴリズムから試したい。