SlideShare a Scribd company logo
http://www.kke.co.jp
株式会社 構造計画研究所
〒164-0012 東京都中野区本町 4-38-13 創造工学部 TEL:03-5342-1125 FAX:03-5342-1225
Copyright © 2015 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
03. artisocレシピブック
ダイクストラ法を使って、最短経路を自動的に探索しよう
本ドキュメントについてのご質問、『複雑系勉強会』の
お問合せは、下記までご連絡ください。
(株)構造計画研究所
社会デザイン・マーケティング部
artisocマーケティング担当 玉田
Tel: 052-222-8461
E-mail: tamada@kke.co.jp
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
2
最短経路を探索しよう
マップが複雑になると、歩く経路を指定することは手間がかかります。
ダイクストラ法を使って、自動的に最短経路を探索します。
・歩行モデルの拡張
① 「02. artisocレシピブック」のおさらい
② ダイクストラ法とは?
③ 歩行モデルの拡張
④ Universeで計算ライブラリを初期化
⑤ 複数の歩行者を生成
⑥ 歩行者の行動ルールを変更
⑦ 道路を拡張
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
3
① 「02. artisocレシピブック」のおさらい
「02. artisocレシピブック」で作成した道路に沿って歩くモデル
描画ツールで道路を作成していく方法、歩くモデルの動作原理について学びました。
「02. artisocレシピブック」で作成した歩くモデルの問題点と解決策
道路ネットワークが単純なときは手作業で経路を指定できますが、複雑になると大変面倒です。
そこでダイクストラ法を使って、最短経路を自動的に探索するモデルを作成します。
【Step1】 モデルの定義
• PointエージェントとLinkエージェントを定
義して、描画ツールの前準備をします。
• Personエージェントを定義して、指定し
た経路で移動するアルゴリズムを定義し
ます。
【Step2】 描画ツールで道路を定義
• 背景画像の道路に沿ってマウスクリックし
て、ネットワークを定義します。
【Step3】 動きを確認
• 指定した順番にPointを通ってゴールにた
どり着くことを確認します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
4
② ダイクストラ法とは?
下図のネットワークで、点0からのコストを算出します。(カッコ内は各リンクのコスト)
点0から各点への最短経路は、矢印の向きをたどることで求めることができます。
ダイクストラ法の詳細については、Wikipediaで調べてみましょう。
0
1
3
2 4
(3)
(2)
(7)
(5)
(6)
(10)
• Point:0に接続するリンク0→1,
0→2を抽出します。
• Point:1, 2のコストを算出します。
0
1
3
2 4
3
7
0
1
3
2 4
3
5
9
15
0
1
3
2 4
3
5
9
14
• Point:1に接続するリンク1→2,
1→3を抽出します。
• Point:2に接続するリンク2→1,
2→4を抽出します。
• Point:2のコストは、0→1→2を通っ
た場合に最少となるので、5に更新
します。
• Point:3, 4のコストを算出します。
• Point:3に接続するリンク3→4を抽
出します。
• Point:4に接続するリンク4→3を抽
出します。
• Point:4のコストは、0→1→3→4を
通った場合に最少となるので、14に
更新します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
5
③ 歩行モデルの拡張(1)
交差点や端点の間のPointを束ねて、Streetで管理します。
描画ツールで定義したLinkの情報を元に、交差点や端点の間のLinkを束ねて、Streetを生成し
ます。
「Point」と「Link」を拡張します。
「Point」に次の変数を追加します。
変数名: DijkstraValue :実数型
計算値を一時的に格納します。
変数名: ChoiceAgt :エージェント型
最短経路のリンクを一時的に格納します。
変数名: NearAgtSet :エージェント集合型
接続しているPointを格納します。
変数名: StreetAgt :エージェント型
属しているStreetを格納します。
「Link」に次の変数を追加します。
変数名: StreetAgt :エージェント型
計算値を一時的に格納します。
変数名: ReverseLinkAgt :エージェント型
逆方向のLinkを格納します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
6
③ 歩行モデルの拡張(2)
「Street」と「DijkstraStreet」を追加します。
「Universe」に「Street」エージェントを追加します。
Link情報から「Street」を生成して保持します。
変数名: Points :文字列型
属しているPointのID配列です。
変数名: Cost :実数型
コストを格納します。
変数名: ReverseStreetAgt :エージェント型
逆方向のStreetを格納します。
「Universe」に「DijkstraStreet」エージェントを追加します。
「DijkstraStreet」は、ダイクストラ法の計算結果を一時的に
格納します。
変数名: Route :文字列型
当該経路のPointのID配列です。
変数名: Value :実数型
当該経路のコストを一時的に格納します。
変数名: StreetRoute :文字列型実数型
当該経路のStreetのID配列です。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
7
③ 歩行モデルの拡張(3)
「StreetBackup」、「PointBackup」、「TemporaryStreetAgtSet」の追加
「Universe」に「StreetBackup」エージェントを追加します。
ダイクストラ法で計算する際にStreetが分断されるため、
元の状態をバックアップします。
変数名: StreetAgt :エージェント型
該当するStreetを一時的に保持します。
変数名: Points :文字列型
属しているPointのID配列を一時的に保持します。
変数名: Cost :実数型
コストを一時的に保持します。
変数名: ReverseStreetAgt :エージェント型
逆方向のStreetを一時的に保持します。
「Universe」に「PointBackup」エージェントを追加します。
変数名: PointAgt :エージェント型
該当するStreetを一時的に保持します。
変数名: StreetAgt :エージェント型
属しているStreetを一時的に保持します。
「Universe」に「TemporaryStreetAgtSet」を追加します。
変数名: TemporaryStreetAgtSet :エージェント集合型
計算前に追加したStreetを一時的に保持します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
8
④ Universeで計算ライブラリを初期化
ダイクストラ計算ライブラリ「dijkstra.inc」を利用します。
ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。
「Univ_Init」で計算ライブラリを初期化します。
include “dijkstra.inc”
Univ_Init{
initialize_dijkstra()
}
・・・計算ライブラリを読み込む
・・・計算ライブラリを初期化する
【ダイクストラ法計算ライブラリの使い方】
• 「dijktstra.inc」は、ダイクストラ法で最短経路を探索するための計算ライブラリです。
• 計算ライブラリを利用するためには、Universeの先頭に「include “dijkstra.inc”」と記述し、「Univ_Init」で、
初期化のための関数「initialize_dijkstra()」を実行してください。
• 最短経路を取得するためには、「@dijkstra([始点のPointのID], [候補地のPointのID配列])」の形式で指
定します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
9
⑤ 複数の歩行者を生成
経路に沿って進み、目的地に到着したら新しい経路を設定します。
ツリーの「Point」を右クリックして、「ルールエディタ」を選択します。
Agt_Init{
Dim personAgt As Agt
Dim nearPointAgt As Agt
If My.ID == 0 And GetCountStep() < 5 Then
personAgt = CreateAgt(Universe.Map.Person)
personAgt.X = My.X
personAgt.Y = My.Y
If CountAgtSet(My.NearAgtSet) > 0 Then
nearPointAgt = GetAgt(My.NearAgtSet, Cint(Rnd() * CountAgtSet(My.NearAgtSet)))
personAgt.RouteArray = @dijkstra(My.ID,CStr(nearPointAgt.ID))
personAgt.RouteCount = 1
Else
personAgt.RouteArray = CStr(My.ID)
personAgt.RouteCount = 0
End If
End If
}
・・・Point ID=0から、4人の歩行者を生成する
・・・隣接したPointへの最短経路を取得する
(第2引数は文字列なので注意してください)
・・・隣接したPoinがない場合
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
10
⑥ 歩行者の行動ルールを変更(1)
経路に沿って進み、目的地に到着したら新しい経路を設定します。
新しい経路は2箇所の候補地をランダムで選択し、何れか経路長が短い方を選択します。
ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。
Agt_Init {
}
Agt_Step {
Dim targetPointAgt As Agt
Dim distance As Double
If My.RouteCount < CountToken(My.RouteArray) Then
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
distance = Pursue(targetPointAgt, 1)
・・・経路に沿って進む
・・・Pursue関数で、
targetPointAgtの方向に進む
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
11
⑥ 歩行者の行動ルールを変更(2)
If distance > 0 Then
My.RouteCount = My.RouteCount + 1
If CountToken(My.RouteArray) > My.RouteCount Then
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
Pursue(targetPointAgt, distance)
Else
add_new_route(targetPointAgt)
End If
End If
Else
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount-1)))
add_new_route(targetPointAgt)
End If
}
・・・Pointに到着したとき
・・・余剰分、次のPointへ向かう
・・・目的地に到着したので、
新しい経路を設定する
・・・新しい経路を設定する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
12
⑥ 歩行者の行動ルールを変更(3)
Sub add_new_route(targetPointAgt As Agt)
{
Dim newTargetPointAgt As Agt
Dim newTargetPointAgt2 As Agt
Dim newRoute As String
newRoute = “”
newTargetPointAgt = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point)))
newTargetPointAgt2 = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point)))
If ((targetPointAgt.ID <> newTargetPointAgt.ID) And (targetPointAgt.ID <> newTargetPointAgt2.ID))
And (newTargetPointAgt.ID <> newTargetPointAgt2.ID) Then
newRoute = @dijkstra(targetPointAgt.ID, CStr(newTargetPointAgt.ID) & "," &
CStr(newTargetPointAgt2.ID))
End If
If Len(newRoute) > 0 Then
My.RouteArray = My.RouteArray & "," & newRoute
End If
}
・・・2箇所の候補地をランダムで選択する
・・・2箇所の候補地のうち、経路長の
短い方の経路を返す
・・・2箇所の候補地とも到達できない
場合は””を返す
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
13
⑦ 道路の拡張
道路を拡張します。
ツリーの「Map」を右クリックして「初期値設定」を選択し、描画ツールを表示します。
道路ネットワークを自由に拡張してください。
03.model

