SlideShare a Scribd company logo
1 of 22
Download to read offline
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
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 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
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 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」に初期化する
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 And hitFlag == False 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の値を表示する。
• 色の薄いところが目的とする商品棚である。
• ポテンシャル法では、自分の立ち位置まで計算
した後、計算を打ち切るため、(近場であれば)
高速に経路探索ができる。

More Related Content

What's hot

形態素解析の過去・現在・未来
形態素解析の過去・現在・未来形態素解析の過去・現在・未来
形態素解析の過去・現在・未来
Preferred Networks
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
Shota Imai
 

What's hot (20)

深層学習の将棋Aiへの浸透について
深層学習の将棋Aiへの浸透について深層学習の将棋Aiへの浸透について
深層学習の将棋Aiへの浸透について
 
ゲームAI製作のためのワークショップ(I)
ゲームAI製作のためのワークショップ(I)ゲームAI製作のためのワークショップ(I)
ゲームAI製作のためのワークショップ(I)
 
ここまで来た!公共交通オープンデータ最新事情
ここまで来た!公共交通オープンデータ最新事情ここまで来た!公共交通オープンデータ最新事情
ここまで来た!公共交通オープンデータ最新事情
 
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
【Unity道場 建築スペシャル2】点群ビジュアライゼーション【Unity道場 建築スペシャル2】点群ビジュアライゼーション
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
 
Webデザインのための配色セオリー
Webデザインのための配色セオリーWebデザインのための配色セオリー
Webデザインのための配色セオリー
 
ROSを用いた歩行ロボットの脚の開発
ROSを用いた歩行ロボットの脚の開発ROSを用いた歩行ロボットの脚の開発
ROSを用いた歩行ロボットの脚の開発
 
ゲーム体験を支える強化学習の実応用について
ゲーム体験を支える強化学習の実応用についてゲーム体験を支える強化学習の実応用について
ゲーム体験を支える強化学習の実応用について
 
形態素解析の過去・現在・未来
形態素解析の過去・現在・未来形態素解析の過去・現在・未来
形態素解析の過去・現在・未来
 
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
3次元レジストレーションの基礎とOpen3Dを用いた3次元点群処理
 
Tableau活用4年の軌跡
Tableau活用4年の軌跡Tableau活用4年の軌跡
Tableau活用4年の軌跡
 
マルチモーダル深層学習の研究動向
マルチモーダル深層学習の研究動向マルチモーダル深層学習の研究動向
マルチモーダル深層学習の研究動向
 
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
論文紹介「PointNetLK: Robust & Efficient Point Cloud Registration Using PointNet」
 
SSII2022 [OS2-01] イメージング最前線
SSII2022 [OS2-01] イメージング最前線SSII2022 [OS2-01] イメージング最前線
SSII2022 [OS2-01] イメージング最前線
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門
 
SSII2022 [OS1-01] AI時代のチームビルディング
SSII2022 [OS1-01] AI時代のチームビルディングSSII2022 [OS1-01] AI時代のチームビルディング
SSII2022 [OS1-01] AI時代のチームビルディング
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
論文紹介 Semantic Mapping for Mobile Robotics Tasks: A Survey
論文紹介 Semantic Mapping for Mobile Robotics Tasks: A Survey論文紹介 Semantic Mapping for Mobile Robotics Tasks: A Survey
論文紹介 Semantic Mapping for Mobile Robotics Tasks: A Survey
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
 
LiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングLiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピング
 
Structural data analysis based on multilayer networks
Structural data analysis based on multilayer networksStructural data analysis based on multilayer networks
Structural data analysis based on multilayer networks
 

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

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

07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう07. artisocレシピブック ポテンシャル法を高速化しよう
07. artisocレシピブック ポテンシャル法を高速化しよう
 
Hands on
Hands onHands on
Hands on
 
08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しよう08. artisocレシピブック ダイクストラ法を高速化しよう
08. artisocレシピブック ダイクストラ法を高速化しよう
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
 
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
10. artisocレシピブック a star探索アルゴリズムを使って、最短経路を自動的に探索しよう
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.
 
Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本Jetpack Composeのパフォーマンスの基本
Jetpack Composeのパフォーマンスの基本
 
AOZORAYOMITE and Intent
AOZORAYOMITE and IntentAOZORAYOMITE and Intent
AOZORAYOMITE and Intent
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習広告配信現場で使うSpark機械学習
広告配信現場で使うSpark機械学習
 

More from Masaki Tamada

More from Masaki Tamada (11)

【MASの教材】ホタルの光
【MASの教材】ホタルの光【MASの教材】ホタルの光
【MASの教材】ホタルの光
 
【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」【MASの教材】シェリングの「分居モデル」
【MASの教材】シェリングの「分居モデル」
 
【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトン【MASの教材】水槽の中のプランクトン
【MASの教材】水槽の中のプランクトン
 
【MASの教材】病気の流行
【MASの教材】病気の流行【MASの教材】病気の流行
【MASの教材】病気の流行
 
【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れ【MASの教材】ターミナル駅の通勤客の流れ
【MASの教材】ターミナル駅の通勤客の流れ
 
【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるように【MASの教材】立ち話モデル 人間関係が見えるように
【MASの教材】立ち話モデル 人間関係が見えるように
 
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへ【MASの教材】飛ぶ鳥モデルからボイドモデルへ
【MASの教材】飛ぶ鳥モデルからボイドモデルへ
 
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろうartisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
artisoc Cloudレシピブック_06. 描画ツール2を使って歩くモデルをつくろう
 
第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会第2回 artisoc Cloud勉強会
第2回 artisoc Cloud勉強会
 
第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会第1回 artisoc Cloud勉強会
第1回 artisoc Cloud勉強会
 
09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しよう09. artisocレシピブック 3Dモデルを作成しよう
09. artisocレシピブック 3Dモデルを作成しよう
 

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の値を表示する。 • 色の薄いところが目的とする商品棚である。 • ポテンシャル法では、自分の立ち位置まで計算 した後、計算を打ち切るため、(近場であれば) 高速に経路探索ができる。