見出し画像

AIによる観光アプリ 第3回:観光地間の移動方法の推測

今回も人工知能による観光アプリ「鎌倉観光案内」の技術紹介です。
全5回中の3回目となる今回は、観光地の間の移動方法をデータ化するための手法を紹介します。次回の記事では、この移動データを使って観光コースを組み立てます。

前回の記事はこちらからどうぞ。
第1回:自作アプリ「鎌倉観光案内」の紹介
第2回:観光地のおすすめ度を決める技術

記事中の地図にはOpen Street Mapの地図画像を使用しています。
Base map and data from OpenStreetMap and OpenStreetMap Foundation

アプリでの移動情報

鎌倉観光案内の最終的な目標は、観光時間に合わせた観光のスケジュールを自動的に作ることです。そのためには、ある観光地から別の観光地への移動情報が必要です。

鎌倉観光案内のアプリの画面でも、移動に必要な時間や、利用する交通機関の情報が出力されます。観光コースの計算中には、これらが内部でフル活用されます。

画像1

今回は、これらの移動情報をどのように作り出すかを説明します。

移動時間マトリクス

移動元の観光地と、移動先の観光地の組み合わせは無数にあります。
観光コースを組み立てるとき、観光地の組み合わせが変わるたびに移動情報を計算すると効率が悪いため、すべての組み合わせをあらかじめ計算しておきます。
事前に計算した情報は、「移動時間マトリクス」と「移動手段マトリクス」として保存します。以下は観光地5つでの例です。実際は、観光地67箇所分ある、67×67の巨大なマトリクスを保持します(巨大とは言っても、本業で扱っているのセル数より5桁も小さい!)。

画像7

これらのマトリクスを使うと、移動元の観光地と、移動先の観光地から、一瞬で移動時間と移動手段が分かります。

ここで、表が三角行列となっているのは、移動の行きと帰りで移動時間や移動手段が同じになるためです。鎌倉観光案内での移動は徒歩または電車に限定したため、車のように一方通行の影響を受けません。観光地A→Bの移動情報は、B→Aの移動情報と同じになるため、片方だけの情報で十分です。

移動距離の計算

2地点の間の移動を考えるとき、普通はカーナビや地図サービスのように地図データを使う必要があります。しかし、一般的に地図データを使うには、ライセンス料など、大きな問題が伴います。
鎌倉観光案内は個人が趣味で作ったアプリなので、地図にコストをかけられません。そこで、簡易的に2点間の直線上を一定速度で移動する方法を採用しました。

画像3

高徳院から長谷寺までの移動では、緑色のように道に沿って進むのが正しい移動ですが、地図データがないと青色のような直線移動になります。

大前提として、観光地の場所は緯度経度の形で保持しています。
最近、Web版のGoogle Mapで、地図上の右クリックから緯度経度をコピーできる神機能が実装されました。まさにこういう作業のための機能です。

不動産屋の駅からの徒歩時間の表記では、分速80mで計算しているという噂ですので、鎌倉観光案内では斜め移動も考慮し、半分程度の分速40mに設定しました。

ヒュベニの距離計算式
2地点間の距離を計算する方法をGoogleで調べると、「ヒュベニの距離計算式」というものが見つかりました。緯度経度2つを指定すると、地球の赤道半径や離心率を使って、2地点の間の直線距離を計算できるようです。計算は難しそうですが、詳細は専門家に任せてサンプルコードをそのまま参考にしてしまいます。

距離が分かれば、あとは小学校の算数の世界です。求めた距離を移動速度(分速40m)で割って、移動時間を計算します。これを観光地のすべての組み合わせについて計算すれば、徒歩での移動時間マトリクスが完成します。

方式の限界

今回は地図を使わない方式のため、移動時間は不正確な場合があります。
最も強い影響を受けるのは、2地点の間に道路がない場合です。

例えば、報国寺から妙法寺に移動する場合、「釈迦通り切通し」を通るのが最短ルートですが、ここは近年通行止めになっています。迂回すると、直線移動のルートと大きく異なる結果となるため、移動時間の誤差が大きくなってしまいます。

