07. artisocレシピブック ポテンシャル法を高速化しよう
TRANSCRIPT
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.
07. artisoc レシピブック ポテンシャル法を高速化しよう
本ドキュメントについてのご質問、『複雑系勉強会』のお問合せは、下記までご連絡ください。
(株)構造計画研究所社会デザイン・マーケティン
グ部artisoc マーケティング担当
玉田 Tel: 052-222-8461 E-mail: [email protected]
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 2
ポテンシャルはいつ計算するとよいでしょうか?「 06. artisoc レシピブック」では、全てのお客さまのポテンシャ
ルを毎ステップ計算しています。商品棚やレジの位置は動かないので、来店時もしくは目的地に到着
したタイミングでポテンシャルを計算すれば、計算負荷を減らすことができます。
モデルを改造して、ポテンシャル法を高速化しましょう。
・目次① ポテンシャル法とは?(再掲)② 店舗内の買い回り行動(再掲)③ ツリーに変数を追加する④ 入口からお客さまが来店する⑤ お客さまの買い回り行動を定義する
⑥ Potential を初期化する⑦ Potential に従い、方向を取得す
る⑧ 商品棚の到達確認を行う⑨ PotentialArray から値を取得す
る⑩ シミュレーションを実行する
(再掲)
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 3
① ポテンシャル法とは?(再掲)高いところから低いところへボールが転がっていくことを利用した探索方
法です。ポテンシャル法で最短経路を取得する手順
① 出発地と目的地を決めます。② 空間をメッシュ状に切り、 各座標に Potential 値を持たせます。③ 目的地の Potential 値に「 1 」を代入します。④ Potential 値を持つ座標の周り4方向(上下左右)のうち、値を持たない座標の
Potential 値に「+1」した値を代入します。⑤ 出発地の Potential 値が代入されるまで④を繰り返します。⑥ 出発地の Potential 値(例えば「n」)から、 「n-1」の値を順番に辿れば
最短経路になります。
※目的地が複数あるときは、どうなるか試してみましょう。
4 4 5 4 5 6 4 5 6 7 4 5 6 73 3 4 3 4 5 3 4 5 3 4 5 7 3 4 5 7
2 2 3 2 3 4 2 3 4 2 3 4 6 2 3 4 6 2 3 4 61 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
は目的地 は出発地 は障害物
1
1
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 4
② 店舗内の買い回り行動(再掲)スーパーマーケットを例に、お客さまの買い回り行動を考えます。
① お客さまは買い物リストを持っています。② 入口から入店します。③ 店舗の中には、商品棚が並んでいます。④ 買い物リストの中から一番近くにある商品棚まで移動します。⑤ 商品棚に到着したら、次の商品棚まで移動します。⑥ すべての商品を買い物カゴに入れたら、レジで精算します。
★ 商品1
★ 商品2★ 商品3
★ 入口
★ レジ
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 5
③ ツリーに変数を追加するシミュレーションに必要なエージェントと変数を追加します。
ツリーの「 Person 」を右クリックして、「変数の追加」を選択します。
変数名: PotentialArray :文字列型
※PotentialArray には、 Universe.Map.Potential で 保持している Potential 値をカンマ区切りで行・列の順で格納します。
お客さまの頭の中に店舗マップがあるイメージです。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 6
④ 入口からお客さまが来店するPotential 値を計算して、 PotentialArray に格納します。
ツリーの「 Entrance 」を右クリックして、「ルールエディタ」を選択します。
Sub create_person(){
@set_potential(personAgt.X, personAgt.Y, personAgt.ShelfArray) personAgt.PotentialArray = @get_potential_array()}
・・・ポテンシャルを計算する・・・ポテンシャルをカンマ区切りの文字列に 変換して PotentialArray に格納する
※省略
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 7
⑤ お客さまの買い回り行動を定義するPotential 法に従って、買い回り行動を行います。
ツリーの「 Person 」を右クリックして、「ルールエディタ」を選択します。
Agt_Init { init_potential()}
Agt_Step { My.Direction = get_potential_direction() Forward(My.Speed)
If Universe.Map.Floor(My.X, My.Y, 0) <> 0 Then Forward(-1 * My.Speed) End If
check_shelf() check_register()}
・・・ Potential を初期化する ポテンシャルの計算は前述の Entrance ルールの create_person で行う
・・・ Potential に従い、方向を取得し、 一歩前に進む
・・・歩行可能エリアでない場合は、 一歩後ろに下がる
・・・目的地の到達確認を行う
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 8
⑥ Potential を初期化するSub init_potential(){ Dim oneAgt As Agt Dim personAgtSet As AgtSet Dim i As Integer Dim j As Integer
For i=0 To GetWidthSpace(Universe.Map) - 1 For j=0 To GetHeightSpace(Universe.Map) - 1 If Universe.Map.Floor(i, j, 0) == 0 Then Universe.Map.Potential(i, j, 0) = 0 Else Universe.Map.Potential(i, j, 0) = -1 End If Next j Next i}
・・・空間上の全ての座標の「 Floor 」の値をチェックし、 0 (歩行可能エリア)であれば、 Potential の値を「 0 」、 0以外であれば、 Potential の値を「 -1 」に初期化する
※他の Person の立ち位置を歩行可能エリアから 除外する処理を削除する。
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 9
⑦-1 Potential に従い、方向を取得するFunction get_potential_direction() As Integer{ Dim tmpX As Integer Dim tmpY As Integer Dim tmpPotential As Integer Dim minPotential As Integer Dim minTmpX As Integer Dim minTmpY As Integer Dim i As Integer minPotential = get_potential_value(My.X, My.Y) minTmpX = My.X minTmpY = My.Y For i=0 To 4 - 1 If i==0 Then tmpX = My.X - 1 tmpY = My.Y ElseIf i==1 Then tmpX = My.X + 1 tmpY = My.Y
・・・ PotentialArray から値を取得する
・・・周囲4方向(上下左右)を検索する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 10
⑦-2 Potential に従い、方向を取得する ElseIf i==2 Then tmpX = My.X tmpY = My.Y - 1 ElseIf i==3 Then tmpX = My.X tmpY = My.Y + 1 End If If @check_inner_space(tmpX, tmpY) == True Then If Universe.Map.Potential(tmpX, tmpY, 0) > 0 Then tmpPotential = get_potential_value(tmpX, tmpY) If tmpPotential < minPotential Then minPotential = tmpPotential minTmpX = tmpX minTmpY = tmpY End If End If End If Next i Return(GetDirection(CInt(My.X),CInt(My.Y), CInt(minTmpX), CInt(minTmpY),
Universe.Map))}
・・・座標が空間内であることを確認する・・・歩行可能エリアであることを確認する・・・ PotentialArray から値を取得する・・・より小さい Potential を持つ座標を 取得する
・・・取得した座標を方向に変換する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 11
⑧ 商品棚の到達確認を行うSub check_shelf(){
※省略
If hitFlag == True Then If CountToken(My.ShelfArray) == 1 Then My.ShelfArray = "" Else My.ShelfArray = Left(tmpShelfArray, Len(tmpShelfArray) - 1) End If
init_potential() @set_potential(My.X, My.Y, My.ShelfArray) My.PotentialArray = @get_potential_array() End If End If}
・・・商品棚に到着したときは、 当該の商品棚の ID を ShelfArray から削除する
・・・ Potential 値を計算して、 PotentalArray に格納する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 12
⑨ PotentialArray から値を取得するFunction get_potential_value(targetX As Integer, targetY As Integer) As Integer{ Dim pos As Integer Dim potentialToken As Integer pos = targetX + targetY * GetWidthSpace(Universe.Map) potentialToken = CInt(GetToken(My.PotentialArray, pos))
Return(potentialToken)}
・・・指定した座標について、 PotentialArray から値を取得する
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 13
⑩ シミュレーションを実行する(再掲)シミュレーションを実行します。
ツールバーの [ 実行 ]-[ 実行 ] を選択します。
• 店舗内のお客さまの動きを表現する。• 商品棚には番号がふられている。• お客さまは、買い物リストを持ち、当該
の商品棚(番号)に到着すると、リストから消される。
• 全ての買い物が終わると、レジに移動して終了する。
• Potential の値を表示する。• 色の薄いところが目的とする商品棚であ
る。• ポテンシャル法では、自分の立ち位置ま
で計算した後、計算を打ち切るため、(近場であれば)高速に経路探索ができる。