MAS コミュニティ
artisoc質問用掲示板

質問  (回答受付中)

[artisocモデル] エージェントの移動
質問者: yoshiki10さん , 質問日時: 2017/11/21 22:31
エージェントを中心から外側へと移動させたいのですが、どのようなルールを入れればよいでしょうか?
ご回答をよろしくお願いいたします。



▼ 全ての回答


質問が漠然としすぎて、状況が良くわかりません。
他人に理解してもらえるような質問の仕方を考えてみてください。
あなたの質問を文字通り取ると、
エージェントを空間の中心において、ルールにForward(1)とするだけで、
エージェントを中心から外側へと移動するようになりますが、、、

回答者: igaguri さん , 回答日時: 2017/11/22 09:22
GISデータを用いてマルチエージェントを行っています。
人をエージェントとして置き、移動するシミュレーションをしたいです。

artisocの講習より参考になるデータをいただきましたが、人がうまく動きません。
人がノード上を動き、なおかつ今いる場所から外側(中心から)に動かすためには、どのようなルールの設定が必要でしょうか?

現在のエージェントのルールは以下の通りです
Agt_Init{
Dim i As Integer
Dim node As Agt
Dim node2 As Agt
Dim roadNodeList As AgtSet

My.SPEED = 100

///スタート地点のノードを選択
MakeAgtSet(roadNodeList, Universe.Map.RoadNode)
node = GetAgt(roadNodeList, Int(Rnd() * CountAgtSet(roadNodeList)))
My.X = node.X
My.Y = node.Y

// 接続されているノードをランダムに選択して目的地に設定
If CountAgtset(node.Connection) > 0 Then
node2 = GetAgt(node.Connection, CInt(CountAgtSet(node.Connection) * Rnd()))
My.temp_target = node2
Else
DelAgt(My) ///接続ノードが無いノードに割振られた場合は消す
End If
}

Agt_Step{
Dim arrivedNode As Agt
Dim roadNodeList As AgtSet

///進む処理をするとともに、進めなかった場合(その場合Pursueが進めない距離を返します)目的地を更新します
If Pursue(My.temp_target, My.SPEED/ Universe.CellWidth) >0 Then
arrivedNode = My.temp_target
///到着した古いtemp_targetの接続ノードから新しいtemp_targetを選びます
My.temp_target = GetAgt(arrivedNode.Connection, CInt(CountAgtSet(arrivedNode.Connection) * Rnd()))
End If
}

この状態で実行するとエージェントの動きが行ったり来たりしてしまいます。

回答者: yoshiki10 さん , 回答日時: 2017/11/22 12:59
そもそも、このコードの意味を理解されてますか?
なぜ行ったり来たりするのかは、ノードに到着したときに、次の目的地がランダムに設定されているからです。
そのためには、以下のいずれかの方法が考えられます。
1.目的地を固定して、その経路を最短距離アルゴリズムで取得し、それらを辿る
2.一度選択した目的地のノードのIDを記録し、目的地選択の際に、記録されたノードID以外のノードを目的地とする方法です。
いずれにしても、コードの意味を理解していないとできません。

回答者: igaguri さん , 回答日時: 2017/11/24 08:36

MASコミュニティ
掲示板TOP







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