SlideShare a Scribd company logo
1 of 14
Download to read offline
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.
05. 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
火災・浸水・ガレキで道路が通れなくなったら迂回しよう
地震が発生すると、道路が通れなくなることが多々あります。
道路が通れないとき、避難経路を再探索するルールを追加しましょう。
・歩行モデルの拡張
① 「03. artisocレシピブック」のおさらい
② 道路に線を引く
③ スタートとゴールを設定する
④ 歩行者の行動ルールを変更する
⑤ 画面出力を拡張する
⑥ シミュレーション実行中に「Block」を生成する
⑦ 経路を再探索する
⑧ 立ち止まる
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
3
① 「03. artisocレシピブック」のおさらい
「03. artisocレシピブック」で作成した道路に沿って歩くモデル
最短経路を通って目的地まで歩くモデルの動作原理について学びました。
「03. artisocレシピブック」で作成した歩くモデルの問題点と解決策
全ての道路が通れることを前提に最短経路を探索します。
道路が通れなくなったことを発見し、避難経路を再探索するモデルを作成します。
【Step1】 モデルの定義
• PointエージェントとLinkエージェントを定
義して、描画ツールの前準備をします。
• Personエージェントを定義して、最短経
路を探索して移動するアルゴリズムを定
義します。
【Step2】 描画ツールで道路を定義
• 背景画像の道路に沿ってマウスクリックし
て、ネットワークを定義します。
【Step3】 動きを確認
• エージェントが移動する様子を確認しま
す。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
4
② 道路に線を引く
つながっている道路に線を引きます。
設定メニューの「出力設定」をクリックして「Map」を選択し、「編集」をクリックします。
「マップ要素リスト」の「Point」を選択し、「編集」をクリックします。
線を引く
線引対象: NearAgtSet
線種: 横棒
矢印種別: 矢印なし
色の指定: 緑色
実行メニューの「ステップ実行」をクリックします。
道路がつながっていることを確認します。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
5
③ スタートとゴールを設定する
スタート地点(Point ID=0)とゴール地点(Point ID=23)を設定します。
ツリーの「Point」を右クリックして、「ルールエディタ」を選択します。
Agt_Step {
Dim personAgt As Agt
If My.ID == 0 And GetCountStep() Mod 10 == 0 Then
personAgt = CreateAgt(Universe.Map.Person)
personAgt.X = My.X
personAgt.Y = My.Y
personAgt.RouteArray = @dijkstra(My.ID,”23”)
personAgt.RouteCount = 1
End If
}
・・・10ステップごとに歩行者を生成する
・・・ゴール地点(Point ID=23)を設定する
(第2引数は文字列なので注意してください)
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
6
④ 歩行者の行動ルールを変更する
経路に沿って進み、目的地に到着したら終了します。
ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。
「Agt_Step」の下記の一行を変更します。
準備が完了したら、「実行」ボタンをクリックしてください。
スタート地点(Point ID=0)からゴール地点(Point ID=23)へ、歩行者が移動する様子が確
認できます。
修正したモデルを「05-1.model」として保存します。
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
TerminateAgt(My.UniqueID)
End If
End If
・・・目的地に到着したので、
終了する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
7
⑤ 画面出力を拡張する
道路の閉塞が確認しやすいように「Block」を追加します。
「Universe」の「Map」に「Block」エージェントを追加します。
「Block」は、指定した2点間に「×」を表示します。
歩行者が経路を再探索したことを確認するために表示色を
変更します。
「Person」に次の変数を追加します。
変数名: Color :整数型
表示色を格納します。
エージェントの表示色を設定します。
設定メニューの「出力設定」をクリックして「Map」を選択し、
「編集」をクリックします。
「マップ要素リスト」の「Person」を選択し、「編集」を
クリックします。
エージェント表示色
変数指定: Color
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
8
⑥ シミュレーション実行中に「Block」を生成する(1)
「Block」を生成します。
ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。
「Street」の「Cost」は、該当の経路の選択しにくさを表しており、通常は距離を与えております。
最短経路を選択する際、「Cost」の小さい経路を選択します。
上記の例では、「Cost」に「10000」を設定していますが、他の経路の「Cost」と比較して大きけれ
ば別の値でも問題ありません。
各「Street」の「Cost」を知りたい場合は、「Universe」の「Univ_Step_Begin」で「print_street」関
数を実行すると、コンソール画面に表示できます。
Univ_Step_Begin {
create_block(50, 3, 26, 10000)
create_block(100, 19, 9, 10000)
create_block(150, 1, 2, 10000)
}
・・・任意のステップでコストを更新する
引数は以下の通り
1. 更新するタイミング(ステップ数)
2. Point ID1
3. Point ID2
4. 更新後のコスト
※Point ID1とPoint ID2の間に「Block」を配置します
print_street()
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
9
⑥ シミュレーション実行中に「Block」を生成する(2)
「Block」を生成します。
ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。
Sub create_block(countStep As Long, beginPointID As Integer, endPointID As Integer, newCost As Double)
Dim streetAgt As Agt
Dim beginPointAgt As Agt
Dim endPointAgt As Agt
Dim blockAgt As Agt
If GetCountStep() == countStep Then
update_cost(beginPointID, endPointID, newCost)
beginPointAgt = Universe.Map.Point(beginPointID)
endPointAgt = Universe.Map.Point(endPointID)
blockAgt = CreateAgt(Universe.Map.Block)
blockAgt.X = (beginPointAgt.X + endPointAgt.X) / 2
blockAgt.Y = (beginPointAgt.Y + endPointAgt.Y) / 2
End If
}
・・・隣り合う2点が含まれるStreetのCostを
更新する
・・・道路閉塞(×)を2点の間に表示する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
10
⑦ 経路を再探索する(1)
「Block」が配置された場所に差し掛かったとき、経路を再探索します。
ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。
If distance > 0 Then
lastTargetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
My.RouteCount = My.RouteCount + 1
If CountToken(My.RouteArray) > My.RouteCount Then
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
streetAgt = @get_street_from_points(lastTargetPointAgt.ID, targetPointAgt.ID)
If streetAgt.Cost == 10000 Then
reroute(targetPointAgt)
Else
Pursue(targetPointAgt, distance)
End If
・・・Pointに到着したとき
・・・StreetのCostが10000の場合は
経路を再探索する
・・・余剰分、次のPointへ向かう
Agt_Step{
Dim targetPointAgt As Agt
Dim distance As Double
Dim lastTargetPointAgt As Agt
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
11
⑦ 経路を再探索する(2)
Sub reroute(targetPointAgt As Agt)
{
Dim startPointAgt As Agt
Dim goalPointID As Integer
Dim newRoute As String
Dim lastRouteArray As String
Dim i As Integer
startPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount - 1)))
goalPointID = CInt(GetToken(My.RouteArray, CountToken(My.RouteArray) - 1))
newRoute = @dijkstra(startPointAgt.ID, CStr(goalPointID))
lastRouteArray = My.RouteArray
My.RouteArray = ""
For i=0 To My.RouteCount - 2
My.RouteArray = My.RouteArray & GetToken(lastRouteArray, i) & ","
Next i
My.RouteArray = My.RouteArray & newRoute
My.Color = COLOR_YELLOW
}
・・・現在地点から経路を再探索する
・・・これまでに通った経路を格納する
・・・新しい経路を追加する
・・・エージェントの色を変更する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
12
⑦ 経路を再探索する(3)
モデルを実行し、Blockを回避した経路を通るか確認します。
実行メニューの「実行」をクリックします。
修正したモデルを「05-2.model」として保存します。
このモデルでは、Costが10000に更新されたStreet以外に通れる道がない場合は通ります。
Costが10000のStreetは通れないようにするにはどうすればよいか考えてみましょう。
道路が閉塞したため、
迂回する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
13
⑧ 立ち止まる(1)
歩行者が移動する前にStreetを取得して判定します。
ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。
全ての歩行者がCostが10000のStreetを通るように設定します。
ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。
Agt_Step {
Dim targetPointAgt As Agt
Dim distance As Double
Dim lastTargetPointAgt As Agt
Dim streetAgt As Agt
lastTargetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount-1)))
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
streetAgt = @get_street_from_points(lastTargetPointAgt.ID, targetPointAgt.ID)
If streetAgt.Cost == 10000 Then
My.Color = COLOR_GREEN
ElseIf My.RouteCount < CountToken(My.RouteArray) Then
・・・立ち止まる
create_block(200, 32, 3, 10000)
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
14
⑧ 立ち止まる(2)
モデルを実行し、歩行者が立ち止まるか確認します。
実行メニューの「実行」をクリックします。
修正したモデルを「05-3.model」として保存します。
歩行者が立ち止まる

