配送ルートをExcelで手動管理している通関業者は、年間で数百万円の燃料費を余計に払っています。
物流現場において「どの順番で配送先を回れば最も効率的か」という問いは、数十年前から数学の世界で研究されてきました。この問いに答える枠組みが、巡回セールスマン問題(TSP:Traveling Salesman Problem)と車両経路問題(VRP:Vehicle Routing Problem)です。
TSPは、1つの拠点(デポ)から出発してすべての配送先を1度ずつ訪問し、再びデポへ戻るまでの最短経路を求める問題です。配送車が1台の場合のシンプルなモデルと理解してください。
VRPはTSPを複数車両に拡張したものです。現実の通関後物流では、複数のトラックが並走し、それぞれが異なる配送先グループを担当します。VRPはこの「どの車がどの顧客をどの順番で回るか」を同時に最適化します。VRPが基本です。
VRPには、さらに実務に即したバリエーションが存在します。
| 略称 | 正式名称 | ポイント |
|---|---|---|
| CVRP | 容量制約付きVRP | 各車両の最大積載量を超えない |
| VRPTW | 時間枠付きVRP | 顧客が希望する受け取り時間帯を守る |
| MDVRP | 複数デポVRP | 出発倉庫が複数ある場合に対応 |
| VRPPD | 集荷・配達VRP | 集荷と配達を同一ルートで処理 |
通関後の国内配送では、輸入貨物を港から複数の顧客に届けるケースが多いため、CVRP(容量制約付き)やVRPTW(時間枠制約付き)が現場の実態に最も近いモデルです。これだけ覚えておけばOKです。
VRPの研究史は意外と古く、1959年にGeorge Dantzigが定義しています。単体法(線形計画の解法)の提案者でもあるDantzigが、物流の数学的定式化にも貢献したという事実は、この問題の学術的な奥深さを示しています。
PuLPによるCVRP(容量制約付きVRP)のPython実装コード・解説(Qiita)
Pythonで配送最適化を実装するとき、まず選択を迫られるのがライブラリです。主に使われるのはPuLPとOR-Toolsの2つです。どちらもオープンソースで無料利用できます。
PuLPは、線形計画問題(LP)と整数計画問題(IP)に特化したPythonライブラリです。インストールはコマンド1行で完了します。
```python
pip install pulp
```
PuLPの特徴は、問題の定式化が直感的でコードが読みやすいことです。数式と対応したコードを書けるため、数学が得意な担当者にとっては非常に扱いやすいです。ただし、大規模な問題(顧客数が数百件以上)になると計算時間が増大する傾向があります。
OR-ToolsはGoogleが開発したオープンソースの最適化スイートです。インストールも同様に1行です。
```python
pip install ortools
```
OR-Toolsの強みは処理速度と対応範囲の広さにあります。VRPの複雑なバリエーション(時間枠制約、複数デポなど)への対応が充実しており、実務規模の問題でも実用的な速度で解が得られます。大規模問題はOR-Toolsが有利です。
選び方のポイントを整理すると、以下のとおりです。
| 判断基準 | PuLP | OR-Tools |
|---|---|---|
| 初めてのPython最適化 | ✅ 向いている | ⚠ やや複雑 |
| 顧客数10〜50件程度 | ✅ 十分 | ✅ 余裕 |
| 顧客数100件以上 | ⚠ 重くなる場合あり | ✅ 安定 |
| 時間枠・複数デポ制約 | ⚠ コードが複雑 | ✅ 標準機能で対応 |
| 計算速度 | 中程度 | 高速 |
多くの現場では、まずPuLPで小規模なルート最適化を試し、課題が複雑化したときにOR-Toolsへ移行するという進め方が現実的です。
Pythonで学ぶ配送ルート最適化(TSP・VRP)の実装解説(セールスアナリティクス)
PuLPを使ったCVRP(容量制約付き車両経路問題)の実装は、大きく4つのステップで構成されます。
ステップ①:データの準備
実装に必要な入力データは次のとおりです。
- 📍 各顧客の座標(緯度・経度またはx,y座標)
- 📦 各顧客への配送量(重量・体積など)
- 🚛 車両数と各車両の最大積載量
- 🏭 デポ(出発拠点)の座標
通関後物流であれば、通関申告データや船積書類(B/L、パッキングリスト)から各品目の重量情報を抽出し、配送先住所とセットにして用意します。これが基本です。
ステップ②:距離行列の計算
すべての地点間の距離を計算しておきます。PythonではSciPyの`distance_matrix`関数が便利です。
```python
import pandas as pd
import numpy as np
from scipy.spatial import distance_matrix
# 各地点の座標
coords = pd.DataFrame({
"x": 50, 30, 70, 20, 80,
"y": 50, 20, 80, 60, 30
})
# 距離行列を計算
cost = distance_matrix(coords.values, coords.values)
```
実際の道路距離を使いたい場合は、Google Maps APIやOpenRouteService APIと組み合わせることで、直線距離より精度の高いルートが得られます。
ステップ③:最適化モデルの定義
PuLPで問題を定式化します。決定変数は「車両kが地点iから地点jへ移動するか(1か0)」のバイナリ変数です。
```python
import pulp
problem = pulp.LpProblem("CVRP", pulp.LpMinimize)
# 決定変数(バイナリ)
x = [pulp.LpVariable(f"x{i}_{j},{k}", cat="Binary")
if i != j else None
for k in range(vehicle_count)
for j in range(n)
for i in range(n)
# 目的関数:総移動コスト最小化
problem += pulp.lpSum(
costij * xijk
for k in range(vehicle_count)
for i in range(n)
for j in range(n)
if i != j
)
```
ステップ④:制約条件の設定と求解
- 各顧客を1回だけ訪問する
- 各車両はデポを出発してデポに戻る
- 容量制約(積載量の上限)を守る
- 部分巡回路(デポを経由しない閉じたループ)を除去する
制約条件を設定したうえで`problem.solve()`を呼び出すと、最適な配送ルートが計算されます。計算結果から「どの車が、どの順番で、どの顧客を訪問するか」が一覧で確認できます。
OR-Toolsを使う場合は、`RoutingIndexManager`と`RoutingModel`を作成してから同様の制約を登録します。GoogleのOR-Tools公式ドキュメントには日本語の解説も存在し、VRPの基本コードがそのままコピーして動かせる状態で公開されています。これは使えそうです。
Google OR-Tools 公式スタートガイド(Python版・日本語)
「理論はわかった、でも実際どれくらい削減できるの?」という疑問は当然です。数字で確認します。
日本ロジスティクスシステム協会の調査によると、2025年度の売上高物流コスト比率は5.36%と、過去20年間で4番目に高い水準を記録しています。仮に売上が10億円の物流関連会社であれば、物流コストだけで約5,360万円がかかっている計算です。痛いですね。
配送ルート最適化を導入した場合の削減効果として、複数の事例が報告されています。
- 🔵 輸送距離の15%程度短縮(国土交通省関連調査)
- 🔵 物流コストの平均15〜20%削減(ルート最適化導入企業)
- 🔵 燃料費削減で月間54万円・年間648万円の削減に成功した事例
- 🔵 AI活用のルート最適化でコスト25%削減(GXO社の事例)
年間648万円という数字は、月54万円の燃料費削減を12ヵ月分換算したものです。東京ドームの収容人数(約5万5,000人)に例えるのは難しいですが、「毎月新車の軽トラック1台分(約54万円)が丸ごと浮く」と考えるとイメージしやすいでしょう。
通関業従事者の視点では、輸入後の国内配送コストを削減することが荷主への付加価値提案にもつながります。「通関処理だけでなく、通関後のラストマイル配送もPythonで最適化できます」という提案は、競合他社との差別化ポイントになります。
Pythonスクリプト自体は一度書けば繰り返し使えます。毎日のルート作成がExcel手動から自動計算に変わるだけで、担当者の業務時間を週あたり数時間単位で削減できます。つまり、時間とコストの両方を削れます。
2025年度物流コスト調査結果(日本ロジスティクスシステム協会)
ここでは他のブログではあまり語られない視点をお伝えします。通関業従事者がPythonで配送最適化を進める場合、「通関データとの連携」という独自の強みを活かせます。
通関申告書(輸入申告書)には、品目ごとの重量・数量・仕向け地情報が含まれています。これらのデータは本来、申告用途だけに使われがちですが、Pythonのpandasライブラリを使うとCSV形式で取り込んでVRPの入力データに変換する処理を自動化できます。
```python
import pandas as pd
# 通関申告データを読み込み(例)
declaration_data = pd.read_csv("import_declaration.csv")
# 配送先・重量・品目をVRP用に整形
vrp_input = declaration_data["destination_address", "gross_weight", "hs_code"].copy()
vrp_input"demand" = vrp_input"gross_weight" / 1000 # kgをトン換算
```
これにより、通関完了から配送計画立案までを一気通貫でシステム化できます。手動で転記していた住所データや重量データをゼロから入力する必要がなくなります。
また、HSコードと配送先の傾向分析という応用も可能です。特定のHSコード(例:電子部品類)は特定の工業団地エリアへの配送が多い、という傾向をデータから発見できれば、事前にルートのテンプレートを構築しておくことで計算時間を大幅に短縮できます。
さらに、輸入通関には荷物の到着予定(ETA:Estimated Time of Arrival)という時間的な制約があります。VRPTWの時間枠制約パラメータとして「港湾の搬出可能時間帯」や「顧客の受け取り希望時間」を設定することで、より現実に即した配送計画が実現できます。
通関業者がこのような仕組みを持つことは、荷主にとっても魅力的です。荷主は通関コストだけでなく、通関後の物流コストをトータルで管理したいと考えています。Pythonを活用したデータ連携の仕組みを持つ通関会社は、現状ではまだ少数派です。これは競合に差をつけるチャンスです。
Pythonの基礎学習時間は独学で360〜540時間程度が目安とされています。ただし、VRPを実装するだけであれば公開済みのサンプルコードを活用できるため、実際の業務適用はもっと早期に始められます。まずPuLPのサンプルを手元で動かすことから着手するだけで大丈夫です。
AI活用でコスト削減に成功したラストマイル配送の具体事例(arc-hack.com)