TSP and Geocoding on R
- 2. ある友人が抱えていた深刻な問
発売後??? 題
「売り切れてる、一本も
残ってない。」
「しかし、全てのおまけを
集めたい」
「ロー○ンのみを回りた それ、
い。」 Rで
「あちこち回るのしんど 出来ま
い。」 すよ!
彼の要望:自宅近辺のロー○ンを効
率的に回るルートを見つけたい!
- 6. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 7. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 8. ロー○ンのリストを取得
ロー○ンの住所を集めて、CSVに直す
CSV
コンビニの住所を集めたWebサイト
件数が多いのでRcurlでスパイダリングする(後述)。
- 9. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 10. 住所を位置情報に変換する
? ジオコーディング???住所から、緯度
経度を求める
? GoogleGeocoding API
JSONファイル
URL:
http://maps.google.com/m
aps/api/geocode/json?addr
ess=東京都台東区元浅草3
丁目1-1にアクセス
JsonファイルをRjsonを使って解析する必要がある。
- 11. 搁肠耻谤濒:奥别产からデータ取得
Rjson:jsonをパース
library(RCurl) パッケージのロード
library(rjson)
url<-paste("http://maps.google.com/ Google Geocoding API 用URLを
maps/api/geocode/json?address=", 作成する。
RCurl::curlEscape("東京都台東区元浅草3
丁目1-1"), "&sensor=false®ion=JP
&language=ja", sep="")
Geocodingのjson情報を取得する。
json<-RCurl::getURL(url)
if(rjson::.fromJSON_R(json)$status ==
"OK"){
lat<-
取得したjsonデータをパースして
rjson::.fromJSON_R(json)$results[[1]]$geo
緯度を取得
metry$location$lat
}
- 12. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 14. TSPパッケージ
? RでTSP問題を解くためのパッケージ
指定可能なアル
ゴリズム
dist(mat) TSP ATSP
距離行列より、巡 Nearest
回セールスマン問 insertion
題を定義する。 fartherest
Solve_TSP(TSP or ATSP)
cheapest
TSPもしくはATSPを受け arbitrary
取り、methodを指定し TOUR
てTSPを解く 2-opt
最短経路の解を
表すクラス
- 21. 搁で罢厂笔を解いて、
最も良かったものを返す。
library(TSP)
TSPパッケージを使用する。
Tsp<-TSP(dist(df))
methods <- c("nearest_insertion",
"cheapest_insertion", "farthest_insertion", TSPの問題を作成する。
"arbitrary_insertion", "nn",
"repetitive_nn", "2-opt")
tours <- lapply(methods, FUN =
function(m) solve_TSP(tsp), method = m))
names(tours) <- methods Solve_TSP関数で問題を解く
tour_lengths <- c(sapply(tours, FUN = attr,
"tour_length"))
str(toursseq(tour_lengths)[tour_lengths==
min(tour_lengths)])
as.integer(toursseq(tour_lengths)[tour_len 最も结果の良かった経路を返す
gths==min(tour_lengths)])
- 22. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 23. Google Static MAP API
? Webサービスとして地図を表示する。
? マーカーや経路を書くことが出来る。
RGoogleMapsというGoogleMapAPIのラッパーが存在す
る。
- 24. RでGoogleMapを使用する
library(RgoogleMaps) RgoogleMapsパッケージを使用す
る。
map_zoom<-MaxZoom(range(lat),
range(lon))
GoogleMapAPI用に倍率、中心を
map_center<-c(mean(lat), mean(lon))
作成する。
GetMap(center=map_center,
maptype="roadmap",
marker=map_marker, zoom=map_zoom, GoogleMapオブジェクトの取得
path=map_path)
TextOnStaticMap(MyMap, RのグラフィックをGoogleMapに
lat=lat[4],lon=lon[4], “samole”, add=TRUE, 上書きする。
cex=0.5)
- 25. やることリスト
1. ロー○ンの住所リストを集める
2. 住所を位置情報に変換する
3. TSPを解いて経路を求める
4. 地図上に経路を可視化する
- 28. おまけ
? これで与えられた条件内で問題を解決することは
終了
→対症療法
? 問題を根本から解決し、永続的なソリューション
で顧客にバリューを提供してこそコンサルタント
の仕事ですよね
? 問題(ロー○ンがないので各地をさまよう)を根
本から解決する
→解決策:最寄りがロー○ンで、かつロー○ンの多い
土地に住む
それ、Rで出
来ますよ!