CONTACT
PiomatixLBSで最適な巡回ルートを見つけよう!(前編)

PiomatixLBSで最適な巡回ルートを見つけよう!(前編)

皆さんは「スタート地点からある場所を経由して、ゴール地点へのルート」を知りたいとき、どうしていますか?
今では多くの方が、パソコンやスマートフォンなどで地図アプリを開いて検索することと思います。
あるいは、車を運転する方であれば、カーナビを使う方もいらっしゃるでしょう。

では、「経由地点で30分滞在する場合」「途中に1時間の休憩を挟む場合」「より省エネルギーで移動したい場合」はどうでしょうか。

……随分難しい条件になりましたね。
残念ながら、一般的な地図アプリなどではこのようなケースはサポートされていないため、経由地点ごとに分けてみたりルートを微調整したり、手作業が発生してしまいます。

普段皆さんがルートを調べる状況では、このようなケースは少ないかもしれません。
しかし、配送を扱う業務では、この複雑な条件が非常に重要になります。

例として、一般的なチェーン量販店をイメージしてみましょう。
商品の配送では、補充や在庫調整などのため複数の店舗を回る必要がありますし、さらに予定の時刻に間に合わせつつ、適切な休憩時間も取らなくてはいけないかもしれません。
こんなとき、優秀なベテランドライバーの方であれば経験や感覚から効率の良い巡回ルートを構築できるかもしれませんが、全国的なドライバー不足が叫ばれる昨今では、都合よくお任せできるともかぎりません。

ドライバーの経験値に頼らずとも、複雑な条件で最適な巡回ルートを調べたい……。

そんな時に役立つソリューションが PiomatixLBS です!

PiomatixLBSとは?

技術ブログ画像
PiomatixLBShttps://jpn.pioneer/ja/piomatixlbs/) とは パイオニア株式会社 からリリースされている、オープンプラットフォームサービスです。
パイオニアのカーナビを実際に使っている方も多いと思いますが、それらで長年培ったデータとノウハウを利用しやすいようにAPI/SDK化したものが PiomatixLBS です。

PiomatixLBS には様々な機能が含まれていますが、冒頭で例に挙げたような「複雑な条件の最適な巡回ルートを調べたい」というときは 巡回最適化API が適しています。

一般的な地図情報のほかにも道路の細かな情報や各車両からのプローブデータも考慮するため、出力される情報はリアルタイムな情報になります。
前述のような、複数の目的地を巡回しつつ各種時間も考慮した、その時に最適な巡回順やルートを算出してくれる、というまさに配送業務にはうってつけのAPIです。

実際に試してみる!

では、実際にAPIを使ってどんな結果が得られるのかを試してみましょう。

PiomatixLBSを試用するにあたっては、トライアルの申し込みが必要です。
PiomatixLBSのWebページからお問い合わせいただき、APIキーを発行してもらいましょう。

今回は前述の「複雑な条件の最適な巡回ルートを調べる」ことを目標に巡回最適化APIを使ってみます。
詳しい仕様については API仕様書 を確認していただきたいですが、その中でも注目したいポイントをいくつかピックアップしてみましょう。

まず、「配送開始時刻」「配送終了時刻」や「休憩時間」、「配送リスト」の中で指定する「配達時間指定」と言った時間に関するリクエストパラメータです。
単純に物理的に到達するルートを探索するのではなく、これらの時間まで考慮したルートを出力してくれるわけですね。

また、「探索条件」で指定できるパラメータも注目ポイントです。
何を優先して探索するか、渋滞状況や各種交通規制を考慮するかなどを細かく指定できますが、中でも横付けしやすいように目的地がなるべく道路の左側になるように指定できるパラメータは、実際の配送業務でも役立ちそうですよね。

これらを活用して、弊社がオフィスを構える大阪のランドマークを効率的に回ってみるルートを考えてみます(配送じゃなくてすみません!)。


リクエスト

巡回条件はざっと以下の通りとします。指定していない情報は既定値となります。

  • 配送拠点(開始地点/終了地点)
    • 株式会社アンクシステムズ 大阪本社
  • 配送リスト

    • 大阪城(大阪城公園駅前駐車場付近)

      • 配達時間指定

        • 2024/12/25 10:00:00 〜 11:00:00

      • 地点で発生する推定作業時間(分)

        • 5分

    • 梅田スカイビル(梅田スカイビル駐車場付近)

      • 配達時間指定

        • 2024/12/25 10:00:00 〜 11:00:00

      • 配送地点で発生する推定作業時間(分)

        • 5分

    • 京セラドーム大阪(大阪ドーム前交差点付近)

      • 配達時間指定

        • 2024/12/25 10:00:00 〜 12:00:00

      • 配送地点で発生する推定作業時間(分)

        • 10分

    • 通天閣

      • 配達時間指定

        • 2024/12/25 11:00:00 〜 12:00:00

      • 配送地点で発生する推定作業時間(分)

        • 5分

    • あべのハルカス

      • 配達時間指定

        • 2024/12/25 11:00:00 〜 12:00:00

      • 配送地点で発生する推定作業時間(分)

        • 5分

  • 配送開始時刻

    • 2024/12/25 10:00:00

  • 配送終了時刻

    • 2024/12/25 12:00:00

  • 探索条件

    • 探索基準 / 最適化する対象

      • 移動時間

    • 有料道路利用、フェリー利用、ETC利用

      • 利用しない

    • 渋滞考慮、規制考慮、時間規制考慮、横付け考慮

      • 考慮する

  • 休憩時間

    • 2024/12/25 10:30:00 〜 11:30:00

    • 5分

  • 車両情報

    • 車種

      • 0 :普通乗用

  • 描画用情報取得要否

    • 取得する

