Go言語で色々やってみた話(2020総集編)

今年はコロナビールすのためにコミュニティ活動含め色々と進捗が出ていませんが

だからといって自粛ばかりでは面白くないので総集編とまとめました。

Go 4 Advent Calendar 2020の4日目として登録します。

Go 4 Advent Calendar 2020 - Qiita

 

1.将棋

ここのところ将棋の人扱いなので招待講演やら受賞イベントやらバタバタです。さらに今年は「電竜戦」なども開催することになって裏方の雑務も意外と増えてます。

まず,Go言語のみで将棋はどの程度上手に表現できるのか。習作として取り組んだものです。雑にまとめたものですが言語の利点欠点も体感的に理解できました。

最終段階では実のところ古典的AIには肉薄するところまで出来ましたのでアルゴリズム的な差異が出るところでは勝ち目がある感じです。逆に純粋に低レベル最適化で速度差が出るところでは勝負になりません。そういうところはビット演算やSIMD演算の出番です。

  

bleu48.hatenablog.com

bleu48.hatenablog.com

 

次はWCSC29において第一シード(前年優勝)チームがGo言語を開発言語として挙げている証拠リンクです。

これはクラスタリング部をGo言語実装したもので,当初の予定通りです。スパコンクラスタ構成などでしたらMPIを使うのが王道ですが,将棋の場合のクラスタは通信情報が局面程度で通信遅延や非同期性の方が重要になります。本件は実質ネットワークサーバのようなものをスクラッチで作るわけで適した言語としてGo言語を採用しました。クライアント部はGo言語ではありません。

 

www2.computer-shogi.org

 

2.囲碁

囲碁も試してみました。上記のアルゴリズムはゲームAIで言うところのMIN-MAX法やらαβ法といったものですが,囲碁ではモンテカルロ木探索が主流です。

参考書は以下の書籍,さらに講習会動画がYoutubeにあります。 

entcog.c.ooco.jp

 

これを(途中までほぼ移植)実装したものはgithubにあげてあります。

github.com

  

このような試作品で無謀にも(レジェンドAIと)対戦してみました。

bleu48.hatenablog.com

bleu48.hatenablog.com

 

分かったことは非同期や並行処理などを記述するのに非常にやりやすい言語であること。それなりにパフォーマンスがでるがC++の最高レベルには追い付かないこと。複雑な高速化手法を用いるには利便性を捨てるためにGo言語の利点も生かせないことも分かりました。

Go言語で足りる部分をGo言語で実装するには非常に可読性も高く比較的簡単に多コア環境で性能がでるのでお勧めです。しかしながら,特殊な競技会レベルのチューニングには足りない部分が多く,特にAI分野には若干向いていない気がしました。

 

また,他にも仕事のCLIツールなども書いてみましたがGo言語で足りる分はGo言語が一番に思います。

Go言語から外れる部分を敢えて挙げておきます。

  • GPUを叩く(現状もっとも容易く叩ける言語はPythonです。Goからはcgoが必須でしょう。)
  • ビット演算・SIMD演算(こちらはC++の領域ですね。Rustでも対応可能と聞いています。)

個人的にはそれ以外全部Go言語で良いと思っています。

冷静に考えてみると恐ろしく守備範囲の広い言語だと感じます。