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

質問 (解決済み)

[artisocモデル] 渋滞シミュレーションについて
質問者: mikuさん , 質問日時: 2019/12/27 17:42
同じエージェント(car)同士の距離はどのように表せばよいのでしょうか?



▼解決した回答


いくつかやり方があると思いますが、エージェントの作成と車間距離の取得のそれぞれについて、ひとつの例だけ示します。
詳しい文法の意味は、ヘルプや人工社会構築指南で確認してください。

①エージェントの作成
エージェントのなかにIFを用いて新規エージェントを作成するのが簡単です。
例えば、車エージェント自体が車エージェントを作成する場合は、
(前略)
Dim NewCar As Agt
If My.X == 60 Then
NewCar= CreateAgt(Universe.空間.車)
NewCar.X = 0
NewCar.Y = 0
End if
(後略)

②車間距離の取得
例えば、車エージェントが他の車を取得し、それが自分の前かどうか判定させてから車間距離を取得し、その距離が一定以下であれば速度を落とす
(前略)
Dim CarSet As AgtSet
MakeOneAgtSetAroundOwn(CarSet, 任意の値, Universe.空間.車, False)
If CountAgtSet(CarSet) > 0 Then
For each Car in CarSet
If My.X < Car.X Then // X軸上の前にいるかどうか
   If MeasureDistance(My.X, My.Y, Car.X, Car.Y, Universe.空間) < 任意の値
    My.Speed = My.Speed*0.5 // 例えば半分にする
   End if
End if
Next Car
End if
(後略)

回答者: さん , 回答日時: 2019/12/29 01:01

▼ 全ての回答


エージェント間の距離の取得にはMeasureDistance()を使います。

回答者: igaguri さん , 回答日時: 2019/12/28 18:49
質問者です。
igaguriさん、ご回答ありがとうございます。追記で質問させていただきます。
追記:最初に座標(0,0)にいるエージェントcarは、my.direction=0で進み、(60,0)に到達すると、新たにエージェントcarを(0,0)に生成します。エージェントcarは、前方にいるエージェントcarとの距離、すなわち車間距離によって速度を決めます。このようなモデルを作るとき①エージェントcarの生成にはCreateAgtを使うと思いますが、1つ前のエージェントcarが座標(60,0)に着いた時に座標(0,0)に生成する、というような条件はどう書けばよいのでしょうか?②このときの車間距離は、MeasureDistance使ってどのように表せるのでしょうか?IDとかを使うのでしょうか?

回答者: miku さん , 回答日時: 2019/12/29 00:37
いくつかやり方があると思いますが、エージェントの作成と車間距離の取得のそれぞれについて、ひとつの例だけ示します。
詳しい文法の意味は、ヘルプや人工社会構築指南で確認してください。

①エージェントの作成
エージェントのなかにIFを用いて新規エージェントを作成するのが簡単です。
例えば、車エージェント自体が車エージェントを作成する場合は、
(前略)
Dim NewCar As Agt
If My.X == 60 Then
NewCar= CreateAgt(Universe.空間.車)
NewCar.X = 0
NewCar.Y = 0
End if
(後略)

②車間距離の取得
例えば、車エージェントが他の車を取得し、それが自分の前かどうか判定させてから車間距離を取得し、その距離が一定以下であれば速度を落とす
(前略)
Dim CarSet As AgtSet
MakeOneAgtSetAroundOwn(CarSet, 任意の値, Universe.空間.車, False)
If CountAgtSet(CarSet) > 0 Then
For each Car in CarSet
If My.X < Car.X Then // X軸上の前にいるかどうか
   If MeasureDistance(My.X, My.Y, Car.X, Car.Y, Universe.空間) < 任意の値
    My.Speed = My.Speed*0.5 // 例えば半分にする
   End if
End if
Next Car
End if
(後略)

回答者: さん , 回答日時: 2019/12/29 01:01
上記はThenが抜けてました。なぜか取り下げができないので、追記します。
(誤)If MeasureDistance(My.X, My.Y, Car.X, Car.Y, Universe.空間) < 任意の値
(正)If MeasureDistance(My.X, My.Y, Car.X, Car.Y, Universe.空間) < 任意の値 Then

回答者: igaguri さん , 回答日時: 2019/12/29 01:09
ご回答ありがとうございます!
①、②を書く場所は、ともにAgt_Stepですか?
また、①に関して、もしAgt_Stepに書いた場合、Step終了時に(60,0)を通り過ぎてしまいエージェントが生成されない、などということにはなりませんか?
Carエージェントが1台につき、1度だけ、X座標が60を超えた時に新たなCarエージェントを作る というプログラミングはどう書けばよいのでしょうか?

回答者: miku さん , 回答日時: 2019/12/29 12:46



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