More Related Content

What's hot

伝わるチラシの作りかた講座:1日目「情報の整理のコツ」
伝わるチラシの作りかた講座:1日目「情報の整理のコツ」伝わるチラシの作りかた講座:1日目「情報の整理のコツ」
伝わるチラシの作りかた講座:1日目「情報の整理のコツ」Kumiko Hiramoto
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスターUnity Technologies Japan K.K.
 
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)Takashi Yoshinaga
 
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)Takashi Yoshinaga
 
QGISで河川縦断図
QGISで河川縦断図QGISで河川縦断図
QGISで河川縦断図Mayumit
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだTetsuya Kaneuchi
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
色彩学入門
色彩学入門色彩学入門
色彩学入門ueda247
 
ARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせTakahiro Miyaura
 
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うな
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うなワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うな
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うなYoshiki Hayama
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングKent Ohashi
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスターUnity Technologies Japan K.K.
 
Aframe詰め合わせ
Aframe詰め合わせAframe詰め合わせ
Aframe詰め合わせYouichi Sugii
 
UXデザインの上流工程の考え方とプロセス  ~リサーチからアイデア発想そしてUIデザインへ
UXデザインの上流工程の考え方とプロセス ~リサーチからアイデア発想そしてUIデザインへUXデザインの上流工程の考え方とプロセス ~リサーチからアイデア発想そしてUIデザインへ
UXデザインの上流工程の考え方とプロセス  ~リサーチからアイデア発想そしてUIデザインへMasaya Ando
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
Gunosyインターンシップ成果発表
Gunosyインターンシップ成果発表Gunosyインターンシップ成果発表
Gunosyインターンシップ成果発表Shuka Takakuma
 
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたKohei Kadowaki
 
