通常はエージェントの定義がモデル化で最も骨の折れる部分です。シミュレーションでの作業のほとんどは、あなたが作成しようとしている実世界の現象にコンピュータのエージェントを似せるように、エージェントの振る舞いを定義することに行き着きます。
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のコードはモデルへの実際の知的な入力であり、エージェントの振る舞いの一例として読み取る価値があります。