画像7

地図を使わない方法では、こうした現象が起きるのは悩ましいところです。

ちなみに、周囲を山に囲まれた鎌倉に往来するために作った古道が「切り通し」です。鎌倉時代の道のため、通るだけでも雰囲気を味わえます。上の「釈迦通り切通し」は大昔のトンネルで、崩壊の危険があるようです。

電車移動の対応

鎌倉の観光は徒歩移動が中心ですが、長距離の移動には電車移動(JRと江ノ電)が使えます。エリア内の駅は、北鎌倉、鎌倉、和田塚、由比ヶ浜、長谷、極楽寺の6カ所です。
バスやタクシーは計算が複雑になりすぎるのでサポートしません。

例えば、鶴岡八幡宮から長谷寺への移動は、次の地図のように駅への直線移動と電車での移動時間から計算されます。電車での移動時間は時刻表の平均移動時間に、待ち時間10分(JR/江ノ電をまたぐ場合は乗り換え時間10分も)を加えています。

画像7

ここでの電車移動の計算方法は、最適化処理に特有で興味深いです。
鶴岡八幡宮から長谷寺に電車で移動するには、6カ所の駅のどこかで乗車して別の駅で降車します。この、乗車駅と降車駅の組み合わせは全部で30通りありますが、適切な組み合わせはすぐに分かりません。
そこで、すべての駅の組み合わせを、以下の表のような形で網羅的に試します。表の中から、徒歩移動と乗車時間の合計が最も小さい組み合わせを探します。

画像5

極端な組み合わせでは、下のように、鶴岡八幡宮から極楽寺駅まで歩いて、北鎌倉駅まで電車で戻ってから長谷寺まで歩くようなケースも考慮されています。これは合計3時間以上かかるため破棄されますが、可能性の1つとして、このようなパターンまで探すあたりが、おもしろいところです。

画像7

駅数が多い場合は組み合わせが膨大になるため、上のようにあり得ないパターンを計算前に回避する仕組みが必要です。効率的な方法を目指して、無駄な処理を絞り込んでいくのは、最適化処理を実装するうえでの醍醐味です。

電車移動の別案

鎌倉観光案内での電車移動は、上のような方式で乗降駅の全パターンを網羅して計算していますが、別の計算方法も考えられます。
出発地点と到着地点の最寄り駅をそれぞれ調べ、その間で電車を使う方法です(もちろん、出発地点から到着地点に直行した方が所要時間が短い場合は徒歩移動)。

この方法は一短一長があります。例えば以下のように長谷寺から円応寺に行く場合です。

画像8

長谷寺から円応寺に行くためには、地図の青色ルートと緑色ルートの2通りが考えられます。
青色ルートは初めに示した、網羅的に乗降駅を調べる方法です。最短の移動時間となる鎌倉駅で降ります。
緑色ルートは最寄り駅を使う方式です。到着地の円応寺の最寄り駅は北鎌倉駅です。徒歩移動は短くなりますが、北鎌倉駅から逆方向に戻る移動が発生し、乗車や乗り換えで余計な時間がかかります。

今回は移動時間を優先して青色ルートが出る計算方法を選びましたが、どちらがよいかは、難しい選択です。緑色ルートは時間はかかりますが、徒歩移動は最小になります。
コース作成時の条件設定画面で年配者を想定した「徒歩移動を最小にする」などのオプションを付け、ONを選択した場合には緑色のルート(最寄り駅の選択方式)に切り替えるなど、工夫が必要かもしれません。

AIと違和感の関係

広義のAIでは、計算ロジックを自分で考えるため、先ほどの電車利用の例のように何が最適かを十分吟味しないと違和感が生じることがよくあります。

システムの設計では、よく「自分が使う立場になって」と言います。最適化処理では、現実世界と比較せずに数字の善し悪しだけで評価していると、これが結果の違和感や気持ち悪さとなって表れます。
結果の感じ方が人間の感性に合っていないと、AIなどは使い物にならないという評価にもつながりかねません。利用者の立場で「結果の妥当性を評価する」という作業は、極めて重要だと感じている次第です。