07. artisocレシピブック ポテンシャル法を高速化しよう

13
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]

Upload: masaki-tamada

Post on 15-Aug-2015

96 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 07. artisocレシピブック ポテンシャル法を高速化しよう

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]

Page 2: 07. artisocレシピブック ポテンシャル法を高速化しよう

http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 2

ポテンシャルはいつ計算するとよいでしょうか?「 06. artisoc レシピブック」では、全てのお客さまのポテンシャ

ルを毎ステップ計算しています。商品棚やレジの位置は動かないので、来店時もしくは目的地に到着

したタイミングでポテンシャルを計算すれば、計算負荷を減らすことができます。

モデルを改造して、ポテンシャル法を高速化しましょう。

・目次① ポテンシャル法とは?(再掲)② 店舗内の買い回り行動(再掲)③ ツリーに変数を追加する④ 入口からお客さまが来店する⑤ お客さまの買い回り行動を定義する

⑥ Potential を初期化する⑦ Potential に従い、方向を取得す

る⑧ 商品棚の到達確認を行う⑨ PotentialArray から値を取得す

る⑩ シミュレーションを実行する

(再掲)

Page 3: 07. artisocレシピブック ポテンシャル法を高速化しよう

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

Page 4: 07. artisocレシピブック ポテンシャル法を高速化しよう

http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 4

② 店舗内の買い回り行動(再掲)スーパーマーケットを例に、お客さまの買い回り行動を考えます。

① お客さまは買い物リストを持っています。② 入口から入店します。③ 店舗の中には、商品棚が並んでいます。④ 買い物リストの中から一番近くにある商品棚まで移動します。⑤ 商品棚に到着したら、次の商品棚まで移動します。⑥ すべての商品を買い物カゴに入れたら、レジで精算します。

★ 商品1

★ 商品2★ 商品3

★ 入口

★ レジ

Page 5: 07. artisocレシピブック ポテンシャル法を高速化しよう

http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 5

③ ツリーに変数を追加するシミュレーションに必要なエージェントと変数を追加します。

ツリーの「 Person 」を右クリックして、「変数の追加」を選択します。

変数名:  PotentialArray :文字列型

※PotentialArray には、 Universe.Map.Potential で 保持している Potential 値をカンマ区切りで行・列の順で格納します。

 お客さまの頭の中に店舗マップがあるイメージです。

Page 6: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 に格納する

※省略

Page 7: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 に従い、方向を取得し、  一歩前に進む

・・・歩行可能エリアでない場合は、  一歩後ろに下がる

・・・目的地の到達確認を行う

Page 8: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 の立ち位置を歩行可能エリアから  除外する処理を削除する。

Page 9: 07. artisocレシピブック ポテンシャル法を高速化しよう

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方向(上下左右)を検索する

Page 10: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 を持つ座標を  取得する

・・・取得した座標を方向に変換する

Page 11: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 に格納する

Page 12: 07. artisocレシピブック ポテンシャル法を高速化しよう

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 から値を取得する

Page 13: 07. artisocレシピブック ポテンシャル法を高速化しよう

http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 13

⑩ シミュレーションを実行する(再掲)シミュレーションを実行します。

ツールバーの [ 実行 ]-[ 実行 ] を選択します。

• 店舗内のお客さまの動きを表現する。• 商品棚には番号がふられている。• お客さまは、買い物リストを持ち、当該

の商品棚(番号)に到着すると、リストから消される。

• 全ての買い物が終わると、レジに移動して終了する。

• Potential の値を表示する。• 色の薄いところが目的とする商品棚であ

る。• ポテンシャル法では、自分の立ち位置ま

で計算した後、計算を打ち切るため、(近場であれば)高速に経路探索ができる。