MAS コミュニティ
artisoc質問用掲示板(アーカイブ)
  
質問掲示板は移転しました。新掲示板はこちら

質問 (解決済み)

[artisocモデル] エージェント複数を連動させて動かしたい
質問者: shunさん , 質問日時: 2019/01/16 16:00
ただいま、卒業研究で船舶の避難をシミュレーションしようとしているものです。
artisocでは基本的に点でのエージェントの挙動・認識となるかと思うのですが船の挙動に少しでも近づけるために、エージェントを複数(とりあえず2つ)を連動して動かしたいと考えています。
具体的には、1つ目のエージェント(saki)が2つ目のエージェント(ato)の後に続いて動くようにしたいです。
そのように再現するには、1ステップ前のsakiのdirectionをatoのdirectionとして用いたい、よって、gethistory()を用いようと考えました。

以下は余分なところを排除して簡単にしたものです。

saki
agt-init{
my.X=1
my.Y=0
my.direction=rnd()*360
}
agt-step{
forward(1)
universe.terminal.dir=my.direction
}


ato
agt-init{
my.X=0
my.Y=0
}
agt-step{
my.direction=gethistory(universe.terminal.dir,1)
forward(1)
}

ちなみにdirは実数型変数として定義しています。

このプログラミング式ではエラーは起こらないですが、2つのエージェントが連動して同じ方向に進んでいきません。
僕の考えていることがgethistory()を用いてできるのか、それとも別に方法があるのかご教示よろしくお願いします。



▼解決した回答


あなたのコードは、あきらかにあやしい部分があるので、
まずは、全部の変数の値をprint()でコンソールに表示させてみて、確かめてみることをお勧めします。そうするとどこに問題があるがわかるはずです。

回答者: igaguri さん , 回答日時: 2019/01/16 18:38

▼ 全ての回答


2つポイントに注意しましょう。
1:GetHistoryの対象は、方向ではなく先の船のXY座標の方が良いでしょう。後の船の方向は、先の船の1ステップ前のXY座標を用いて、getdirection()で取得します。

2:エージェントの実行順序に気をつけましょう。デフォルトではランダムなので、場合によっては、後の船が先にルールを実行してしまうようなことがあります。
設定→実行環境設定→実行順序→エージェント種別指定
で、必ず、先の船を上、後の船を下としましょう。

回答者: igaguri さん , 回答日時: 2019/01/16 16:09
igaguriさん
ご回答ありがとうございます。
以下のように修正し、実行順序も変更いたしましたが、依然として状況は変わっておりません。
saki
Agt_Init{
my.X=1
my.Y=0
my.Direction=rnd()*360
}

Agt_Step{
forward(1)
universe.a.xx=my.X
universe.a.yy=my.Y
}

ato
Agt_Init{
my.X=0
my.Y=0
}

Agt_Step{
my.X=gethistory(universe.a.xx,1)
my.Y=gethistory(universe.a.yy,1)
getdirection(my.X, My.Y, universe.a.xx, universe.a.yy, universe.a)
forward(1)
}
具体的に状況を説明すれば、atoのエージェントが1ステップ目で1つ右に進んでそれ以降は方向も変えずにずっとその場に居座っています。sakiのエージェントはずっとランダムに決めた方向に進み続けています。

回答者: shun さん , 回答日時: 2019/01/16 17:05
あなたのコードは、あきらかにあやしい部分があるので、
まずは、全部の変数の値をprint()でコンソールに表示させてみて、確かめてみることをお勧めします。そうするとどこに問題があるがわかるはずです。

回答者: igaguri さん , 回答日時: 2019/01/16 18:38



Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
( 会社情報 情報セキュリティ・個人情報について )