More Related Content

PPTX
02. artisocレシピブック 描画ツールを使って道路を作成し、歩くモデルをつくろう
PPTX
04. artisocレシピブック open streetmapから道路情報を取得しよう
PPTX
05. artisocレシピブック 通れなくなった道路を迂回しよう
PPTX
01. artisocレシピブック 基本的な操作について学び、モデルを動かそう
PPTX
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
PDF
UXデザイン概論 2019
PPTX
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
PDF
#FTMA15 先端技術とメディア表現3
02. artisocレシピブック 描画ツールを使って道路を作成し、歩くモデルをつくろう
04. artisocレシピブック open streetmapから道路情報を取得しよう
05. artisocレシピブック 通れなくなった道路を迂回しよう
01. artisocレシピブック 基本的な操作について学び、モデルを動かそう
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
UXデザイン概論 2019
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
#FTMA15 先端技術とメディア表現3

What's hot (20)

PDF
Self presentation summary-miho_morikazu
PDF
やまさん と Microsoft Power Apps 入門しよう!
PDF
解説#82 記号論理学
PDF
TransPose: Towards Explainable Human Pose Estimation by Transformer
PDF
ตัวอย่างหนังสือ_เลิกขายดีกำไรน้อย ยุคนี้ต้องขายน้อยกำไรงาม.pdf
PDF
UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家
PDF
Mobility Technologiesのデータ分析基盤・データ利活用事例のご紹介
PDF
データプロダクト開発を成功に導くには
PDF
DXとデザイン思考 -実践にみる、DX推進におけるデザインの有用性と可能性-
PPTX
世界一わかりやすいClean Architecture - DroidKaigiバージョン
PDF
ビジネスモデルをシステムにつなげる
PDF
#FTMA15 第一回 鬼コース 全PDF
PDF
KJ法の実践
PDF
ナレッジグラフ/LOD利用技術の入門(前編)
PPTX
LIFULL HOME'Sのおとり広告予測モデルの開発
PDF
カネとAgile(大企業新規事業編) #rsgt2021
PDF
優れたデザインの 定義と思考方法
PDF
Pythonではじめるロケーションデータ解析
PDF
【公開版Vol1】論理的に考えよう!ロジックツリー&ブランチ
PDF
エクスペリエンス・エコノミーの先にある『変革経済』と学び
Self presentation summary-miho_morikazu
やまさん と Microsoft Power Apps 入門しよう!
解説#82 記号論理学
TransPose: Towards Explainable Human Pose Estimation by Transformer
ตัวอย่างหนังสือ_เลิกขายดีกำไรน้อย ยุคนี้ต้องขายน้อยกำไรงาม.pdf
UXデザインの資格ってどんなの? HCD-Net認定 人間中心設計スペシャリスト・人間中心設計専門家
Mobility Technologiesのデータ分析基盤・データ利活用事例のご紹介
データプロダクト開発を成功に導くには
DXとデザイン思考 -実践にみる、DX推進におけるデザインの有用性と可能性-
世界一わかりやすいClean Architecture - DroidKaigiバージョン
ビジネスモデルをシステムにつなげる
#FTMA15 第一回 鬼コース 全PDF
KJ法の実践
ナレッジグラフ/LOD利用技術の入門(前編)
LIFULL HOME'Sのおとり広告予測モデルの開発
カネとAgile(大企業新規事業編) #rsgt2021
優れたデザインの 定義と思考方法
Pythonではじめるロケーションデータ解析
【公開版Vol1】論理的に考えよう!ロジックツリー&ブランチ
エクスペリエンス・エコノミーの先にある『変革経済』と学び
Ad

