Swarm tutorial

Swarmについてのメモ

Swarm tutorial

Swarmの利用法を学ぶためのチュートリアルが用意されている。しかしこのチュートリアルはObjective-Cで書かれているため、Javaに翻訳したものをここに掲載する。順番に見ていけばSwarmの利用法がわかるだろう。

  1. simpleCBug
  2. simpleObjCBug
  3. simpleObjCBug2
  4. simpleSwarmBug
  5. simpleSwarmBug2
  6. simpleSwarmBug3
  7. simpleObserverBug
  8. simpleObserverBug2
  9. simpleExperBug

ソース・コード (ver. 0.4)

simpleCBug

1匹のbugが歩き回る。

クラス図・Javadoc

main methodを持つクラスがあるだけである。

実行方法

$ gcjswarm simpleCBug.java でビルド
$ ./simpleCBug で実行

gcjswarmについてはインストール方法を参照。

simpleObjCBug

1匹のbug(オブジェクト)が歩き回る。

クラス図・Javadoc

simpleObjCBugがオブジェクトBugを生成する。BugはSwarmの基本的なオブジェクト(SwarmObjectImpl)である。Bugの各メソッドは自分自身(this)を返すが、この記述は以後省略する。

simpleObjCBug2

1匹のbug(オブジェクト)が歩き回る。
餌がfoodSpace(オブジェクト)にある。

クラス図・Javadoc

Bugは餌がまかれた空間FoodSpaceの中を歩き回る。FoodSpaceはSwarmライブラリが提供する格子Discrete2dImplである。

simpleSwarmBug

modelSwarm(オブジェクト)がfoodSpaceとbugを作る。
1匹のbugが歩き回る。

BugとFoodSpaceはsimpleObjCBug2と同様である。

クラス図・Javadoc

処理の流れ

  1. simpleSwarmBugがModelSwarmを作る(ModelSwarmはSwarmImplである)
  2. ModelSwarmのbuildObjectsがBugとFoodSpaceを作る
  3. ModelSwarmのbuildActionsがスケジュール(Bugが時間間隔1でstepする)を作る
  4. ModelSwarmのactivateInがスケジュールを確定する
  5. simpleSwarmBugがトップレベル(ModelSwarm)のactivityをgetActivityで取得し、実行する(run)

シーケンス図

厳密にはrun()はModelSwarmのメソッドではない。

simpleSwarmBug2

modelSwarmがfoodSpaceとbugs、world(オブジェクト)を作る。
複数匹のbugsworldの中を歩き回る

クラス図・Javadoc

コレクション・ライブラリ(List)を用いて、複数のBugを扱えるようにする。ただし、そのうちの1匹はreportBugとし、餌を見つけた場合にそのことを報告するようにする(図ではBugの継承のように描いているが実装はそうではない)。

BugたちはGrid2dImplを継承したworldの中に自分への参照を置き、ランダム・ウォークの際には、他のBugがいないことを確認してから移動する。

simpleSwarmBug3

ファイルbug.scmからパラメータを読み取り、modelSwarmを作る。
modelSwarmがfoodSpaceとbugsとworldを作る。
複数匹のbugsがworldの中を歩き回る。

simpleSwarmBug3のメソッドmainで次のように書けば、ModelSwarmのインスタンスが生成される。

modelSwarm = (ModelSwarm)Globals.env.lispAppArchiver.getWithZone$key(Globals.env.globalZone,"modelSwarm");

パラメータ・ファイル:bug.scm

パラメータ・ファイルの内容は次のようなLispのS式である。

