06. artisocレシピブック...

22
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. 06. artisoc 株株株株株株 株株株株株株株株株株株 株株株株株株株株株株株株 株株株株株株株株株株株株株株株株株株株株株株株 『』 株株株株株 株株株株株株株株株株株株 、。 株株 株株株株株株株 () 株株株株株株 株株株株株株株株 artisoc 株株株株株株株株株 株株 Tel: 052-222-8461 E-mail: [email protected]

Upload: masaki-tamada

Post on 13-Aug-2015

316 views

Category:

Software


5 download

TRANSCRIPT

Page 1: 06. 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.

06. artisoc レシピブック ポテンシャル法を使って、買い回り行動を再現しよう

本ドキュメントについてのご質問、『複雑系勉強会』のお問合せは、下記までご連絡ください。

(株)構造計画研究所社会デザイン・マーケティン

グ部artisoc マーケティング担当

 玉田  Tel: 052-222-8461  E-mail: [email protected]

Page 2: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

店舗内の買い回り行動を再現しよう道路などの「ネットワークで表現できる空間」の場合は、ダイクス

トラ法を使って最短経路を探索できます。では、店舗内などネットワークとして定義しづらい「面的な空間」

の場合は、どうすれば最短経路を探索できるのでしょうか?ポテンシャル法を使って、最短経路を探索して、店舗内の買い回り

行動を行動モデルを再現しましょう。

・目次① ポテンシャル法とは?② 店舗内の買い回り行動③ 店舗のフロアデザインを定義する④ ツリーにエージェントと変数の定義する⑤ 「 Floor 」の値から商品棚、入口、レジを生成する⑥ 入口からお客さまが来店する⑦ お客さまの行動ルールを定義する

⑧ Potential を初期化する⑨ Potential に従い、方向を取得す

る⑩ 商品棚の到達確認を行う⑪ レジの到達確認を行う⑫ 出力設定を行う⑬ シミュレーションを実行する

Page 3: 06. 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: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

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

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

★ 商品1

★ 商品2★ 商品3

★ 入口

★ レジ

Page 5: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

③-1 店舗のフロアデザインを定義するツリーで「空間」と「変数」を定義します。

ツリーの「 Universe 」で右クリックして、「空間の追加」を選択します。

空間名:  Map空間の大きさ  X :  70空間の大きさ  X :  48ループしない

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

変数名:  Floor変数の型: 整数型

Page 6: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

③-2 店舗のフロアデザインを定義する描画ツールを利用して、フロアデザインを定義します。

ツリーの「 Map 」を右クリックして「初期値設定」を選択し、描画ツールを表示します。

上メニューの「罫線」をクリックします。左メニューの「変数」タブを選択します。

設定対象:  Floorマーカー:  Floor最小値: 白( 0 )最大値: 青( 4 )設定値:  1  →「 1 」が代入されます指定方法:

未選択 →マウスで表示範囲を指定クリック →1セルずつ値を変更矩形 →選択範囲の値を変更直線 →直線上の値を変更

「 Floor 」の値を次の通り指定します。0 : 歩行可能エリア1 : 壁2 : 商品棚3 : 入口4 : レジ

入口

レジ

商品棚

歩行可能エリア

Page 7: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

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

ツリーの「 Map 」を右クリックして、「エージェント型の追加」を選択します。

エージェント名:  Person  :お客さまエージェント名:  Shelf  :商品棚エージェント名:  Entrance  :入口エージェント名:  Register  :レジ

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

変数名:  Potential :整数型ツリーの「 Person 」を右クリックして、

「変数の追加」を選択します。変数名:  ShelfArray :文字列型変数名:  Speed :実数型

※ ここでは、空間の変数として「 Potential 」を追加しましたが、 前頁の手順で「初期値設定」を選択し、値を設定しようとすると エラーが表示されます。 これは、設定対象の全ての変数の「最小値」「最大値」を 設定しておく必要があるためで、エラーの場合はご確認ください。

Page 8: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑤-1 「 Floor 」の値から商品棚、入口、レジを生成する描画ツールで指定した「 Floor 」の値に従って、エージェントを生成しま

す。ツリーの「 Universe 」を右クリックして、「ルールエディタ」を選択します。

include “potential.inc”

Univ_Init { set_floor()}

・・・ポテンシャル法を利用するためのライブラリを  読み込む

・・・サブルーチン「 set_floor 」を読み込む

Page 9: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑤-2 「 Floor 」の値から商品棚、入口、レジを生成する

・・・ 10 ステップごとに歩行者を生成する

・・・ゴール地点 (Point ID=23) を設定する  (第 2引数は文字列なので注意してください)

Sub set_floor(){ Dim oneAgt As Agt 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) == 2 Then oneAgt = CreateAgt(Universe.Map.Shelf) ElseIf Universe.Map.Floor(i, j, 0) == 3 Then oneAgt = CreateAgt(Universe.Map.Entrance) ElseIf Universe.Map.Floor(i, j, 0) == 4 Then oneAgt = CreateAgt(Universe.Map.Register) End If If Universe.Map.Floor(i, j, 0) >= 2 Then oneAgt.X = i oneAgt.Y = j End If Next j Next i}

・・・空間上の全ての座標の「 Floor 」の値を チェックする

・・・ 2 のとき、商品棚( Floor )を生成する

・・・ 3 のとき、入口( Entrance )を生成する

・・・ 4 のとき、レジ( Register )を生成する

・・・生成したエージェントに座標を割り当てる

