Go言語について入門書のチュートリアルくらいはちょっとやってたんだけど,実用でどのくらい使えるかテストしてみました。
ターゲットは例の如く将棋ですね。
どっかの移植でも面白くないので,池さんの参考書やらオープンソースの他のソフトを適当に読み散らかしながら自分なりの実装をしてみました。
特に速度や互換性などには特に考えない習作レベルです。bitboard使ってないです。
そいやpythonでもやったんですがね。
昨年末,盤の設計から局面表示,合法手生成辺りを2日くらいで作ってました。ちょっとした合間を見つけてUSIプロトコルに対応させてランダム対戦まで昨年内にできてました。
そして年明けの昨日から探索部を作成。
シンプルなαβ法を実装した段階ではシングルスレッドで200knpsくらい出てました。やねうら王には随分負けているがGo言語実装ってのを考えたら健闘してるかなぁって印象。
評価値を駒得以外にKPPっぽいものを実装したら,探索速度が桁違いに落ちました。それでも,LesserKaiに勝てるようになりました。pythonでは届かなかった領域なので,ちょっと満足。
適当な評価関数実装したらnps激減したけど,れっさ改に勝てた。 pic.twitter.com/p28QJ9rNIK
— 48 (@bleu48) January 12, 2019
5手爆弾にハマるのでまだまだですね。コンピュータ将棋の歴史を学んでいる気分です。
で,色々便利だと思ってGo言語やってみたけど,メモリ管理など低レイヤーの部分で意外に使いにくいことも見つかってきた上にC++でスクラッチの方が将来性あるしよかったんじゃないかとも思い始めてきて今後の運用は微妙なところです。
ちょうど気づいたのはGPS将棋がいつのまにかPerlからGo言語になってたんですね。うちもそれを知らずに同じようなことを考えていたのですが,う~む。どうしようかしら。他言語でいうとRust勢とかどんな感じなんでしょう?
#なんか書き散らしてたら考えがまとまるかと思ったけど全然ダメでした
---
追記:
翌日思い付きで並列計算化してみました。古いマシンだと合法手生成部分の並列化は若干有効でしたが,それ以外の評価値計算などは何しても遅くなる一方でした。やはり探索スレッド単位で並列化するのが望ましいようですね。誰もやらないわけですw
---
さらに追記:
numpy.fromfileみたいな配列のバイナリイメージをそのまま読み込むような機能を探してます。それとそれらを比較的簡単な演算するんですが,ベクトル・行列演算が演算子のオーバーロードを禁じてるために簡素な表記ができないなぁと愚痴ってます。数値計算向きじゃないのですねぇ。