More Related Content
Similar to 06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう (10)
More from Masaki Tamada (11)
06. artisocレシピブック ポテンシャル法を使って、買い回り行動を再現しよう
- 1. 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: tamada@kke.co.jp
- 2. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
2
店舗内の買い回り行動を再現しよう
道路などの「ネットワークで表現できる空間」の場合は、ダイクストラ法を使って最
短経路を探索できます。
では、店舗内などネットワークとして定義しづらい「面的な空間」の場合は、どうす
れば最短経路を探索できるのでしょうか?
ポテンシャル法を使って、最短経路を探索して、店舗内の買い回り行動を行動
モデルを再現しましょう。
・目次
① ポテンシャル法とは?
② 店舗内の買い回り行動
③ 店舗のフロアデザインを定義する
④ ツリーにエージェントと変数の定義する
⑤ 「Floor」の値から商品棚、入口、レジを生成する
⑥ 入口からお客さまが来店する
⑦ お客さまの行動ルールを定義する
⑧ Potentialを初期化する
⑨ Potentialに従い、方向を取得する
⑩ 商品棚の到達確認を行う
⑪ レジの到達確認を行う
⑫ 出力設定を行う
⑬ シミュレーションを実行する
- 3. 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 7
3 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 6
1 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
- 4. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
4
② 店舗内の買い回り行動
スーパーマーケットを例に、お客さまの買い回り行動を考えます。
① お客さまは買い物リストを持っています。
② 入口から入店します。
③ 店舗の中には、商品棚が並んでいます。
④ 買い物リストの中から一番近くにある商品棚まで移動します。
⑤ 商品棚に到着したら、次の商品棚まで移動します。
⑥ すべての商品を買い物カゴに入れたら、レジで精算します。
★商品1
★商品2
★商品3
★入口
★レジ
- 5. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
5
③-1 店舗のフロアデザインを定義する
ツリーで「空間」と「変数」を定義します。
ツリーの「Universe」で右クリックして、
「空間の追加」を選択します。
空間名: Map
空間の大きさ X: 70
空間の大きさ X: 48
ループしない
ツリーの「Map」で右クリックして、
「変数の追加」を選択します。
変数名: Floor
変数の型: 整数型
- 6. 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: レジ 入口
レジ
壁
商品棚
歩行可能エリア
- 7. 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」を追加しましたが、
前頁の手順で「初期値設定」を選択し、値を設定しようとすると
エラーが表示されます。
これは、設定対象の全ての変数の「最小値」「最大値」を
設定しておく必要があるためで、エラーの場合はご確認ください。
- 8. 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」を読み込む
- 9. 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)を生成する
・・・生成したエージェントに座標を割り当てる
- 10. 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回の頻度で、
お客さまがランダムに来店する
- 11. 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にカンマ区切りで格納する
- 12. 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に従い、方向を取得し、
一歩前に進む
・・・歩行可能エリアでない場合は、
一歩後ろに下がる
・・・目的地の到達確認を行う
- 13. 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 Or Universe.Map.Floor(i, j, 0) == 3 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」に初期化する
- 14. 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
}
・・・他のお客さまが存在するセルは
歩行可能エリアから除外する
- 15. 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方向(上下左右)を検索する
- 16. 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を持つ座標を
取得する
・・・取得した座標を方向に変換する
- 17. 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 And hitFlag == False Then
hitFlag = True
Else
tmpShelfArray = tmpShelfArray & CStr(shelfID) & ","
End If
Next i
・・・ShelfArrayに格納されている商品棚の
IDが、Speedで定義した距離範囲内に
存在するかを確認する
- 18. 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から削除する
- 19. 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
}
・・・買い物が完了してレジに到達したら、
自分自身を削除する
- 20. 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
対応色: 白 黄土色
- 21. 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
対応色: 白 赤
- 22. http://www.kke.co.jpCopyright © 2004 KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
22
⑬ シミュレーションを実行する
シミュレーションを実行します。
ツールバーの[実行]-[実行]を選択します。
• 店舗内のお客さまの動きを表現する。
• 商品棚には番号がふられている。
• お客さまは、買い物リストを持ち、当該の商品棚
(番号)に到着すると、リストから消される。
• 全ての買い物が終わると、レジに移動して終了
する。
• Potentialの値を表示する。
• 色の薄いところが目的とする商品棚である。
• ポテンシャル法では、自分の立ち位置まで計算
した後、計算を打ち切るため、(近場であれば)
高速に経路探索ができる。