(list 
 (cons 'modelSwarm
       (make-instance 'ModelSwarm
                      #:worldXSize 80
                      #:worldYSize 80
                      #:seedProb 0.9
                      #:bugDensity 0.01)))

lispAppArchiverで設定できるフィールドは、publicなものに限られることに注意。よって、ModelSwarmは修正が必要である。他に必要な修正は、simpleSwarmBug3に、lispArchiverの呼び出しを加えることだけである。

Javadoc

simpleObserverBug

observerSwarm(オブジェクト)がbug.scmからパラメータを読み取り、worldRaster(worldとfoodSpaceを表示するためのオブジェクト)とmodelSwarmを作る。
modelSwarmがfoodSpaceとbugsとworldを作る。
複数匹のbugsがworldの中を歩き回る。

クラス図・Javadoc

GUIとして、ControlPanelとZoomRasterが加わる。ControlPanelはシミュレーションの開始や停止のためのボタンを提供し、ZoomRasterはFoodSpaceおよびBugたちの様子を視覚化する。

FoodSpaceを画面に表示するためには、ZoomRasterとFoodSpaceの間にValue2dDisplayを介在させればよい。同様に、bugListの表示のためには、Object2dDisplayを用いる。

simpleObserverBug2

obserSwarmがbug.scmからパラメータを読み取り、worldRasterとmodelSwarm、メンバのためのprobeMap(オブジェクト)を作る。
modelSwarmはfoodSpaceとbugs、world、probeMapを作る。
複数匹のbugsがworldの中を歩き回る。

クラス図・Javadoc

Probe

Probeによって、ユーザーはリアルタイムにシミュレーターを操作することができる。ここでは、ModelSwarmとObserverSwarmのためのProbeを生成している。よって、起動時に現れるProbeは次の2つである。

ObserverSwarmのProbeはデフォルトのProbeで、publicなフィールド(displayFrequencyのみ)を表示している。デフォルトのProbeのため、Globals.env.createArchivedProbeDisplayだけで作成することができる。

ModelSwarmのProbeはカスタマイズしてあり、publicなメソッドgetBuglistも呼び出せるようになっている(クリックで呼び出せるが、この場合参照が返るだけである)。

カスタマイズするには、ProbeMapに欲しい要素を登録し(addProbe)、そのProbeMapをProbeLibraryに登録すればよい(setProbeMap$For)。この例では次の手順でModelSwarmのためのProbeを作成している。

  1. ProbeMapにフィールドであるworldXSize, worldYSize, seedProb, bugDensityとメソッドであるgetBuglistを登録
  2. このProbeMapがModelSwarmのProbeであることをProbeLibraryに登録
  3. Globals.env.createArchivedProbeDisplay (modelSwarm, "modelSwarm");

フィールドの値を変えるためには、新しい数値を入力して、Enterキーを押す。たとえば、worldXSizeを200worldYSizeを20にしてからStartボタンを押すと、シミュレーションは次のようになる。

FoodSpace上のBugをクリックすることで、次のようにそのBugのProbeを生成できる(これまでxPos,yPosはprivateだったが、ここではProbeで操作できるようにpublicにしている)。

これは、ZoomRasterのsetButton$Client$Messageによって、右クリックするとObject2dDisplayのmakeProbeAtX$Yが呼ばれるように設定されているからである。

Probeにある青字のクラス名を右クリックすると、publicなフィールドとメソッドをすべて表示させることができる。たとえば、Bugを右クリックすると、次のようになる。

さらに、右上にあるをクリックすると、スーパークラスのProbeが生成される。

simpleExperBug

オブジェクトexperSwarmが、bug.comからparameterManager(オブジェクト)resultGraph(グラフ表示のためのオブジェクト)複数のmodelSwarms、modelSwarmのためのprobeMapを作る。
modelSwarmはfoodSpaceとbugs、worldを作る。
複数匹のbugsがworldの中を歩き回る。

クラス図・Javadoc

ここではランダム・ウォークするBugたちによってFoodSpaceが食べ尽くされるまでの時間を調べている。Bugは餌を見つけるとFoodSpaceのメソッドbugAteを呼ぶ。bugAteが餌の数foodをデクリメントすることによって、餌の数を把握することができる。

ModelSwarmはFoodSpaceの餌の数を調べ、0になったらシミュレーションを終了する。

ExperSwarmはModelSwarmを監視し、シミュレーションが終わったら、新しいモデルを生成する。モデルのパラメータはParameterManagerによって設定する。

餌が食べ尽くされるまでの時間はモデルのパラメータによって変わるが、その変化の様子をグラフで視覚化する。

(プログラムのシーケンスは、ExperSwarmとModelSwarmのスケジュール(ActionGroupが一つ登録されている)をみればわかる。)