第一章 ARTISOC 入門
1.5 エージェントにランダムな要素を与える
ここまでで、規則的な初期値を与えることについては、理解できたことと思います。しかし、まだいまひとつ、
機械仕掛けのような感じでマルチエージェントっぽくありません。そこで今度はランダムな要素を初期ルール に加えてみることにしましょう。
1.5.1 エージェントを空間上にランダム配置する
空間上のエージェントをランダムに配置するのは比較的簡単です。Univ_Init{}に artisocにあらかじめ備えら れているエージェント関数RandomPutAgtSetCell ()を用います。カッコ中の最初の項目は、配置するエージ ェントを、2番目の項目には1セルに複数配置することを許可するかしないかをTrue/Falseで指定します。関 数は本来戻り値があるので、i =RandomPutAgtSetCell () などとするのが正しいのですが、この場合ランダ ムに配置される機能だけが重要で戻り値は必要ありません。戻り値を使わない場合は、以下のルールのように 代入式を省略することがよくあります。
◆ RandomPutAgtSetCell()はランダムにエージェントを配置する Prog07.model (Universe)
──────────────────────────────
Univ_Init{
Dim カメセット As AgtSet
MakeAgtSet(カメセット,Universe.空間.カメ) RandomPutAgtSetCell(カメセット, False) }
──────────────────────────────
空間にいるカメの集合を「カメセット」と定義し、MakeAgtSet()でカメセットの初期値を取得します。その後 取得したエージェント集合(カメセット)をランダムに配置しています。
「ファイル」メニューから「名前を付けて保存」を選び、「prog07.model」と名前を付けて保存します。
1.5.2 変数の値にランダム要素を加える
変数に乱数値を代入するには、Rnd()関数を用います。Rnd()は0以上1未満の乱数を発生させるものですが、
多くの場合整数の乱数値が要求されるので、小数点以下を切り捨てるInt()と組み合わせて、次のような使い方 をします。
i = Int(Rnd() * 5 )
この場合、変数iには0から4の整数値が入ります。もし、1からaまでの値が欲しければ、 i = Int(Rnd() *
a) + 1とすれば良いわけです。先ほどのRandomPutAgtSetCell()を使わない場合以下のようになります。
Prog08.model (Universe)
──────────────────────────────
Univ_Init{
Dim i As Integer
For i = 0 to CountAgt(Universe.空間.カメ) - 1 Universe.空間.カメ(i).X = Int(Rnd()*50) Universe.空間.カメ(i).Y = Int(Rnd()*50) Next i
}
──────────────────────────────
「ファイル」メニューから「名前を付けて保存」を選び、「prog08.model」と名前を付けて保存します。
さらに、これに向きをランダムに与えてみましょう。あらかじめエージェントに変数DIRX,DIRYを加えてお く必要があります。また、カメエージェントに残っている初期ルールを取り除いておきましょう。なお、「-1 +
(Int(Rnd()*2) * 2)」というややこしい表現が出てきますが、これは結果に-1か1だけを得るためのちょっとし
た工夫です。
◆ 0 から a までの整数をランダムに得る i = Int(Rnd()*a+1) Prog09.model (Universe)
──────────────────────────────
Univ_Init{
Dim i As Integer
For i = 0 to CountAgt(Universe.空間.カメ) - 1 Universe.空間.カメ(i).X = Int(Rnd()*50) Universe.空間.カメ(i).Y = Int(Rnd()*50)
Universe.空間.カメ(i).DIRX = -1 + (Int(Rnd()*2) + 1) Universe.空間.カメ(i).DIRY = -1 + (Int(Rnd()*2) + 1) Next i
}
Prog09.model (カメエージェント) Agt_Init{
}
──────────────────────────────
「ファイル」メニューから「名前を付けて保存」を選び、「prog09.model」と名前を付けて保存します。
1.5.3 エージェントの実行ルールを書き換える
初期値でエージェントの位置と向きがランダムに与えられるようになったので、今度はその応用としてエージ ェントの実行ルール(Agt_Step)にもランダム要素を加えてみましょう。これまでは壁際まで来ないと向きが変 わらなかったのですが、ランダムに向きを変えるようにしてみます。
Prog10.model (カメエージェント)
──────────────────────────────
Agt_Step{
If Int(Rnd()*10) == 0 Then My.DIRX = -1 + Int(Rnd()*3) My.DIRY = -1 + Int(Rnd()*3) End If
If My.X <= 0 Then My.DIRX = 1 End If
If My.X >= 49 Then My.DIRX = -1 End If
ForwardX (My.DIRX)
If My.Y <= 0 Then My.DIRY = 1 End If
If My.Y >= 49 Then My.DIRY = -1 End If
ForwardY (My.DIRY) }
──────────────────────────────
カメエージェントの実行ルール(Agt_Step)では、壁際に来たかどうか判断させる前に、ランダムに向きを変え るルールを書きます。
毎回向きが変わっていたのでは千鳥足になってしまうので、If文では10 分の1の確率で向きを変えるように してあります。 If文のなかは、先ほどと違って-1,0,1のいずれかを得るようにしてあります。これによって、
時々立ち止まるような仕草が見られるようになります。
◆ A 分の1の確率で分岐させるIf Int(Rnd()*A) == 0Then ~ End if
「ファイル」メニューから「名前を付けて保存」を選び、「prog10.model」と名前を付けて保存します。