Similar to 03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう (20)

PPTX
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
PPTX
08. artisocレシピブック ダイクストラ法を高速化しよう
PPTX
07. artisocレシピブック ポテンシャル法を高速化しよう
PDF
artisoc Cloudレシピブック_04. 道路に沿って歩くモデルをつくろう
PDF
第3回 artisoc Cloud勉強会
PDF
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
PDF
artisoc Cloudレシピブック_08. 複数階でポテンシャル法
PDF
artisoc Cloudレシピブック_09. 描画ツール2を使って歩くモデルの高速版
PDF
JOI春季ステップアップセミナー 2021 講義スライド
PPTX
R seminar on igraph
PDF
ダイクストラ法
PPTX
【MASの教材】ターミナル駅の通勤客の流れ
PDF
2014.4.28 輪講
PDF
ダイクストラ法の計算過程
PDF
ソーシャルデザインパターン -評判と情報収集-
PDF
線形回帰と階層的クラスタリングの実装
PPTX
09. artisocレシピブック 3Dモデルを作成しよう
PDF
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
PDF
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
PDF
集合知プログラミング5章前半
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
08. artisocレシピブック ダイクストラ法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう
artisoc Cloudレシピブック_04. 道路に沿って歩くモデルをつくろう
第3回 artisoc Cloud勉強会
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
artisoc Cloudレシピブック_08. 複数階でポテンシャル法
artisoc Cloudレシピブック_09. 描画ツール2を使って歩くモデルの高速版
JOI春季ステップアップセミナー 2021 講義スライド
R seminar on igraph
ダイクストラ法
【MASの教材】ターミナル駅の通勤客の流れ
2014.4.28 輪講
ダイクストラ法の計算過程
ソーシャルデザインパターン -評判と情報収集-
線形回帰と階層的クラスタリングの実装
09. artisocレシピブック 3Dモデルを作成しよう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
集合知プログラミング5章前半
Ad