Page 10: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑥-1 入口からお客さまが来店する10 ステップに 1 回の頻度でお客さまが来店します。

ツリーの「 Entrance 」を右クリックして、「ルールエディタ」を選択します。

Agt_Step { If Rnd() < 1/10 Then create_person() End If}

・・・ 10 ステップに 1 回の頻度で、  お客さまがランダムに来店する

Page 11: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑥-2 入口からお客さまが来店するSub create_person(){ Dim personAgt As Agt Dim i As Integer personAgt = CreateAgt(Universe.Map.Person) personAgt.X = My.X personAgt.Y = My.Y personAgt.Speed = 1.0 personAgt.ShelfArray = "" For i=0 To 3 - 1 personAgt.ShelfArray = personAgt.ShelfArray &

CStr(CInt(CountAgt(Universe.Map.Shelf) * Rnd())) & "," Next i personAgt.ShelfArray = Left(personAgt.ShelfArray, Len(personAgt.ShelfArray) - 1)}

・・・ Person を生成する

・・・買いたい商品(商品棚)をランダムに 3 つ選択し、   ShelfArray にカンマ区切りで格納する

Page 12: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑦ お客さまの買い回り行動を定義するPotential 法に従って、買い回り行動を行います。

ツリーの「 Person 」を右クリックして、「ルールエディタ」を選択します。

Agt_Step { init_potential() @set_potential(My.X, My.Y, My.ShelfArray) 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 を初期化する・・・ Potential を更新する

・・・ Potential に従い、方向を取得し、  一歩前に進む

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

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

Page 13: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑧-1 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 」に初期化する

Page 14: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑧-2 Potential を初期化する MakeAgtSet(personAgtSet, Universe.Map.Person) For Each oneAgt In personAgtSet If My.ID <> oneAgt.ID Then Universe.Map.Potential(CInt(oneAgt.X),CInt(oneAgt.Y), 0) = -1 End If Next oneAgt}

・・・他のお客さまが存在するセルは  歩行可能エリアから除外する

Page 15: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑨-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 = Universe.Map.Potential(My.X, My.Y, 0) 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

・・・周囲4方向(上下左右)を検索する

Page 16: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑨-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 = Universe.Map.Potential(tmpX, tmpY, 0) 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))}

・・・座標が空間内であることを確認する・・・歩行可能エリアであることを確認する

・・・より小さい Potential を持つ座標を  取得する

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

Page 17: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑩-1 商品棚の到達確認を行うSub check_shelf(){ Dim shelfAgt As Agt Dim shelfID As Integer Dim tmpShelfArray As String Dim hitFlag As Boolean Dim i As Integer tmpShelfArray = "" If CountToken(My.ShelfArray) > 0 Then hitFlag = False For i=0 To CountToken(My.ShelfArray) - 1 shelfID = CInt(GetToken(My.ShelfArray, i)) shelfAgt = Universe.Map.Shelf(shelfID) If MeasureDistance(CInt(My.X), CInt(My.Y), CInt(shelfAgt.X), CInt(shelfAgt.Y),

Universe.Map) <= My.Speed Then hitFlag = True Else tmpShelfArray = tmpShelfArray & CStr(shelfID) & "," End If Next i

・・・ ShelfArray に格納されている商品棚の   ID が、 Speed で定義した距離範囲内に  存在するかを確認する

Page 18: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑩-2 商品棚の到達確認を行う If hitFlag == True Then If CountToken(My.ShelfArray) == 1 Then My.ShelfArray = "" Else My.ShelfArray = Left(tmpShelfArray, Len(tmpShelfArray) - 1) End If End If End If}

・・・商品棚に到着したときは、  当該の商品棚の ID を   ShelfArray から削除する

Page 19: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑪ レジの到達確認を行うSub check_register(){ Dim registerAgt As Agt

If CountToken(My.ShelfArray) == 0 Then registerAgt = Universe.Map.Register(0) If MeasureDistance(CInt(My.X), CInt(My.Y), CInt(registerAgt.X), CInt(registerAgt.Y),

Universe.Map) <= My.Speed Then TerminateAgt(My.UniqueID) End If End If}

・・・買い物が完了してレジに到達したら、  自分自身を削除する

Page 20: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑫-1 出力設定を行う出力項目の設定を行います。

ツールバーの [ 設定 ]-[ 出力設定 ] を選択します。

出力項目リストが表示されますので、「マップ出力」を選択して「追加」ボタンをクリックします。

マップ名:  Mapマップ要素リストの「追加」ボタンを

クリックします。要素名:  Person

出力対象:  Personマーカー: ●固定色: 水色エージェント変数情報: 

ShelfArray要素名:  Shelf

出力対象:  Shelfマーカー: なし情報表示:  ID

要素名:  Floor出力対象:  Floorマーカー: ■グラデーション指定 変数指定:  0 <= X

<= 4            対応色: 白     黄土色

Page 21: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑫-2 出力設定を行うPotential を画面出力します。

ツールバーの [ 設定 ]-[ 出力設定 ] を選択します。

出力項目リストが表示されますので、「マップ出力」を選択して「追加」ボタンをクリックします。

マップ名:  Potentialマップ要素リストの「追加」ボタンを

クリックします。要素名:  Person

出力対象:  Personマーカー: ●固定色: 水色エージェント変数情報:  ID

要素名:  Potential出力対象:  Potentialマーカー: ■グラデーション指定 変数指定:  0 <=

X <= 100            対応色: 白     赤

Page 22: 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう

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

⑬ シミュレーションを実行するシミュレーションを実行します。

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

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

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

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

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

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

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