質問 (回答受付中)[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 }
|
|
▼ 全ての回答
|
|