More from Masaki Tamada (14)

PDF
artisoc Cloudレシピブック_10. artisoc4からartisoc Cloudへ移行しよう
PDF
artisoc Cloudレシピブック_01. 社会シミュレーションをはじめよう
PDF
artisoc Cloudレシピブック_02. エージェント同士を相互作用させよう
PDF
artisoc Cloudレシピブック_03. 描画ツールを使って道路を定義しよう
PDF
artisoc Cloudレシピブック_05. ポテンシャル法で移動しよう
PDF
artisoc Cloudレシピブック_07. 出力設定をマスターしよう
PPTX
【MASの教材】ホタルの光
PPTX
【MASの教材】シェリングの「分居モデル」
PPTX
【MASの教材】水槽の中のプランクトン
PPTX
【MASの教材】病気の流行
PPTX
【MASの教材】立ち話モデル 人間関係が見えるように
PPTX
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
PDF
第2回 artisoc Cloud勉強会
PDF
第1回 artisoc Cloud勉強会
artisoc Cloudレシピブック_10. artisoc4からartisoc Cloudへ移行しよう
artisoc Cloudレシピブック_01. 社会シミュレーションをはじめよう
artisoc Cloudレシピブック_02. エージェント同士を相互作用させよう
artisoc Cloudレシピブック_03. 描画ツールを使って道路を定義しよう
artisoc Cloudレシピブック_05. ポテンシャル法で移動しよう
artisoc Cloudレシピブック_07. 出力設定をマスターしよう
【MASの教材】ホタルの光
【MASの教材】シェリングの「分居モデル」
【MASの教材】水槽の中のプランクトン
【MASの教材】病気の流行
【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
第2回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会