使う人の体験を時間軸で考えよう 〜UXデザインの視点を取り入れる
使う人の体験を時間軸で考えよう〜UXデザインの視点を取り入れる使う人の体験を時間軸で考えよう〜UXデザインの視点を取り入れる
使う人の体験を時間軸で考えよう 〜UXデザインの視点を取り入れるMasaya Ando
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説するTaishiYamada1
 

What's hot (20)

伝わるチラシの作りかた講座:1日目「情報の整理のコツ」
伝わるチラシの作りかた講座:1日目「情報の整理のコツ」伝わるチラシの作りかた講座:1日目「情報の整理のコツ」
伝わるチラシの作りかた講座:1日目「情報の整理のコツ」
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター
 
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
 
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
 
QGISで河川縦断図
QGISで河川縦断図QGISで河川縦断図
QGISで河川縦断図
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
色彩学入門
色彩学入門色彩学入門
色彩学入門
 
ARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせ
 
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うな
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うなワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うな
ワークショップのアイデア発想で「AIでユーザーに最適な情報を出します」とか言うな
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミングJavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
 
Aframe詰め合わせ
Aframe詰め合わせAframe詰め合わせ
Aframe詰め合わせ
 
UXデザインの上流工程の考え方とプロセス  ~リサーチからアイデア発想そしてUIデザインへ
UXデザインの上流工程の考え方とプロセス ~リサーチからアイデア発想そしてUIデザインへUXデザインの上流工程の考え方とプロセス ~リサーチからアイデア発想そしてUIデザインへ
UXデザインの上流工程の考え方とプロセス  ~リサーチからアイデア発想そしてUIデザインへ
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
Gunosyインターンシップ成果発表
Gunosyインターンシップ成果発表Gunosyインターンシップ成果発表
Gunosyインターンシップ成果発表
 
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
 
