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

質問  (回答受付中)

[artisocモデル] エージェントを目的地へ移動させる
質問者: simaさん , 質問日時: 2018/01/15 23:38
これは、GIS DataConverterのサンプルデータ内にある”人(エージェント)を動かす主”となるものに少し手を加えたものです。
このコードをランダムな移動から目的地(避難施設)へと移動させるシミュレーションへと変更したいと思っています。
自分なりに試行錯誤を繰り返しておりましたが、読み込ませたファイル(避難施設)にエージェントを向かわせる方法がどうしてもわかりません。
どなたか、ご教授していただけると幸いです。
以下、コードです。

Agt_Init{
// 歩行速度を設定[m/s] (1Step = 1sec)
My.Speed = 1.2
Dim select_node As Agt

// ------------ 経路設計サンプル ---------------
// エージェントが生成された時点で、ランダムの始点からランダムの
// 経路を生成します。

// 接続関係のある道路ノードを経路の始点としてランダムに抽出
Dim con_count As Integer
con_count = 0
Do while (con_count == 0)
select_node = GetAgt(Universe.RoadNodeList,
CInt(CountAgtSet(Universe.RoadNodeList) * Rnd()))
con_count = CountAgtSet(select_node.Connection)
Loop
AddAgt(My.Route, select_node) // 経路リストに道路ノードを追加

Dim i As Integer
For i = 0 To 100
// 前の道路ノードに接続されている道路ノードをランダムに選択
select_node = GetAgt(select_node.Connection,
CInt(CountAgtSet(select_node.Connection) * Rnd()))
AddAgt(My.Route, select_node) // 経路リストに道路ノードを追加
Next i
}

Agt_Step{
Dim now_node As Agt
Dim tmp_distance As Double
Dim pre_node As Agt
Dim nx_node As Agt
Dim is_nextnode As Boolean
Dim is_first As Boolean
tmp_distance = 0
is_nextnode = false
is_first = true

// 合計歩行距離にステップ分だけ追加します
My.WalkedDistance = My.WalkedDistance + My.Speed

// 現在位置する道路ノードを計算します
For Each now_node In My.Route
If (is_first) Then
pre_node = now_node
is_first = false
Else
nx_node = now_node
tmp_distance = tmp_distance +
MeasureDistance(pre_node.X, pre_node.Y, nx_node.X, nx_node.Y, Universe.Geographic) *
(Universe.CellWidth / Universe.MapScale)
If (tmp_distance >= My.WalkedDistance) Then
is_nextnode = true
break
End If
pre_node = nx_node
End If
Next now_node

// 前の道路ノードから次の道路までの間の次の位置を計算します
Dim dist_rate As Double
If (is_nextnode) Then
dist_rate = CDbl(tmp_distance - My.WalkedDistance) /
(MeasureDistance(pre_node.X, pre_node.Y, nx_node.X, nx_node.Y, Universe.Geographic) *
(Universe.CellWidth / Universe.MapScale))
My.X = nx_node.X - (nx_node.X - pre_node.X) * dist_rate
My.Y = nx_node.Y - (nx_node.Y - pre_node.Y) * dist_rate
Else
KillAgt(My)
CountAgt (universe.Geographic.Person)
Print (CountAgt (universe.Geographic.Person))
PrintLn("避難完了")

End If
}



▼ 全ての回答


???
自分の書いた(?)コードを理解されてますか?
上記のどこに避難所のノードの設定、つまり目的地ノードの設定があるのでしょうか?
出発地ノードと目的地ノードが決まれば、あとは最短経路探索を行えば良いです。

回答者: igaguri さん , 回答日時: 2018/01/16 09:20

MASコミュニティ
掲示板TOP







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