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

質問 (解決済み)

[artisocモデル] ネットワークモデルにおける車の前方認識について
質問者: wingmaxさん , 質問日時: 2020/09/18 11:11
レシピブックの3や5など、ダイクストラ法を用いたネットワークモデルで車を想定したモデルを作成しています。

前方を認識させる方法として、MakeOneAgtSetAroundOwn など、周囲の状況をエージェントが認識させる関数を用いたところ、エージェントの360°の範囲で認識するため、このままでは必ずしも前方を走っている車だけが認識されるわけではありません。

If文でDirectionが等しいエージェントのみに絞ろうとすると前方と後方のエージェントまでしか絞ることができません。

ネットワークモデルを用いて前方のエージェントのみに絞る方法で他にアイデアのある方がいらっしゃいましたら是非、ご教授ください。
よろしくお願いいたします。



▼解決した回答


1の方法の具体的なコードですが、以下を参考にしてください。
Universe
 Map(空間)
  Car(エージェント)
を定義します。
さらに、Universeの直下に以下の変数を定義してコンパネのスライドバーを設定します。
 ViewDistance(実数)・・・視野距離(1-5、1刻み)
 ViewAngle(実数)・・・視野角(10-360、10刻み)

Univ_InitでCarを10台生成して、ランダムに配置します。

Univ_Init{
Dim carAgtSet As AgtSet

ClearConsoleScreen()

// Carを生成してランダムに配置
CreateAgtMulti(Universe.Map.Car, 10)
MakeAgtSet(carAgtSet, Universe.Map.Car)
RandomPutAgtSet(carAgtSet)
}

CarエージェントのAgt_Stepで、以下の処理を行います。

Agt_Step{
Dim carAgtSet As AgtSet, carAgt As Agt
Dim hitCarAgtSet As AgtSet
Dim lastDirection As Double
Dim d As Double, d2 As Double

// 現在の向き
lastDirection = My.Direction
ClearAgtSet(hitCarAgtSet)
My.Caption = CStr(My.ID)

// 周囲のCarを取得する
MakeOneAgtSetAroundOwn(carAgtSet, Universe.ViewDistance, Universe.Map.Car, False)
If CountAgtSet(carAgtSet) > 0 Then
// 方向を算出
For Each carAgt In carAgtSet
TurnAgt(carAgt)
d = Abs(My.Direction - lastDirection)
d2 = 360 - d
If d > d2 Then
d = d2
End If
If d <= Universe.ViewAngle / 2 Then
// 視野の範囲である場合
AddAgt(hitCarAgtSet, carAgt)
End If
Next carAgt
My.Direction = lastDirection

// 距離を算出
If CountAgtSet(hitCarAgtSet) > 0 Then
For Each carAgt In hitCarAgtSet
carAgt.Distance = MeasureDistance(My.X, My.Y, carAgt.X, carAgt.Y, Universe.Map)
Next carAgt
// 距離の近い順にソート
SortAgtSet(hitCarAgtSet, "Distance", True)
carAgt = GetAgt(hitCarAgtSet, 0)
My.Caption = My.Caption & " -> " & carAgt.ID
My.Color = COLOR_RED
Else
My.Color = COLOR_BLUE
End If
Else
My.Color = COLOR_BLUE
End If

My.Direction = lastDirection
Turn(30*Rnd() - 15)
Forward(0.1)
}

出力設定で、Carエージェントを設定し、
マーカー:矢印(Directionを画面上に反映をチェック)
エージェント表示色:Color(透明度:50)
エージェント変数情報:Caption

回答者: m.tamada さん , 回答日時: 2020/09/18 14:20

▼ 全ての回答


2つの方法が考えられます。
1.360°の範囲で取得したエージェントのうち、自車の視野角に入る車のみ抽出する。
2.自車をForward(d)で前に移動してMakeOneAgtSetAroundOwnし、その後Forward(-1*d)で元に位置に戻れば前方の車を取得できます。


なお、抽出した車との距離を算出して、SortAgtSetなどでソートすることにより、一番近い車を抽出することができます。

回答者: m.tamada さん , 回答日時: 2020/09/18 11:23
早速の回答ありがとうございます。
1の方法が理想的な立ち振る舞いのため、思いついてはいたのですが、視野角に入る車のみを抽出する方法が分からず、断念しておりました。

具体的なコードがありましたら教えていただきたいです。

回答者: wingmax さん , 回答日時: 2020/09/18 11:40
1の方法の具体的なコードですが、以下を参考にしてください。
Universe
 Map(空間)
  Car(エージェント)
を定義します。
さらに、Universeの直下に以下の変数を定義してコンパネのスライドバーを設定します。
 ViewDistance(実数)・・・視野距離(1-5、1刻み)
 ViewAngle(実数)・・・視野角(10-360、10刻み)

Univ_InitでCarを10台生成して、ランダムに配置します。

Univ_Init{
Dim carAgtSet As AgtSet

ClearConsoleScreen()

// Carを生成してランダムに配置
CreateAgtMulti(Universe.Map.Car, 10)
MakeAgtSet(carAgtSet, Universe.Map.Car)
RandomPutAgtSet(carAgtSet)
}

CarエージェントのAgt_Stepで、以下の処理を行います。

Agt_Step{
Dim carAgtSet As AgtSet, carAgt As Agt
Dim hitCarAgtSet As AgtSet
Dim lastDirection As Double
Dim d As Double, d2 As Double

// 現在の向き
lastDirection = My.Direction
ClearAgtSet(hitCarAgtSet)
My.Caption = CStr(My.ID)

// 周囲のCarを取得する
MakeOneAgtSetAroundOwn(carAgtSet, Universe.ViewDistance, Universe.Map.Car, False)
If CountAgtSet(carAgtSet) > 0 Then
// 方向を算出
For Each carAgt In carAgtSet
TurnAgt(carAgt)
d = Abs(My.Direction - lastDirection)
d2 = 360 - d
If d > d2 Then
d = d2
End If
If d <= Universe.ViewAngle / 2 Then
// 視野の範囲である場合
AddAgt(hitCarAgtSet, carAgt)
End If
Next carAgt
My.Direction = lastDirection

// 距離を算出
If CountAgtSet(hitCarAgtSet) > 0 Then
For Each carAgt In hitCarAgtSet
carAgt.Distance = MeasureDistance(My.X, My.Y, carAgt.X, carAgt.Y, Universe.Map)
Next carAgt
// 距離の近い順にソート
SortAgtSet(hitCarAgtSet, "Distance", True)
carAgt = GetAgt(hitCarAgtSet, 0)
My.Caption = My.Caption & " -> " & carAgt.ID
My.Color = COLOR_RED
Else
My.Color = COLOR_BLUE
End If
Else
My.Color = COLOR_BLUE
End If

My.Direction = lastDirection
Turn(30*Rnd() - 15)
Forward(0.1)
}

出力設定で、Carエージェントを設定し、
マーカー:矢印(Directionを画面上に反映をチェック)
エージェント表示色:Color(透明度:50)
エージェント変数情報:Caption

回答者: m.tamada さん , 回答日時: 2020/09/18 14:20



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