AI対戦サーバープログラム作成のヒント
Author:久住 涼
まだ作成中ですよ
何年もAI対戦を見てきて思ったことと、CEDEC2013AIChallengeプロジェクトに参戦して便利だと思ったこと、調べたことをまとめたTipsです。
AI対戦のプログラム作成の役立ててやってください。
過去のAI対戦では、サーバーとクライアントの情報のやりとりには、次のような手段が使われてきました。
「同じ実行ファイルにまとめる」とは、AIプログラムもサーバプログラム内に入れてコンパイルする手法のことです。
VC++やVisualStadioで言えば、同じプロジェクトファイル内にサーバプログラムとクライアントプログラムの両方を含めてコンパイルすることで、1つの実行ファイルとして出力、実行します。
「同じ実行ファイルにまとめる」では、サーバプログラムとクライアントプログラムを別々の.exeファイルで作成します。
データ通信は、サーバからクライアントへは実行時引数として渡し、クライアントからサーバへはプログラムの返り値を行動としてサーバプログラムに返す手法です。
これら手法はそれぞれ、プログラムの作成が楽であったり、既知の技術だけで実装できるなどの利点がありますが、以下のような欠点もあります。
この項では、上にあげた2つの手法の欠点を上げたいと思います。
この手法では、今までこの問題に苦しめられてきました。
サーバとクライアントを同じ実行ファイル内に入れてしまうため、無限ループの検出や実行エラーへの対処はクライアント側に依存していました。
そのために、苦汁を舐めた人もいました。
また、AIプログラムを書き換えるたびに全体をコンパイルしなおさなければならず、これは大変な手間となります。
この手法の欠点には、次が考えられると思います。
つまり、各ターンの行動を毎回決めなければならず、数ターン分の行動をまとめて決められないということです。
モンテカルロ法などのアルゴリズム(詳しくは調べてね)で得られた情報を捨てなければならないのは、クライアントにとって大きな損失です。
そこで、これらの欠点を解消する情報の伝達方法として、次を提案します。
これは、サーバ(クライアント)の標準出力がクライアント(サーバ)への標準入力となる方法です。
これには、プロセス間通信について触れる必要がありますが、一度使いこなせれば、非常に心強い武器となります。
CEDEC2013AIChallengeプロジェクトや、ICPC2013でも使われていたものなので、汎用性は高いと思います。
ここから、プロセス間通信による情報転送のやり方について説明します。
ここからは、ある程度C言語を知っている前提で話を進めます。(実装言語はC(あるいはC++)と仮定します)
また、AI対戦のサーバはwindows上で開発するでしょうから、windowsでの実装の話になります。(Win APIを使用します)
LINUX系の場合はfork()やexec()などで簡単に代用できるしょうから、適宜調べて、置き換えながら読んでください。(余裕あればLINUX対応も執筆するかも)
あまりにも膨大な記述量となるので、ページ分割しました。
自分の防備録も兼ねてるので、難易度は低め、のつもりです。
この記事を書く上で参考にしたwebページの一覧です。
一番参考にしたページ。C言語以外でもさまざまなワンポイントメモを残している。
この中で参考にしたのは以下。
MicroSoft公式のリファレンスページ(と思っている)。
API関数の詳細が知りたければまずこのページ。
ただし階層構造が理解できないので、関数名で直引きするのが一番早い。
この記事で使用している関数は大体以下の通り。
抜けてる関数もあるかもしれませんが、それは各自で調べるか、誰か下に追加してください。
APIではない標準ライブラリ関数の検索に役立つサイト。
strtok関数とかはじめて知りました。
ライブラリ関数一覧を眺めるだけでもためになります。
ワンポイント的に見たサイトを列挙。