上記の条件を、jsonコードにすると以下のようになります。
APIのリクエスト自体は一般的なWebAPIと同じなので、特別に考慮すべきポイントはありません。
{
"depot": {
"uniqueId": "depot",
"address": {
"latitude": 34.67703821041298,
"longitude": 135.49908445898876
}
},
"locations": [
{
"uniqueId": "9f8edab1-3775-9702-9407-98e3ad1433de",
"address": {
"latitude": 34.687284,
"longitude": 135.5333473
},
"scheduledtime": {
"rangeStart": "2024-12-25T10:00+09:00",
"rangeEnd": "2024-12-25T11:00+09:00"
},
"serviceTime": 5
},
:
配送地点情報が並ぶ
:
{
"uniqueId": "c43da1fb-6e62-aee3-6f94-39e7b6358596",
"address": {
"latitude": 34.645422,
"longitude": 135.512840
},
"scheduledtime": {
"rangeStart": "2024-12-25T10:00+09:00",
"rangeEnd": "2024-12-25T12:00+09:00"
},
"serviceTime": 5
}
],
"deliveryStartTime": "2024-12-25T10:00+09:00",
"deliveryEndTime": "2024-12-25T12:00+09:00",
"options": {
"priority": "time",
"useToll": false,
"userFerry": false,
"userSmartIC": false,
"careJam": true,
"careRegulation": true,
"careTimeRegulation": true,
"careAlongside": true
},
"breakTime": [
{
"rangeStart": "2024-12-25T10:30+09:00",
"rangeEnd": "2024-12-25T11:30+09:00",
"minutes": 5
}
],
"vehicleInfo": {
"type": 0
},
"needDrawData": true
}

レスポンス

では、実際に返却されたデータを見てみましょう。
{
"skipped": false,
"skippedLocation": [],
"length": 31696.0,
"requireTime": 6894,
"breakTime": [
{
"breakStart": "2024-12-25T10:30:00+09:00",
"breakEnd": "2024-12-25T10:35:00+09:00"
}
],
"vehicleRouting": [
{
"uniqueId": "depot",
"arrivalTime": "2024-12-25T10:00:00+09:00",
"departureTime": "2024-12-25T10:00:00+09:00",
"serviceTime": 0
},
{
"uniqueId": "b9a0d90b-391b-64c5-0e82-8628f29dd946",
"arrivalTime": "2024-12-25T10:12:41+09:00",
"departureTime": "2024-12-25T10:17:41+09:00",
"serviceTime": 5
},
:
開始地、配送地、終了地の地点情報が並ぶ
:
{
"uniqueId": "depot",
"arrivalTime": "2024-12-25T11:49:59+09:00",
"departureTime": "2024-12-25T11:49:59+09:00",
"serviceTime": 0
}
],
"toll": 0,
"pathPointNum": 722,
"pathPointList": [ ← 形状点列
{
"latitude": 34.677040100097656,
"longitude": 135.49896240234375
},
:
ルート描画のための722個の座標情報が並ぶ
:
{
"latitude": 34.677040100097656,
"longitude": 135.49896240234375
}
],
"pathPointInfo": {
"roadKind": [
{
"kind": "general",
"index": 0
}
],
"toll": [
{
"kind": "free",
"index": 0
}
],
"section": [
{
"section_no": 0,
"index": 0
},
:
座標情報を地点間ごとに区切った区間のインデックスが並ぶ
:
{
"section_no": 5,
"index": 616
}
]
},
"etaInfo": [
{
"length": 4330,
"requireTime": 810
},
:
区間ごとの距離、所要時間が並ぶ
:
{
"length": 3720,
"requireTime": 650
}
]
}

レスポンスには、総移動距離や所要時間など様々な情報が含まれています。
実際に走行するべきルートの情報は「形状点列」として、緯度経度の配列として含まれています。

今回は、この「形状点列」を利用して実際のルートを可視化してみましょう。

ルートの可視化

今回は Flutter を使って実装している関係で flutter-map を使って地図を表示してみます。
flutter-mapにはpolyline(ポリライン)という機能があり、複数の緯度経度を渡すことで、それらを繋いだ線を地図上に表示してくれます。
ということは、先ほどの「形状点列」を渡せばルートを可視化できそうですね。

実際に実行してみると、以下のように表示されます。
技術ブログ画像
いかがでしょうか?なにやらいい感じのルートが表示されていますね。

まとめ


今回は、配送業務における課題と、それを解決する手段として PiomatixLBS の 巡回最適化API を試してみるところまでをご紹介しましたが、いかがでしたか?

配送業務の高効率化を目指す方、ドライバー人材の教育コストにお困りの方、この記事を読んでPiomatixLBSを使ったシステムの開発に少しでもご興味が湧いた方は、ぜひ弊社お問い合わせフォームよりご相談ください。

次回は後編として、いくつかのパターンで出力した結果を元に、実際に走行してどのような違いがあったかを検証していきます。
ぜひご期待ください!

NEED SOME HELP?

各種案件のご相談・ご依頼は
こちらよりお問い合わせください。

CONTACT