03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう

  • 1. http://www.kke.co.jp 株式会社 構造計画研究所 〒164-0012 東京都中野区本町 4-38-13 創造工学部 TEL:03-5342-1125 FAX:03-5342-1225 Copyright © 2015 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 03. artisocレシピブック ダイクストラ法を使って、最短経路を自動的に探索しよう 本ドキュメントについてのご質問、『複雑系勉強会』の お問合せは、下記までご連絡ください。 (株)構造計画研究所 社会デザイン・マーケティング部 artisocマーケティング担当 玉田 Tel: 052-222-8461 E-mail: tamada@kke.co.jp
  • 2. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 2 最短経路を探索しよう マップが複雑になると、歩く経路を指定することは手間がかかります。 ダイクストラ法を使って、自動的に最短経路を探索します。 ・歩行モデルの拡張 ① 「02. artisocレシピブック」のおさらい ② ダイクストラ法とは? ③ 歩行モデルの拡張 ④ Universeで計算ライブラリを初期化 ⑤ 複数の歩行者を生成 ⑥ 歩行者の行動ルールを変更 ⑦ 道路を拡張
  • 3. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 3 ① 「02. artisocレシピブック」のおさらい 「02. artisocレシピブック」で作成した道路に沿って歩くモデル 描画ツールで道路を作成していく方法、歩くモデルの動作原理について学びました。 「02. artisocレシピブック」で作成した歩くモデルの問題点と解決策 道路ネットワークが単純なときは手作業で経路を指定できますが、複雑になると大変面倒です。 そこでダイクストラ法を使って、最短経路を自動的に探索するモデルを作成します。 【Step1】 モデルの定義 • PointエージェントとLinkエージェントを定 義して、描画ツールの前準備をします。 • Personエージェントを定義して、指定し た経路で移動するアルゴリズムを定義し ます。 【Step2】 描画ツールで道路を定義 • 背景画像の道路に沿ってマウスクリックし て、ネットワークを定義します。 【Step3】 動きを確認 • 指定した順番にPointを通ってゴールにた どり着くことを確認します。
  • 4. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 4 ② ダイクストラ法とは? 下図のネットワークで、点0からのコストを算出します。(カッコ内は各リンクのコスト) 点0から各点への最短経路は、矢印の向きをたどることで求めることができます。 ダイクストラ法の詳細については、Wikipediaで調べてみましょう。 0 1 3 2 4 (3) (2) (7) (5) (6) (10) • Point:0に接続するリンク0→1, 0→2を抽出します。 • Point:1, 2のコストを算出します。 0 1 3 2 4 3 7 0 1 3 2 4 3 5 9 15 0 1 3 2 4 3 5 9 14 • Point:1に接続するリンク1→2, 1→3を抽出します。 • Point:2に接続するリンク2→1, 2→4を抽出します。 • Point:2のコストは、0→1→2を通っ た場合に最少となるので、5に更新 します。 • Point:3, 4のコストを算出します。 • Point:3に接続するリンク3→4を抽 出します。 • Point:4に接続するリンク4→3を抽 出します。 • Point:4のコストは、0→1→3→4を 通った場合に最少となるので、14に 更新します。
  • 5. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 5 ③ 歩行モデルの拡張(1) 交差点や端点の間のPointを束ねて、Streetで管理します。 描画ツールで定義したLinkの情報を元に、交差点や端点の間のLinkを束ねて、Streetを生成し ます。 「Point」と「Link」を拡張します。 「Point」に次の変数を追加します。 変数名: DijkstraValue :実数型 計算値を一時的に格納します。 変数名: ChoiceAgt :エージェント型 最短経路のリンクを一時的に格納します。 変数名: NearAgtSet :エージェント集合型 接続しているPointを格納します。 変数名: StreetAgt :エージェント型 属しているStreetを格納します。 「Link」に次の変数を追加します。 変数名: StreetAgt :エージェント型 計算値を一時的に格納します。 変数名: ReverseLinkAgt :エージェント型 逆方向のLinkを格納します。
  • 6. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 6 ③ 歩行モデルの拡張(2) 「Street」と「DijkstraStreet」を追加します。 「Universe」に「Street」エージェントを追加します。 Link情報から「Street」を生成して保持します。 変数名: Points :文字列型 属しているPointのID配列です。 変数名: Cost :実数型 コストを格納します。 変数名: ReverseStreetAgt :エージェント型 逆方向のStreetを格納します。 「Universe」に「DijkstraStreet」エージェントを追加します。 「DijkstraStreet」は、ダイクストラ法の計算結果を一時的に 格納します。 変数名: Route :文字列型 当該経路のPointのID配列です。 変数名: Value :実数型 当該経路のコストを一時的に格納します。 変数名: StreetRoute :文字列型実数型 当該経路のStreetのID配列です。
  • 7. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 7 ③ 歩行モデルの拡張(3) 「StreetBackup」、「PointBackup」、「TemporaryStreetAgtSet」の追加 「Universe」に「StreetBackup」エージェントを追加します。 ダイクストラ法で計算する際にStreetが分断されるため、 元の状態をバックアップします。 変数名: StreetAgt :エージェント型 該当するStreetを一時的に保持します。 変数名: Points :文字列型 属しているPointのID配列を一時的に保持します。 変数名: Cost :実数型 コストを一時的に保持します。 変数名: ReverseStreetAgt :エージェント型 逆方向のStreetを一時的に保持します。 「Universe」に「PointBackup」エージェントを追加します。 変数名: PointAgt :エージェント型 該当するStreetを一時的に保持します。 変数名: StreetAgt :エージェント型 属しているStreetを一時的に保持します。 「Universe」に「TemporaryStreetAgtSet」を追加します。 変数名: TemporaryStreetAgtSet :エージェント集合型 計算前に追加したStreetを一時的に保持します。
  • 8. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 8 ④ Universeで計算ライブラリを初期化 ダイクストラ計算ライブラリ「dijkstra.inc」を利用します。 ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。 「Univ_Init」で計算ライブラリを初期化します。 include “dijkstra.inc” Univ_Init{ initialize_dijkstra() } ・・・計算ライブラリを読み込む ・・・計算ライブラリを初期化する 【ダイクストラ法計算ライブラリの使い方】 • 「dijktstra.inc」は、ダイクストラ法で最短経路を探索するための計算ライブラリです。 • 計算ライブラリを利用するためには、Universeの先頭に「include “dijkstra.inc”」と記述し、「Univ_Init」で、 初期化のための関数「initialize_dijkstra()」を実行してください。 • 最短経路を取得するためには、「@dijkstra([始点のPointのID], [候補地のPointのID配列])」の形式で指 定します。
  • 9. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 9 ⑤ 複数の歩行者を生成 経路に沿って進み、目的地に到着したら新しい経路を設定します。 ツリーの「Point」を右クリックして、「ルールエディタ」を選択します。 Agt_Init{ Dim personAgt As Agt Dim nearPointAgt As Agt If My.ID == 0 And GetCountStep() < 5 Then personAgt = CreateAgt(Universe.Map.Person) personAgt.X = My.X personAgt.Y = My.Y If CountAgtSet(My.NearAgtSet) > 0 Then nearPointAgt = GetAgt(My.NearAgtSet, Cint(Rnd() * CountAgtSet(My.NearAgtSet))) personAgt.RouteArray = @dijkstra(My.ID,CStr(nearPointAgt.ID)) personAgt.RouteCount = 1 Else personAgt.RouteArray = CStr(My.ID) personAgt.RouteCount = 0 End If End If } ・・・Point ID=0から、4人の歩行者を生成する ・・・隣接したPointへの最短経路を取得する (第2引数は文字列なので注意してください) ・・・隣接したPoinがない場合
  • 10. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 10 ⑥ 歩行者の行動ルールを変更(1) 経路に沿って進み、目的地に到着したら新しい経路を設定します。 新しい経路は2箇所の候補地をランダムで選択し、何れか経路長が短い方を選択します。 ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。 Agt_Init { } Agt_Step { Dim targetPointAgt As Agt Dim distance As Double If My.RouteCount < CountToken(My.RouteArray) Then targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount))) distance = Pursue(targetPointAgt, 1) ・・・経路に沿って進む ・・・Pursue関数で、 targetPointAgtの方向に進む
  • 11. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 11 ⑥ 歩行者の行動ルールを変更(2) If distance > 0 Then My.RouteCount = My.RouteCount + 1 If CountToken(My.RouteArray) > My.RouteCount Then targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount))) Pursue(targetPointAgt, distance) Else add_new_route(targetPointAgt) End If End If Else targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount-1))) add_new_route(targetPointAgt) End If } ・・・Pointに到着したとき ・・・余剰分、次のPointへ向かう ・・・目的地に到着したので、 新しい経路を設定する ・・・新しい経路を設定する
  • 12. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 12 ⑥ 歩行者の行動ルールを変更(3) Sub add_new_route(targetPointAgt As Agt) { Dim newTargetPointAgt As Agt Dim newTargetPointAgt2 As Agt Dim newRoute As String newRoute = “” newTargetPointAgt = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point))) newTargetPointAgt2 = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point))) If ((targetPointAgt.ID <> newTargetPointAgt.ID) And (targetPointAgt.ID <> newTargetPointAgt2.ID)) And (newTargetPointAgt.ID <> newTargetPointAgt2.ID) Then newRoute = @dijkstra(targetPointAgt.ID, CStr(newTargetPointAgt.ID) & "," & CStr(newTargetPointAgt2.ID)) End If If Len(newRoute) > 0 Then My.RouteArray = My.RouteArray & "," & newRoute End If } ・・・2箇所の候補地をランダムで選択する ・・・2箇所の候補地のうち、経路長の 短い方の経路を返す ・・・2箇所の候補地とも到達できない 場合は””を返す
  • 13. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 13 ⑦ 道路の拡張 道路を拡張します。 ツリーの「Map」を右クリックして「初期値設定」を選択し、描画ツールを表示します。 道路ネットワークを自由に拡張してください。 03.model