狠狠撸

狠狠撸Share a Scribd company logo
搁で巡回セールスマン问题+ジオコーディ
         ング
ある友人が抱えていた深刻な問
  発売後??? 題
「売り切れてる、一本も
  残ってない。」
「しかし、全てのおまけを
    集めたい」
 「ロー○ンのみを回りた       それ、
      い。」           Rで
「あちこち回るのしんど        出来ま
    い。」            すよ!
彼の要望:自宅近辺のロー○ンを効
 率的に回るルートを見つけたい!
問題を解決するには

自宅近辺のロー○ンを効率的に回るルート
       を見つける



巡回セールスマン問題を解いて自宅近辺の
 ロー○ンを出発して戻ってくる効率のよ
   い経路を計算して可視化する。
巡回セールスマン問題(TSP)
? 地図上の各点をすべて回り、元の出発点
  に戻る最短経路を求める問題。
             ?ノード間の距離を定
             義、制約条件の元で最
             小化する問題
             ?NP困難
             ?ヒューリスティック
             を使って解く
早速、搁で彼の问题を解いてみよう!
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
ロー○ンのリストを取得

      ロー○ンの住所を集めて、CSVに直す

                      CSV




コンビニの住所を集めたWebサイト


件数が多いのでRcurlでスパイダリングする(後述)。
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
住所を位置情報に変換する
? ジオコーディング???住所から、緯度
  経度を求める
? GoogleGeocoding API

                            JSONファイル
URL:
http://maps.google.com/m
aps/api/geocode/json?addr
ess=東京都台東区元浅草3
丁目1-1にアクセス




 JsonファイルをRjsonを使って解析する必要がある。
搁肠耻谤濒:奥别产からデータ取得
        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&region=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
}
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
巡回セールスマン問題(TSP)
? 地図上の各点をすべて回り、元の出発点
  に戻る最短経路を求める問題。
                 ?ノード間の距離を定
                 義、制約条件の元で最
                 小化する問題
                 ?NP困難
                 ?ヒューリスティック
                 を使って解く




   TSPパッケージを使えば簡単に解ける!
TSPパッケージ
? RでTSP問題を解くためのパッケージ
                                                     指定可能なアル
                                                       ゴリズム
dist(mat)        TSP                        ATSP


 距離行列より、巡                                             Nearest
 回セールスマン問                                             insertion
  題を定義する。                                             fartherest
                       Solve_TSP(TSP or ATSP)
                                                      cheapest
TSPもしくはATSPを受け                                        arbitrary
取り、methodを指定し                  TOUR
    てTSPを解く                                           2-opt

                                                最短経路の解を
                                                 表すクラス
罢厂笔の解法例(2-辞辫迟法)
罢厂笔の解法例(2-辞辫迟法)
? 2-opt法、ランダムに作成した経路を入れ
  替えて、最适化する方法
罢厂笔の解法例(2-辞辫迟法)
? 2-opt法、ランダムに作成した経路を入れ
  替えて、最适化する方法




  ①ランダムに経路を作成する。
罢厂笔の解法例(2-辞辫迟法)
? 2-opt法、ランダムに作成した経路を入れ
  替えて、最适化する方法




  ②ランダムに作成した経路は効率が悪い
罢厂笔の解法例(2-辞辫迟法)
? 2-opt法、ランダムに作成した経路を入れ
  替えて、最适化する方法




  ②2つの辺を選択して
罢厂笔の解法例(2-辞辫迟法)
? 2-opt法、ランダムに作成した経路を入れ
  替えて、最适化する方法




  ③改善すれば端点を入れ替える。以後、繰り返
  し。
搁で罢厂笔を解いて、
     最も良かったものを返す。
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)])
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
Google Static MAP API
? Webサービスとして地図を表示する。
? マーカーや経路を書くことが出来る。




 RGoogleMapsというGoogleMapAPIのラッパーが存在す
                  る。
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)
やることリスト
1.   ロー○ンの住所リストを集める
2.   住所を位置情報に変換する
3.   TSPを解いて経路を求める
4.   地図上に経路を可視化する
结果
やったね!
おまけ
? これで与えられた条件内で問題を解決することは
  終了
→対症療法
? 問題を根本から解決し、永続的なソリューション
  で顧客にバリューを提供してこそコンサルタント
  の仕事ですよね
? 問題(ロー○ンがないので各地をさまよう)を根
  本から解決する
→解決策:最寄りがロー○ンで、かつロー○ンの多い
  土地に住む
           それ、Rで出
           来ますよ!
この中のどこに住めばよいか




            deldirと
          RGoogleMap
            を使う
           と???
一目瞭然




●ロー○ン
●セブンイレブン
●ファミリーマート
●サークルKサンク
ス
●ミニストップ
○その他
まとめ
? RcurlでRでクローリングができるよ!
? RjsonでJsonの解析ができるよ!
? TSPで巡回セールスマン問題が解けるよ!
? RgooglemapでR内でGoogleMAPAPIの地図が
  扱いやすくなるよ!
? Rならボロノイ分割を使った可視化も楽勝
  だね!
? PythonやめてRを使いましょう。

More Related Content

TSP and Geocoding on R