研究用/シミュレーション 戻る
08/22
2種類のエージェントの作成を行った。注意:参考artisocを用いたシミュレーションで。
このプログラムを最初から考えるのは相当難儀だろうな。
まぁ、このプログラムを作成してくれた人に感謝。使い方がまだいまいちわからんが。
自分で作るよりはいいか
詳しく作るのはだめらしい。でも簡単につくるのもだめらしい。どっちやねん。
カメラをパソコンにつないで撮影。ほほう。面白い。
08/23
グラフの出力と簡単な練習。
結局、「分居度」がわからず、妥協してしまった感がある。
映画館のイス取りのシミュレーションを行った。ちょっと感動。
今度から第二章。制御構造だから流し読みでいいか。
参考(この本みてやりました):
人工社会構築指南/artisocによるマルチエージェント•シミュレーション入門(著:山影進,2010/04/22)
08/24
08/25
08/26
MakeAllAgtsetAroundOwn
エージェント集合変数に指定した範囲にいるエージェントの人数を認識させる(認識させるだけで数えはしない)
進行方向に人がいるかいないかは、実際にそこに言って調べてみないとわからないっていう考えなので、
Fowardで前進させて、調べてもとに戻すっって方法
Turn?
artisocの方向は数学の二次元と一緒で、真上が90度。真下が270度。真下は-90とも言える。
My.Directionに入れる値は上の数字
コメントは//か/**/
最初に紙にルールを書いてどのようにしてプログラムを動かすかだね。これが難儀だけど一番重要であり、一番難しいことだと思う。
プログラムの自動終了の方法は
ExitSimulationMsgLn
関数を使うべし
「色』を値にもつ変数は整数型と決められている。
整数値で色の指定ができる。文字列でも可能
Color_Redは赤、Color_Blueは青とか。
色の指定をしたい場合は、
白 255 255 255
赤 255 0 0
緑 0 255 0
青 0 0 255
黒 0 0 0
の数値をRGB(?,?,?)関数の?にぶち込んでやればいい
133ページの色付け方法で、技巧的な紹介があるが、よくわからない。別に上のRGBをつかったやりかたでもいいんじゃない?って思う。
まあ、上の方法だと、色は若干変わっているものの、ほとんど黒だった、この方法だと結構カラフル。
外部から色を変更する
Universe下にRGB値用の3つの変数を用意
エージェントに色を指定するための整数型の変数を用意。
出力設定で、グラフ、要素項目?の次にいつもは変数固定長のことろを、変数指定にして、上の色を指定するための整数型の変数を選ぶ
08/27
エージェント型変数とエージェント集合型変数の違い。140
For each文について
普通のFor文ではなくて、
この本では(141)エージェント集合型に格納されたエージェントを個別に取り出していく作業で、
For each one in エージェント集合型変数
Next one
という形でoneという仮想的な変数にエージェントを個別にとりこんでいき、そのエージェント一人に対して作業を行う
oneはエージェント型変数。
Dim one As Agt(エージェント方変数)
Dim neighor As Agtset(エージェント集合型変数)
GetAgt(S,n)
エージェント集合型変数Sからn番目のエージェントを選び出すルール
Sのリストが0の場合、エラーになるので最初で0の場合を除外するような癖をつけておく。
すべてのエージェントと違うエージェントの識別
MakeAllAgtsetAroundOwn(格納変数,範囲の数字,自分含めるか含めないか)
MakeOneAgtsetAroundOwn(格納変数,範囲の数字,識別したいエージェント,自分を含めるか含めないか)
の違いが155ページの練習でわかる。結構どつぼにはまった。
Rnd()は0~1までの実数を発生させるもの。0~360ではない。これもよく覚えておかないと後々やっかい。
08/28
意図的に他者こ行動に影響を与える。
病気のモデルでは、勝手に病気が広がっていった。
そうてではなく、意図的に行動に影響を与える。
属性に応じた行動のレパートリーをもつ。変更された属性の行動を行う。
↑今までの技法でOkなのだが、新しい技法を行う。←よくわからなかった。ってかそんなに新しい技法ではなかった。
「産む」と『殺す』
殺す;DelAgt
産む:CreatAgt
殺すのは、…一度エージェント型変数に格納してDelAgt(変数)としないとだめ?よくわからん
産むのは、…使ったことのあるCreatAgt←コントロールパネルで外部からのエージェント数の変化で使用。CreateAgtを使用して生成されたエージェントはすぐにAgt_Initが実行されるんだってさ。
そういえば……変数指定?の意味なんだったっけ?忘れた。明日復習すべし。こんがらがってきた。
復習
- コントロールでエージェントの人数を変化させる。 Universe下に整数型の変数を用意する。 コントロールパネルの設定をする Universeのinit部分に For i = 0 Universe.変数 - 1 CreateAgt(Universe.空間.エージェント) Next i でok
- ランダムに動き回る Init部分でX座標,Y座標,DirectionをRnd()関数で設定 Step部分でTurn()関数を使用して向きの修正 注意:Turn()の中にRnd() * 数字A - 数字Bと記述すれば、プラスマイナス数時Cの方向転換が可能 Forward()関数で前進させる。
- 型の宣言 整数型:Integer エージェント型:Agt エージェント集合型:Agtset
- 周りのエージェントの検索 MakeOneAgtsetAroundOwn(エージェント集合型変数,検索範囲,検索するエージェントの種類,自分自身を含めるか含めないか):特定のエージェントを見つける MakeAllAgtsetAroundOwn(エージェント集合型変数,検索範囲,自分自身を含めるか含めないか)すべてのエージェントを見つける CountAgtset(エージェント集合型変数):エージェント集合型変数に格納されているエージェントの数を調べる←CountAgtというのもある。これは指定されたエージェント種が空間にどれくらいいるのかを調べるもの。これもパスをちゃんと書かないと行けない.Universe.空間.エージェント
- GetAgt関数 GetAgt(エージェント集合型変数,N):エージェント集合型変数に格納されているエージェントのN番目のエージェントを摘出 技法:GetAgt(A,Int(Rnd() * CountAgtset(A)))でok。
- グラフの出力 Universe下に整数型(又は実数型)の変数を用意する 変数を出力設定で、パターンを時系列として設定してあげる。 出力する値はどうぞ考えて。ただし、パスをちゃんとかいてあげないといけない。つまり、Universe.変数、みたいに。 変数を変化されてばOK
- 強制終了 ExitSimulationMsgLn(メッセージ)
- ステップ数の取得 GetCountStep()
0829
第17章を読むだけにした。
幼稚園の先生の気持ち?みたいなモデルのやつ
なので18章から。
空間変数の登場
RnadomAgtset?
空間に変数を追加して、空間変数として利用する。
空間変数はその変数値を色でマップ上に表すことです。
その変化した空間変数でエージェントの行動ルールに影響を与えることができる。
エージェントの座標表示は実数型
空間座標は整数型
なので空間座標は細かく設定することができない
Universe.空間名.空間変数名でパスを表して、
Universe.空間.空間変数(i,j,レイヤー)で指定する。i=X座標,j=Y座標,レイヤー=0(とりあえず)
空間変数を設定すると、(マップ出力の要素追加で空間変数を指定)最低値と最大値の色を選ぶことができて、上の数値も選べる。この数値は(おそらくだが)、
Universe.空間.空間変数(i,j,レイヤー)のi+jの値である。(iとjは座標を表すが)
Abs(数値):数値の絶対値を返す
技巧的なルール設定。
座標の真ん中を数値を高く、外側を低くする。
For i = 0 To X座標-1
For j = 0 To Y座標-1
k=Abs(i-座標xMAX-1)*2
l=Abs(j-座標yMAX-1)*2
Universe.空間.空間変数(i,j,0)=x座標+y座標-k-l
Next j
Next i
上の方法じゃなくて
Universe.空間.空間変数(i,j,0)=x座標+y座標-Abs(i-x座標-1)*2-Abs(j-y座標-1)*2
でもok。
注意:
マップ要素リストで空間変数,エージェントの順で並んでいると、マップ出力の際にエージェントが空間変数に隠れてしまう。
なので順番は空間変数を最後にすべし。
MoveToCenter():エージェントを空間の中央に配置する。
Break文
for each文で使用。
繰り返しの処理を終了させる処理。for each文の外のプログラムにでる。
第19章:同期問題
forest_fire(B)は毎回実行結果が違う.....
どうして?これが同期問題?
説明:
第8章でもコラムでの説明で(08月27日の勉強)、artisocでの実行手順はこうなっている。
Univ_Init
Agt_Init
---for---
Univ_Step_Begin
Agt_Step
Univ_Step_End
---end---
Univ_Finish
今までは同時にやっていたと思っていたartisoc。
しかし、実際はエージェントに関して、上のforの部分をエージェント数分を繰り返し行っている。
つまり、1stepでエージェント数分の処理を行っている。artisocにとっては1stepはとてつもなく長い時間なのである。
これをあまりにも早く行っているので我々人間は「同時」と感じている。
又、artisocではエージェントの実行順番を毎ステップランダムに行っている。
なので全部燃えてしまうパターンもあれば、一つだけ燃えてしまうこともある。
これは困った。同時にやっていると思っていたことが、実は同時ではなかった。っていうのが同期問題
どうやってこれを解決するか。
解決方法は2つ。
•状態の変化処理を各ステップで行うのではなく、最後に一括して処理を行う
•周囲のエージェントを1つ前の状態に戻して状態を変化させる方法
↑なんか具体的にわからない。、、、
------------------
そういえば状態変数ってなんだったけ?
colorの名前で時々変数宣言していた状態変数。あれの意味を調べるんだったけど、、、
「そのエージェントの現在の状況を表す変数」らしい。なんじゃそら。
------------------
解決方法
•状態の変化処理を各ステップで行うのではなく、最後に一括して処理を行う
状態変数colorの他に、次の瞬間にどのような状態になるのかを示す状態変数を追加する。→今回はcondという名前で宣言
なんだ簡単じゃん。実際にプログラムを見てみると、、
なんと3行しかない。えーそんだけ。
あ、3行だけはAgtのstepだけだった。Universのstep_endをかなり変更しないといけない。
でもそのプログラムはcolorにcondを代入するだけだった。
↑自分風に略すと、Agt_stepでMy.colorを操作するのではなく、一度My.condに代入しておく。(My.colorの処理をしていた部分をMy.condにするだけでok?)
すべてのエージェントの処理が終了すると、Univ_step_endが実行されるので、そこでMy.colorにMy.condを格納する。
この方法を「一括置換法」、「状態変化先延ばし法」という
•周囲のエージェントを1つ前の状態に戻して状態を変化させる方法
1ステップ前の過去の情報を得る必要がある。
ん?前の方法でもおんなじじゃない?
なんと、artisocにはこの機能がついているらしい。
なんでも過去の値が呼び出せるらしい。
しかも、、、、書き足すのは2行だけ。しかもちょっと。
one.colorに値を代入する部分の判定(If文の調べるのを)一つ前の状態を調べるという風にするだけ。
GetHistoryという関数を使う
GetHistory(調べる変数,どれくらい前の記憶なのか)
この関数でcolorの変数を使う。その際、colorの変数のプロパティを見て、記憶の断層を1にしておく必要がある。
それだけでok
この方法を「過去参照法」、「因果的状態変化」という。
ところで、一つ前の情報って最初のステップの時はどうするの???
UnivのInitでMy.colorの値を代入しているので大丈夫(第0ステップ)
ちょっと今回の過去の情報を利用する同期問題は難しい。多分今後大きな敵となっていくだろう。なのでこの章は重要。第19章です。
今日気づいたことはartisocはMacでのコピー&ベーストが、コマンドCではなくコントロールCとかでできる。
今日でやっと半分。まだ半分か〜い
09/14
実数をそのまま度数にする方法。
Turnという関数をCで作りたい。sin(),cos()の関数は使える。
Turn(90)ってやったら二次元座標で時計周りに90度回転、移動する
Turn(90)は90度時計周りに方向転換のこと。上が0度,右が90度,下が180度,左が270度。
(0,0)にいる粒子を(0,1)の方向に向かす。
????。ちょっと疑問。方向を向かすんじゃなくて、その方向に動かすって感じのプログラムじゃね?
まぁそれでいいか。
90をsin(90度)の90度と同じ実数にしたい。
90度=1/2π
(1/2)×3.14159265=1.57079633
なんで、90を1.57079633にするようなXを計算すると
1.57079633 ÷ 90 = 0.0174532926
よりX=0.0174532926
なんで、実数に0.0174532926を掛けてあげればいい。
試しに135度を計算すると、、、
135度=0.75 × 3.14159265 = 2.35619449
135 × X = 2.3561945
↓
135 × 0.0174532926 = 2.3561945
よりok
参考はここ