Upgrade to Pro — share decks privately, control downloads, hide ads and more …

10. artisocレシピブック_A-star探索アルゴリズムを使って、最短経路を自動的に探索しよう

Masaki Tamada
November 30, 2020

10. artisocレシピブック_A-star探索アルゴリズムを使って、最短経路を自動的に探索しよう

■最短経路を探索しよう

道路ネットワークが巨大になるとダイクストラ法では計算できません。
A*探索アルゴリズムを使って、自動的に最短経路を探索します。

歩行モデルの拡張
 ①「02. artisocレシピブック」のおさらい
 ②A*探索アルゴリズムとは?
 ③歩行モデルの拡張
 ④Universeで計算ライブラリを初期化
 ⑤複数の歩行者を生成
 ⑥歩行者の行動ルールを変更
 ⑦道路を拡張

Masaki Tamada

November 30, 2020
Tweet

More Decks by Masaki Tamada

Other Decks in Design

Transcript

  1. http://www.kke.co.jp 株式会社 構造計画研究所 〒164-0012 東京都中野区本町 4-38-13 創造工学部 TEL:03-5342-1125 FAX:03-5342-1225 Copyright

    © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 10. artisocレシピブック A*探索アルゴリズムを使って、最短経路を自動的に探索しよう 本ドキュメントについてのご質問、『複雑系勉強会』の お問合せは、下記までご連絡ください。 (株)構造計画研究所 次世代事業開発部 MAS社会デザイン室 玉田 E-mail: [email protected]
  2. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    2 最短経路を探索しよう ◼道路ネットワークが巨大になるとダイクストラ法では計算できません。 ◼A*探索アルゴリズムを使って、自動的に最短経路を探索します。 ・歩行モデルの拡張 ① 「02. artisocレシピブック」のおさらい ② A*探索アルゴリズムとは? ③ 歩行モデルの拡張 ④ Universeで計算ライブラリを初期化 ⑤ 複数の歩行者を生成 ⑥ 歩行者の行動ルールを変更 ⑦ 道路を拡張
  3. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    3 ① 「02. artisocレシピブック」のおさらい ◼「02. artisocレシピブック」で作成した道路に沿って歩くモデル ⚫描画ツールで道路を作成していく方法、歩くモデルの動作原理について学びました。 ◼「02. artisocレシピブック」で作成した歩くモデルの問題点と解決策 ⚫道路ネットワークが単純なときは手作業で経路を指定できますが、複雑になると大変面倒です。 ⚫そこでA*探索アルゴリズムを使って、最短経路を自動的に探索するモデルを作成します。 【Step1】 モデルの定義 • PointエージェントとLinkエージェントを定 義して、描画ツールの前準備をします。 • Personエージェントを定義して、指定し た経路で移動するアルゴリズムを定義し ます。 【Step2】 描画ツールで道路を定義 • 背景画像の道路に沿ってマウスクリックし て、ネットワークを定義します。 【Step3】 動きを確認 • 指定した順番にPointを通ってゴールにた どり着くことを確認します。
  4. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    4 ② A*探索アルゴリズムとは? ◼ダイクストラ法とA*探索アルゴリズムの違い ⚫ダイクストラ法: スタートノードから全てのノードへの最短経路を求めます。 ⚫A*探索: ゴールまでの推定値(直線距離など)を元にして、スタートから ゴールに近いと思われる点から順次探索していきます。 ◼A*探索アルゴリズムの手順 ① スタートノードから順次経路を探索していく際に、推定距離を用いてゴー ルまでの距離が短くできそうなノードから優先的に探索していきます。 ② 具体的には、ノードnについて、スタートからノードnまでの距離g(n)と、ノー ドnからゴールまでの推定距離h(n)を計算し、その和であるf(n)を随時更 新していきます。 f(n) = g(n) + h(n) ③ f(n)が近いノードから優先的にその先への探索を実行していきます。 ④ h(n)には直線距離などが用いられます。 ⑤ 最短経路を求めるには、h(n)が、f(n)の更新に用いられる真のリンク間移 動コストと比べて、必ず同じか短くなるよう設定する必要があります(幹 線道路考慮時などはこの点に要注意)。 ⚫A*探索アルゴリズムの詳細については、Wikipediaで調べてみましょう。 s g n g(n) h(n)
  5. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    5 ③ 歩行モデルの拡張 ◼「Point」を拡張します。 ⚫「Point」に次の変数を追加します。 変数名: NearAgtSet :エージェント集合型 接続しているPointを格納します。 変数名: ParentPointAgt:エージェント型 親のPointを一時的に格納します。 変数名: g :実数型 gの値を一時的に格納します。 変数名: f :実数型 fの値を一時的に格納します。
  6. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    6 ④ Universeで計算ライブラリを初期化 ◼A*探索アルゴリズム計算ライブラリ「a_star.inc」を利用します。 ⚫ツリーの「Universe」を右クリックして、「ルールエディタ」を選択します。 ⚫「Univ_Init」で計算ライブラリを初期化します。 include “a_star.inc” Univ_Init{ set_near_point() } ・・・計算ライブラリを読み込む ・・・リンクするPointを格納する 【A*探索アルゴリズム計算ライブラリの使い方】 • 「a_star.inc」は、ダイクストラ法で最短経路を探索するための計算ライブラリです。 • 計算ライブラリを利用するためには、Universeの先頭に「include “a_star.inc”」と記述し、「Univ_Init」で、リ ンクするPointを格納するための関数「set_near_point()」を実行してください。 • 最短経路を取得するためには、「@a_star ([始点のPoint], [目的地のPoint])」の形式で指定します。
  7. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    7 ⑤ 複数の歩行者を生成 ◼経路に沿って進み、目的地に到着したら新しい経路を設定します。 ⚫ツリーの「Point」を右クリックして、「ルールエディタ」を選択します。 Agt_Step{ 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 = @a_star(My.UniqueID,nearPointAgt) personAgt.RouteCount = 1 Else personAgt.RouteArray = CStr(My.ID) personAgt.RouteCount = 0 End If End If } ・・・Point ID=0から、4人の歩行者を生成する ・・・隣接したPointへの最短経路を取得する ・・・隣接したPointがない場合
  8. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    8 ⑥ 歩行者の行動ルールを変更(1) ◼経路に沿って進み、目的地に到着したら新しい経路を設定します。 ⚫ツリーの「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の方向に進む
  9. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    9 ⑥ 歩行者の行動ルールを変更(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へ向かう ・・・目的地に到着したので、 新しい経路を設定する ・・・新しい経路を設定する
  10. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    10 ⑥ 歩行者の行動ルールを変更(3) Sub add_new_route(targetPointAgt As Agt) { Dim newTargetPointAgt As Agt Dim newRoute As String newRoute = “” newTargetPointAgt = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point))) If targetPointAgt.ID <> newTargetPointAgt.ID Then newRoute = @a_star(targetPointAgt, newTargetPointAgt) End If If Len(newRoute) > 0 Then My.RouteArray = My.RouteArray & "," & newRoute End If } ・・・候補地をランダムに選択する
  11. http://www.kke.co.jp Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.

    11 ⑦ 道路の拡張 ◼道路を拡張します。 ⚫ツリーの「Map」を右クリックして「初期値設定」を選択し、描画ツールを表示します。 ⚫道路ネットワークを自由に拡張してください。 10.model