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ページの一覧です。

ひしだま's ホームページ

一番参考にしたページ。C言語以外でもさまざまなワンポイントメモを残している。
この中で参考にしたのは以下。

MSDN

MicroSoft公式のリファレンスページ(と思っている)。
API関数の詳細が知りたければまずこのページ。
ただし階層構造が理解できないので、関数名で直引きするのが一番早い。
この記事で使用している関数は大体以下の通り。
抜けてる関数もあるかもしれませんが、それは各自で調べるか、誰か下に追加してください。

初心者のためのポイント学習C言語

APIではない標準ライブラリ関数の検索に役立つサイト。
strtok関数とかはじめて知りました。
ライブラリ関数一覧を眺めるだけでもためになります。

その他

ワンポイント的に見たサイトを列挙。

コメント一覧



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS