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

質問 (解決済み)

[artisocモデル] 自動車エージェントの前方車両の認識方法について
質問者: masayukiさん , 質問日時: 2018/02/07 13:52
お世話になっております.
現在,歩行者・自転車・自動車を織り交ぜた津波避難シミュレーションを作成していまして,その際,重要となるのが自動車の挙動です.
その挙動のルールに関して質問させていただきます.

自動車は追い越し不可・前方車両の位置&速度によって自身の速度を変化させるというようなルールを作成したいのですが,この前方車両を認識させるロジックを考えるのに難儀しております.
作成中のモデルのネットワークは複雑で入り組んでいるため,My.ID-1のAgtを前方車両とするのは不可能です.

CountAgtSetAroundOwnは後方車も認識してしまうため,不向きだと考えましたが,その視野を前方ののみに狭めることが出来れば何とかなりそうだとも考えましたが...


どうか,前方車両のみを逐一認識できる方法をご教授していただけませんでしょうか.
よろしくお願い致します.



▼解決した回答


コードをまだ詳しく見てない段階で回答しますが、
車間距離が1になったり、2になったりするのはマルチエージェントシミュレーションである限り、当たり前なのではないでしょうか。
つまり、実行順序のランダム性と関係あります。どちらのエージェントが先に実行順序が回ってくるのかが2台の車両間の距離は違うのではないでしょうか。
この問題かどうか確認してみてください。

回答者: igaguri さん , 回答日時: 2018/02/08 20:22

▼ 全ての回答


自分の進行方向と自分と他のAgtの角度の差分で、自分の前にいるかどうか判定するのはどうでしょうか。
例えば、
Dim car As Agt
Dim mawari As AgtSet
MakeAgtSetAroundOwn(mawari,3,False)
For each car in mawari
If Abs(My.direction - GetDirection(my, car)) < 30 Then
println("前方に車両あり")
End if
Next car
※ただし、directionは、0度と360度が同じで、1度と359度が隣り合っているので、場合分けするなど、取扱いに注意が必要です。

回答者: igaguri さん , 回答日時: 2018/02/07 14:11
igaguri様,ご回答有り難う御座いました.
ご教授いただいた手法と最短距離のエージェントを捜索するルールを用いて,前方最近傍車両を車エージェントに認識させることが出来ました.

そこで,また問題が発生しまして,恐縮ながらお力添えをお願いしたく思います.
前方車両との距離,認識している前方車両のIDをモニタリングしながら挙動をチェックしていたところ,明らかにおかしい数値が返ってきていることに気が付きました.
車エージェントは現在,毎ステップごとに発生し,速度1で進んでいるため,前方車両との距離は常に1となっていなければいけないのですが,なぜか2と表示される場合があります.認識している前方車両のIDを確認したところ,正しく認識していたので,前の車両を一つ飛ばして前方車両として認識しているわけでは無さそうです.書いたルールを記載させて頂きますので,もしもおかしなところがあればご教授いただけませんでしょうか.

Direction1 = 0
For each Car1 in My.aroundCar ///前方にある車両を認識
Direction1 = Abs(My.Direction - GetDirection(My.X , My.Y , Car1.X , Car1.Y , Universe.Map))
If Direction1 >= 330 then
Direction1 = 360 - Direction1
else
End if

  IF Direction1 <= 30 then
Addagt (Car1set ,Car1)
else
end if
Next Car1

MinDistance = 50
For each Car1 in Car1set ///認識した前方にある車両の中から最短距離にある車を探査
My.FrontDistance = Abs(Measuredistance(My.X , My.Y , Car1.X , Car1.Y, Universe.Map))
If My.FrontDistance < MinDistance then
FrontCar = Car1 ///FrontCarを決定
MinDistance = My.FrontDistance
End if
Next Car1

if my.ID == 20 then ///状況をモニタリング
println(countagtset(Car1set))
println(countagtset(My.aroundCar))
println(Cint(Car1.ID))
else
end if

回答者: masayuki さん , 回答日時: 2018/02/08 20:09
コードをまだ詳しく見てない段階で回答しますが、
車間距離が1になったり、2になったりするのはマルチエージェントシミュレーションである限り、当たり前なのではないでしょうか。
つまり、実行順序のランダム性と関係あります。どちらのエージェントが先に実行順序が回ってくるのかが2台の車両間の距離は違うのではないでしょうか。
この問題かどうか確認してみてください。

回答者: igaguri さん , 回答日時: 2018/02/08 20:22



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