06. 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.
06. artisoc レシピブック ポテンシャル法を使って、買い回り行動を再現しよう
本ドキュメントについてのご質問、『複雑系勉強会』のお問合せは、下記までご連絡ください。
(株)構造計画研究所社会デザイン・マーケティン
グ部artisoc マーケティング担当
玉田 Tel: 052-222-8461 E-mail: [email protected]
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 2
店舗内の買い回り行動を再現しよう道路などの「ネットワークで表現できる空間」の場合は、ダイクス
トラ法を使って最短経路を探索できます。では、店舗内などネットワークとして定義しづらい「面的な空間」
の場合は、どうすれば最短経路を探索できるのでしょうか?ポテンシャル法を使って、最短経路を探索して、店舗内の買い回り
行動を行動モデルを再現しましょう。
・目次① ポテンシャル法とは?② 店舗内の買い回り行動③ 店舗のフロアデザインを定義する④ ツリーにエージェントと変数の定義する⑤ 「 Floor 」の値から商品棚、入口、レジを生成する⑥ 入口からお客さまが来店する⑦ お客さまの行動ルールを定義する
⑧ Potential を初期化する⑨ Potential に従い、方向を取得す
る⑩ 商品棚の到達確認を行う⑪ レジの到達確認を行う⑫ 出力設定を行う⑬ シミュレーションを実行する
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
③-1 店舗のフロアデザインを定義するツリーで「空間」と「変数」を定義します。
ツリーの「 Universe 」で右クリックして、「空間の追加」を選択します。
空間名: Map空間の大きさ X : 70空間の大きさ X : 48ループしない
ツリーの「 Map 」で右クリックして、「変数の追加」を選択します。
変数名: Floor変数の型: 整数型
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 : レジ
入口
レジ
壁
商品棚
歩行可能エリア
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 」を追加しましたが、 前頁の手順で「初期値設定」を選択し、値を設定しようとすると エラーが表示されます。 これは、設定対象の全ての変数の「最小値」「最大値」を 設定しておく必要があるためで、エラーの場合はご確認ください。
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 」を読み込む
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 )を生成する
・・・生成したエージェントに座標を割り当てる
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 回の頻度で、 お客さまがランダムに来店する
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 にカンマ区切りで格納する
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 に従い、方向を取得し、 一歩前に進む
・・・歩行可能エリアでない場合は、 一歩後ろに下がる
・・・目的地の到達確認を行う
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 」に初期化する
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}
・・・他のお客さまが存在するセルは 歩行可能エリアから除外する
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方向(上下左右)を検索する
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 を持つ座標を 取得する
・・・取得した座標を方向に変換する
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 で定義した距離範囲内に 存在するかを確認する
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 から削除する
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}
・・・買い物が完了してレジに到達したら、 自分自身を削除する
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 対応色: 白 黄土色
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 対応色: 白 赤
http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved. 22
⑬ シミュレーションを実行するシミュレーションを実行します。
ツールバーの [ 実行 ]-[ 実行 ] を選択します。
• 店舗内のお客さまの動きを表現する。• 商品棚には番号がふられている。• お客さまは、買い物リストを持ち、当該
の商品棚(番号)に到着すると、リストから消される。
• 全ての買い物が終わると、レジに移動して終了する。
• Potential の値を表示する。• 色の薄いところが目的とする商品棚であ
る。• ポテンシャル法では、自分の立ち位置ま
で計算した後、計算を打ち切るため、(近場であれば)高速に経路探索ができる。