4.2. エージェントの定義

通常はエージェントの定義がモデル化で最も骨の折れる部分です。シミュレーションでの作業のほとんどは、あなたが作成しようとしている実世界の現象にコンピュータのエージェントを似せるように、エージェントの振る舞いを定義することに行き着きます。

Heatbugではエージェントはかなり簡単です。以下に、Heatbug.hから抜き出したエージェントの定義を示します。

      
@interface Heatbug: SwarmObject {
 double unhappiness; // 私の現在のunhappiness
 int x, y; // 私の空間座標
 HeatValue idealTemperature; // 私の理想の温度
 HeatValue outputHeat; // 私が出力する温度
 float randomMoveProbability; // ランダムに移動する確率

 Grid2d * world; // 私が存在する世界
 int worldXSize, worldYSize; // 世界の大きさ
 HeatSpace * heat; // 世界の温度
 Color bugColor; // 私のカラー(ディスプレイ)
}

-setWorld: (Grid2d *) w Heat: (HeatSpace *) h; // 我々がいるのはどの世界?
-createEnd;

-(double) getUnhappiness;

-setIdealTemperature: (HeatValue) i;
-setOutputHeat: (HeatValue) o;
-setRandomMoveProbability: (float) p;
-setX: (int) x Y: (int) y; // bugの位置
-setBugColor: (Color) c; // bugの色(ディスプレイ)

-step;

-drawSelfOn: (id <Raster>) r;

HeatbugはSwarmObjectのサブクラスです。SwarmObjectにはそれ自体の振る舞いはほとんどなく、大部分のオブジェクトのルートクラスとして定義されて、メモリの割り当てや確率といったコンピュータサイエンス的な側面をコントロールします。

Heatbugはさまざまな状態変数を持ちます。たとえば、それぞれのHeatbugには、Heatbugの振る舞いに影響する理想温度という概念があります。また、Heatbugにはその世界の情報を伝える変数があり、これらのエージェントは、たとえばHeatSpaceオブジェクトへのリファレンスを格納しています。

Heatbugメソッドのほとんどは、エージェント状態のセットアップ(Heatbugへの入力)を使って働かなければなりません。すべてのHeatbugは、setWorld:Heat:メソッドを通じて、その世界とheatオブジェクトを設定する必要があります。加えて、Heatbugを作成するとき、Heatbugはそれらの理想温度や出力温度などを持ちます。また、Heatbugは観測ができます。HeatbugはgetUnhappinessメソッドを定義しますが、Heatbugの様子を測定できる代表格がunhappinessで、heatbugがその時点でどれほどうまく最適化されているかを表します。またHeatbugには、それ自身を指定されたgraphicsウィジットに描くことを指示するdrawSelfOnメソッドもあります。

最後に、Heatbugにstepメソッドを持たせることは最も重要です。stepはHeatbugの振る舞いが決まる場所で、Heatbugはstepが告げられると、そのつど内部計算を行ってどこに移動するかを選びます。それぞれのheatbugは、モデルスケジュールが適切だとしたときにstepするよう指示されます。stepのコードはモデルへの実際の知的な入力であり、エージェントの振る舞いの一例として読み取る価値があります。