使う人の体験を時間軸で考えよう 〜UXデザインの視点を取り入れる
使う人の体験を時間軸で考えよう〜UXデザインの視点を取り入れる使う人の体験を時間軸で考えよう〜UXデザインの視点を取り入れる
使う人の体験を時間軸で考えよう 〜UXデザインの視点を取り入れる
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 

Similar to 05. artisocレシピブック 通れなくなった道路を迂回しよう

10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しようMasaki Tamada
 
08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しよう08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しようMasaki Tamada
 
09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しよう09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しようMasaki Tamada
 
07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しようMasaki Tamada
 
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一schoowebcampus
 
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しようMasaki Tamada
 

Similar to 05. artisocレシピブック 通れなくなった道路を迂回しよう (6)

10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
 
08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しよう08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しよう
 
09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しよう09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しよう
 
07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう
 
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一
Google Maps APIを使って、自分好みの地図を作ろう 先生:川村 健一
 
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
 

More from Masaki Tamada

【MASの教材】ホタルの光
【MASの教材】ホタルの光【MASの教材】ホタルの光
【MASの教材】ホタルの光Masaki Tamada
 
【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」Masaki Tamada
 
【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトン【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトンMasaki Tamada
 
【MASの教材】病気の流行
【MASの教材】病気の流行【MASの教材】病気の流行
【MASの教材】病気の流行Masaki Tamada
 
【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れ【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れMasaki Tamada
 
【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるように【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるようにMasaki Tamada
 
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへ【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへMasaki Tamada
 
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろうartisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろうMasaki Tamada
 
第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会Masaki Tamada
 
第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会Masaki Tamada
 

More from Masaki Tamada (10)

【MASの教材】ホタルの光
【MASの教材】ホタルの光【MASの教材】ホタルの光
【MASの教材】ホタルの光
 
【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」
 
【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトン【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトン
 
【MASの教材】病気の流行
【MASの教材】病気の流行【MASの教材】病気の流行
【MASの教材】病気の流行
 
【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れ【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れ
 
【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるように【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるように
 
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへ【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
 
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろうartisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
 
第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会
 
第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会
 

