車両ルーティング問題(Vehicle Routing Problem, VRP)
Google OR-Toolsは、数理最適化や制約充足問題を解くためのツールキットであり、Pythonで使用できます。
ここでは、具体的な実用的な問題として、車両ルーティング問題(Vehicle Routing Problem, VRP)を取り上げ、Google OR-Toolsを使用して解決し、結果をグラフで可視化してみます。
VRPは、与えられた車両数で、複数の顧客を巡回する最適な経路を見つける問題です。
以下に、Google OR-Toolsを使用してVRPを解くPythonコードの例を示します。
1 | from ortools.constraint_solver import routing_enums_pb2 |
このコードは、7つの顧客と1つのデポ(出発点)がある場合の例です。
適切に顧客の座標と距離行列を設定し、Google OR-Toolsを使用して問題を解きます。
解が得られたら、経路と距離を表示し、グラフで可視化します。
なお、上記のコードを実行するには、ortools
, matplotlib
, networkx
ライブラリがインストールされている必要があります。
インストールされていない場合は、以下のコマンドでインストールしてください。
1 | pip install ortools matplotlib networkx |
このコードをベースに、実際の問題に合わせて座標や距離行列を設定し、VRPを解くことができます。
ソースコード解説
このコードは、Google OR-Toolsを使用してVehicle Routing Problem (VRP) を解くサンプルです。
以下に、コードの各部分の詳細な説明を提供します。
1. モジュールのインポート:
1 | from ortools.constraint_solver import routing_enums_pb2 |
ortools
モジュールから、制約充足問題を解くための関連するクラスやメソッドをインポートしています。matplotlib
とnetworkx
は、グラフを描画するためのライブラリです。
2. 顧客の座標とデポの座標の定義:
1 | locations = [(35, 10), (15, 15), (25, 25), (30, 40), (45, 35), (10, 20), (50, 25)] |
locations
は各顧客の座標を表すリストです。depot
はデポ(出発点)の座標を表します。
3. データモデルの作成:
1 | def create_data_model(): |
create_data_model
関数は、問題のデータモデルを作成します。
距離行列、使用する車両の数、デポのインデックスなどが含まれています。
4. 解のプロット関数:
1 | def plot_solution(manager, routing, solution): |
plot_solution
関数は、解を受け取り、経路と距離を表示し、結果をグラフで可視化します。
5. メイン関数:
1 | def main(): |
main
関数は、問題データの作成、マネージャーとモデルの初期化、解の構築、および解の表示とグラフ描画を行います。
6. 距離のコスト関数の設定:
1 | def distance_callback(from_index, to_index): |
distance_callback
関数は、各エッジのコスト(距離)を定義します。
この関数は、SetArcCostEvaluatorOfAllVehicles
メソッドを使用して、ルーティングモデルに登録されます。
7. ソルバーの設定と解の構築:
1 | search_parameters = pywrapcp.DefaultRoutingSearchParameters() |
- ソルバーの設定は、検索パラメーターを調整しています。
GUIDED_LOCAL_SEARCH
メタヒューリスティックを使用し、最大で30秒間の制限時間で解を構築します。
8. メイン関数の実行:
1 | if __name__ == '__main__': |
- スクリプトが直接実行された場合に
main
関数を呼び出します。
これにより、問題が解かれ、結果が表示されます。
このコードは、Google OR-Toolsを使用してVRPを解決し、解をコンソールに表示し、最適な経路をmatplotlibとnetworkxを使用してグラフで可視化します。
結果解説
[実行結果]
Route for vehicle 0: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 0 Distance of the route: 130 units
上記の結果から、車両0が巡回した最適な経路は、デポ(出発点)を起点に顧客1、顧客2、顧客3、顧客4、顧客5、顧客6、そして再びデポへ戻るという順序です。
具体的な経路は、「0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 0」となっています。
また、この最適な経路の総距離は130単位です。
この距離は、各辺(エッジ)の距離を合算したものであり、最適化アルゴリズムによって最小化された結果です。
さらに、上記の結果に対する可視化グラフが以下の通りです。
各ノードは顧客またはデポを表し、エッジは巡回した経路を示しています。
グラフはmatplotlibとnetworkxライブラリを使用して描画されています。
青い点は顧客やデポを表し、黒い線は最適な経路を示しています。
このグラフから、車両がどのように巡回したかが視覚的に理解できます。