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

質問 (解決済み)

[artisocモデル] 壁エージェントについて
質問者: hd140050さん , 質問日時: 2017/10/09 13:47
Agt_Init{
my.Direction = 90
my.Color = RGB(100 + Rnd()* 150, 100 + Rnd()* 150, 100 + Rnd()* 150 )
my.Size = 1.0 - 0.2 + 0.2 * Rnd()
my.Speed = 0.5 - 0.1 + 0.2 * Rnd()
my.ChangeDirection = 20 - 5 + 10 * Rnd()
my.EnterStep = GetCountStep()
}

Agt_Step{
Dim 進行フラグ As Boolean
Dim 次の移動速度 As Double
Dim 次の角度 As Double
進行フラグ = True

// 信号の色が赤の場合
if (信号判定 () == False) Then
進行フラグ = False
// 通常の歩行速度・目標方向
Elseif (移動可能判定(My.歩行速度, My.目標方向)) Then
進行フラグ = True
次の移動速度 = My.歩行速度
次の角度 = My.目標方向
// 半分の移動速度・通常の目標方向
Elseif (移動可能判定(My.歩行速度 /2 , My.目標方向)) Then
進行フラグ = True
次の移動速度 = My.歩行速度 /2
次の角度 = My.目標方向
// 半分の移動速度・目標方向+ 45度
Elseif (移動可能判定(My.歩行速度 /2 , (My.目標方向+ 45))) Then
進行フラグ = True
次の移動速度 = My.歩行速度 /2
次の角度 = My.目標方向 + 45
// 半分の移動速度・目標方向- 45度
Elseif (移動可能判定(My.歩行速度 /2 , (My.目標方向- 45))) Then
進行フラグ = True
次の移動速度 = My.歩行速度 /2
次の角度 = My.目標方向 - 45
// 半分の移動速度・目標方向- 90度
Elseif (移動可能判定(My.歩行速度 /2 , (My.目標方向- 90))) Then
進行フラグ = True
次の移動速度 = My.歩行速度 /2
次の角度 = My.目標方向 - 90
// 半分の移動速度・目標方向+ 90度
Elseif (移動可能判定(My.歩行速度 /2 , (My.目標方向+ 90))) Then
進行フラグ = True
次の移動速度 = My.歩行速度 /2
次の角度 = My.目標方向 + 90
Else
進行フラグ = False
End if

// 次の位置に進行できる場合
if (進行フラグ) Then
My.Direction = 次の角度
Forward(次の移動速度)
End if

// 目的地に到着した場合
if ((My.Y < 1) or (My.Y > (GetHeightSpaceOwn() - 1))) Then
KillAgt(My)
End if
}

Function 移動可能判定(speed As Double, dir As Double) As Boolean {
Dim backup_x As Double
Dim backup_y As Double
Dim backup_dir As Double
Dim 移動先の周囲エージェントリスト As AgtSet
Dim 移動可能フラグ As Boolean
backup_x = My.X
backup_y = My.Y
backup_dir = My.Direction
移動可能フラグ = True

My.Direction = dir
if (Forward(speed) > 0) Then
移動可能フラグ = False
End if
MakeOneAgtSetAroundOwn(移動先の周囲エージェントリスト, 0.6, Universe.Building.Person, False)
if (CountAgtSet(移動先の周囲エージェントリスト) > 0) Then
移動可能フラグ = False
End if
My.X = backup_x
My.Y = backup_y
My.Direction = backup_dir
return 移動可能フラグ
}

Function 信号判定() As Boolean {
Dim 周囲の信号リスト As AgtSet
Dim 視野内の信号 As Agt
Dim 進行可能フラグ As Boolean
進行可能フラグ = True
if (CountAgtSet(周囲の信号リスト) > 0) Then
視野内の信号 = GetAgt(周囲の信号リスト, 0)
if (視野内の信号.Color == COLOR_RED And 視野内の信号.対象エージェント色 == My.Color) Then
進行可能フラグ = False
End if
End if
return 進行可能フラグ
}
上記に壁のエージェント(障害物)のエージェントにぶつかる、またはよけるルールを足したいですが、どう足せばいいのかわからないので教えてください。



▼解決した回答


拝見してみて、壁回避のルールがどこにもありませんね。
丸投げするのではなく、まずは自分で何かしら試行錯誤してから質問されてはどうですか。コードだけベタ張りして、何か教えてくださいでは、適切な回答ができると思いますか。
『artisocで始める歩行者エージェントシミュレーション』や過去のMASコンペなどで類似したんものを探し、自分なりに工夫してください。質問するのはその先です。
ですので、あなたの作りたいモデルが不明で、コードの意図も不明ですが、
ベタ張りしたコードで敢えて何か言えるとしたら、
移動可能判定のところで、他の移動体エージェントだけでなく、壁エージェントも加えて判定してみる。
例えば、
MakeOneAgtSetAroundOwnではなく、MakeAllAgtSetAroundOwnにするなど考えられますが、一部だけの情報で丸投げされても回答することは難しいのが現状です。
 

回答者: igaguri さん , 回答日時: 2017/10/09 21:09

▼ 全ての回答


拝見してみて、壁回避のルールがどこにもありませんね。
丸投げするのではなく、まずは自分で何かしら試行錯誤してから質問されてはどうですか。コードだけベタ張りして、何か教えてくださいでは、適切な回答ができると思いますか。
『artisocで始める歩行者エージェントシミュレーション』や過去のMASコンペなどで類似したんものを探し、自分なりに工夫してください。質問するのはその先です。
ですので、あなたの作りたいモデルが不明で、コードの意図も不明ですが、
ベタ張りしたコードで敢えて何か言えるとしたら、
移動可能判定のところで、他の移動体エージェントだけでなく、壁エージェントも加えて判定してみる。
例えば、
MakeOneAgtSetAroundOwnではなく、MakeAllAgtSetAroundOwnにするなど考えられますが、一部だけの情報で丸投げされても回答することは難しいのが現状です。
 

回答者: igaguri さん , 回答日時: 2017/10/09 21:09



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