05. 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. 05. 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 火災・浸水・ガレキで道路が通れなくなったら迂回しよう 地震が発生すると、道路が通れなくなることが多々あります。 道路が通れないとき、避難経路を再探索するルールを追加しましょう。 ・歩行モデルの拡張 ① 「03. artisocレシピブック」のおさらい ② 道路に線を引く ③ スタートとゴールを設定する ④ 歩行者の行動ルールを変更する ⑤ 画面出力を拡張する ⑥ シミュレーション実行中に「Block」を生成する ⑦ 経路を再探索する ⑧ 立ち止まる
  • 3. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 3 ① 「03. artisocレシピブック」のおさらい 「03. artisocレシピブック」で作成した道路に沿って歩くモデル 最短経路を通って目的地まで歩くモデルの動作原理について学びました。 「03. artisocレシピブック」で作成した歩くモデルの問題点と解決策 全ての道路が通れることを前提に最短経路を探索します。 道路が通れなくなったことを発見し、避難経路を再探索するモデルを作成します。 【Step1】 モデルの定義 • PointエージェントとLinkエージェントを定 義して、描画ツールの前準備をします。 • Personエージェントを定義して、最短経 路を探索して移動するアルゴリズムを定 義します。 【Step2】 描画ツールで道路を定義 • 背景画像の道路に沿ってマウスクリックし て、ネットワークを定義します。 【Step3】 動きを確認 • エージェントが移動する様子を確認しま す。
  • 4. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 4 ② 道路に線を引く つながっている道路に線を引きます。 設定メニューの「出力設定」をクリックして「Map」を選択し、「編集」をクリックします。 「マップ要素リスト」の「Point」を選択し、「編集」をクリックします。 線を引く 線引対象: NearAgtSet 線種: 横棒 矢印種別: 矢印なし 色の指定: 緑色 実行メニューの「ステップ実行」をクリックします。 道路がつながっていることを確認します。
  • 5. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 5 ③ スタートとゴールを設定する スタート地点(Point ID=0)とゴール地点(Point ID=23)を設定します。 ツリーの「Point」を右クリックして、「ルールエディタ」を選択します。 Agt_Step { Dim personAgt As Agt If My.ID == 0 And GetCountStep() Mod 10 == 0 Then personAgt = CreateAgt(Universe.Map.Person) personAgt.X = My.X personAgt.Y = My.Y personAgt.RouteArray = @dijkstra(My.ID,”23”) personAgt.RouteCount = 1 End If } ・・・10ステップごとに歩行者を生成する ・・・ゴール地点(Point ID=23)を設定する (第2引数は文字列なので注意してください)
  • 6. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 6 ④ 歩行者の行動ルールを変更する 経路に沿って進み、目的地に到着したら終了します。 ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。 「Agt_Step」の下記の一行を変更します。 準備が完了したら、「実行」ボタンをクリックしてください。 スタート地点(Point ID=0)からゴール地点(Point ID=23)へ、歩行者が移動する様子が確 認できます。 修正したモデルを「05-1.model」として保存します。 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 TerminateAgt(My.UniqueID) End If End If ・・・目的地に到着したので、 終了する
  • 7. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 7 ⑤ 画面出力を拡張する 道路の閉塞が確認しやすいように「Block」を追加します。 「Universe」の「Map」に「Block」エージェントを追加します。 「Block」は、指定した2点間に「×」を表示します。 歩行者が経路を再探索したことを確認するために表示色を 変更します。 「Person」に次の変数を追加します。 変数名: Color :整数型 表示色を格納します。 エージェントの表示色を設定します。 設定メニューの「出力設定」をクリックして「Map」を選択し、 「編集」をクリックします。 「マップ要素リスト」の「Person」を選択し、「編集」を クリックします。 エージェント表示色 変数指定: Color
  • 8. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 8 ⑥ シミュレーション実行中に「Block」を生成する(1) 「Block」を生成します。 ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。 「Street」の「Cost」は、該当の経路の選択しにくさを表しており、通常は距離を与えております。 最短経路を選択する際、「Cost」の小さい経路を選択します。 上記の例では、「Cost」に「10000」を設定していますが、他の経路の「Cost」と比較して大きけれ ば別の値でも問題ありません。 各「Street」の「Cost」を知りたい場合は、「Universe」の「Univ_Step_Begin」で「print_street」関 数を実行すると、コンソール画面に表示できます。 Univ_Step_Begin { create_block(50, 3, 26, 10000) create_block(100, 19, 9, 10000) create_block(150, 1, 2, 10000) } ・・・任意のステップでコストを更新する 引数は以下の通り 1. 更新するタイミング(ステップ数) 2. Point ID1 3. Point ID2 4. 更新後のコスト ※Point ID1とPoint ID2の間に「Block」を配置します print_street()
  • 9. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 9 ⑥ シミュレーション実行中に「Block」を生成する(2) 「Block」を生成します。 ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。 Sub create_block(countStep As Long, beginPointID As Integer, endPointID As Integer, newCost As Double) Dim streetAgt As Agt Dim beginPointAgt As Agt Dim endPointAgt As Agt Dim blockAgt As Agt If GetCountStep() == countStep Then update_cost(beginPointID, endPointID, newCost) beginPointAgt = Universe.Map.Point(beginPointID) endPointAgt = Universe.Map.Point(endPointID) blockAgt = CreateAgt(Universe.Map.Block) blockAgt.X = (beginPointAgt.X + endPointAgt.X) / 2 blockAgt.Y = (beginPointAgt.Y + endPointAgt.Y) / 2 End If } ・・・隣り合う2点が含まれるStreetのCostを 更新する ・・・道路閉塞(×)を2点の間に表示する
  • 10. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 10 ⑦ 経路を再探索する(1) 「Block」が配置された場所に差し掛かったとき、経路を再探索します。 ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。 If distance > 0 Then lastTargetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount))) My.RouteCount = My.RouteCount + 1 If CountToken(My.RouteArray) > My.RouteCount Then targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount))) streetAgt = @get_street_from_points(lastTargetPointAgt.ID, targetPointAgt.ID) If streetAgt.Cost == 10000 Then reroute(targetPointAgt) Else Pursue(targetPointAgt, distance) End If ・・・Pointに到着したとき ・・・StreetのCostが10000の場合は 経路を再探索する ・・・余剰分、次のPointへ向かう Agt_Step{ Dim targetPointAgt As Agt Dim distance As Double Dim lastTargetPointAgt As Agt
  • 11. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 11 ⑦ 経路を再探索する(2) Sub reroute(targetPointAgt As Agt) { Dim startPointAgt As Agt Dim goalPointID As Integer Dim newRoute As String Dim lastRouteArray As String Dim i As Integer startPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount - 1))) goalPointID = CInt(GetToken(My.RouteArray, CountToken(My.RouteArray) - 1)) newRoute = @dijkstra(startPointAgt.ID, CStr(goalPointID)) lastRouteArray = My.RouteArray My.RouteArray = "" For i=0 To My.RouteCount - 2 My.RouteArray = My.RouteArray & GetToken(lastRouteArray, i) & "," Next i My.RouteArray = My.RouteArray & newRoute My.Color = COLOR_YELLOW } ・・・現在地点から経路を再探索する ・・・これまでに通った経路を格納する ・・・新しい経路を追加する ・・・エージェントの色を変更する
  • 12. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 12 ⑦ 経路を再探索する(3) モデルを実行し、Blockを回避した経路を通るか確認します。 実行メニューの「実行」をクリックします。 修正したモデルを「05-2.model」として保存します。 このモデルでは、Costが10000に更新されたStreet以外に通れる道がない場合は通ります。 Costが10000のStreetは通れないようにするにはどうすればよいか考えてみましょう。 道路が閉塞したため、 迂回する
  • 13. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 13 ⑧ 立ち止まる(1) 歩行者が移動する前にStreetを取得して判定します。 ツリーの「Person」を右クリックして、「ルールエディタ」を選択します。 全ての歩行者がCostが10000のStreetを通るように設定します。 ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。 Agt_Step { Dim targetPointAgt As Agt Dim distance As Double Dim lastTargetPointAgt As Agt Dim streetAgt As Agt lastTargetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount-1))) targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount))) streetAgt = @get_street_from_points(lastTargetPointAgt.ID, targetPointAgt.ID) If streetAgt.Cost == 10000 Then My.Color = COLOR_GREEN ElseIf My.RouteCount < CountToken(My.RouteArray) Then ・・・立ち止まる create_block(200, 32, 3, 10000)
  • 14. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 14 ⑧ 立ち止まる(2) モデルを実行し、歩行者が立ち止まるか確認します。 実行メニューの「実行」をクリックします。 修正したモデルを「05-3.model」として保存します。 歩行者が立ち止まる