nounai.output(spaghetiThinking);

趣味と実益を兼ねて将棋プログラム(研究ツールなど)を作ってみたいと思う私の試行錯誤とか勉強したことを綴ってゆく予定です。 主目的はプログラミングの経験値稼ぎですが、コンピュータ将棋の製作も目指してみたいとも考えています。

AI製作についてのごにょごにょ

AI作る!とか言っても、何をすればいいやらわからない。AI界の全貌がよくわからないし、ほにゃらら探索がーとか言われても「?」って風にしか感じられません。

そんな私がなんとなしに考えてみたことなど。

主にC言語脳、時々オブジェクト指向脳でいこうと思います。

ミニマムなことを考えていくと、多分下のようになる、はず。

まず、現局面を受け取り、コンピュータの1手を生成して返す関数gen()みたいのがある。 動作が下のような感じ。

  1. 合法手を生成、生成不可能なら投了
  2. すべての合法手について、それを指した後の局面の評価値を計算
  3. 評価値がもっとも高くなる次の1手を選ぶ

もっともシンプルなAIって多分こんな感じのはず。ここからさらに肉付けしていこうとすれば

  • 投了のボーダー値の設定
  • 即詰み判定の導入
  • ※進行度の導入(いつから即詰み判定をするか?に関わる)
  • 上のステップを数回繰り返すことで「N手先を読むAI」の実装
    • このあたりの実装でαβとかmin-max法とかが登場、のはず
  • 持ち時間を考慮した探索(これから探索するn+1手先の計算にどれぐらいのオーダーがかかるのか?みたいな話)
  • 棋譜データベースから学習して評価パラメータを決定させる仕組みの実装

最も作者のオリジナリティが発揮されるのが評価関数部分、と言われてるのをどこかで聞きました。棋譜データベースから学習する、なんて話もここらへんの話ですね。まぁそこまで行くとステップがだいぶ先の話なので今は考えません。

学習データから評価しようが局面関係なく一定範囲のランダム値を返すだけの偽評価だろうが、それはメイン処理の流れから見れば全体の一部である「評価値計算関数」の中のごたごたでしかない訳です。強さに影響は出るが「とりあえずAIとして動作する」ことに関してはどちらの中身でも問題ない。なので、インタフェースだけそこそこしっかりしとけば中身のすげ替えは容易です(。そのインタフェースについても、とりあえずCSAプロトコルがありますからそれに出来るだけ準拠する形を考えておけばいいんではないでしょうか。)とりあえず動かしたい、という目標でいいなら評価関数はランダムで良く、あとから同じインタフェースを持つ改良版関数を追加実装すればいいわけです。なんかStrategyパターンがこんなこと言ってた気がしますね。

枝刈りについての話題は割とよく目にしますが、一番考えなくてはならないのって結局評価関数の部分です。枝刈りは強くするために確かに必要ですけど、評価関数がダメダメなのを知ってたら(私なら)枝刈りの実装にモチベーション出せる気はしません。評価方法の指針とか、そういうのこそ知りたいんですけど・・・一番の創意工夫、いわば企業秘密の部分なので情報としては出にくい感じもします。

図書館を見てもAI関係で手元に置けそうな書籍はなく、かつ資金もない状態なので情報源がとっても限られてます。五里霧中感しかない状況ですが、今書いた程度でいい、と思えば実装もできそうな気がしてきますね。JavaもいいですがAI製作の暁にはLisperデビューしてみましょうかね。幸い図書館にANSI Common Lispとか、on Lispとかの有名な本がありますし。Lispの何がAIに適してるのか、そういう部分私は知らないんですけどね。