配車ルート (VRP) 解析レイヤーの作成 (Make Vehicle Routing Problem Analysis Layer) (Network Analyst)

サマリー

配車ルート (VRP) ネットワーク解析レイヤー」を作成し、解析プロパティを設定します。 VRP 解析レイヤーは、複数の車両による配送を最適化するときに役立ちます。 このレイヤーを作成するには、ローカル ネットワーク データセットを使用するか、オンラインでホストされたサービスまたはポータル内のサービスを使用します。

使用法

  • このツールで解析レイヤーを作成した後は、[ロケーションの追加 (Add Locations)] ツールを使用して解析レイヤーにネットワーク解析オブジェクトを追加し、[解析の実行 (Solve)] ツールを使用して解析を実行し、[レイヤー ファイルの保存 (Save To Layer File)] ツールを使用して結果をディスクに保存することができます。

  • このツールをジオプロセシング モデルに使用するときは、モデルをツールとして動作させる場合、出力ネットワーク解析レイヤーにモデル パラメーターを作成する必要があります。そうしないと、出力レイヤーはマップのコンテンツに追加されません。

パラメーター

ラベル説明データ タイプ
ネットワーク データ ソース

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer; String
レイヤー名
(オプション)

作成する VRP ネットワーク解析レイヤーの名前。

String
移動モード
(オプション)

解析で使用する移動モードの名前。 移動モードは、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。 arcpy.na.TravelMode オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

VRP は時間ベースのインピーダンスでのみ解析を実行するため、時間ベースのインピーダンスの移動モードのみを選択できます。

String
時間フィールドの単位
(オプション)

解析レイヤーのサブレイヤーおよびテーブル (ネットワーク解析のクラス) の時間的なフィールドで使用される時間の単位を指定します。 この値は、時間コスト属性の単位と一致する必要はありません。

コスト属性の詳細

  • 時間単位は分です。 これがデフォルトです。
  • 時間単位は秒です。
  • 時間時間単位は時間です。
  • 時間単位は日です。
String
距離フィールドの単位
(オプション)

解析レイヤーのサブレイヤーおよびテーブル (ネットワーク解析のクラス) の距離的なフィールドで使用される距離の単位を指定します。 この値は、オプションである距離コスト属性の単位と一致する必要はありません。

コスト属性の詳細

  • マイル距離の単位はマイルです。 これがデフォルトです。
  • キロメートル距離の単位はキロメートルです。
  • フィート距離の単位はフィートです。
  • ヤード距離の単位はヤードです。
  • メートル距離の単位はメートルです。
  • インチ距離の単位はインチです。
  • センチメートル距離の単位はセンチメートルです。
  • ミリメートル距離の単位はミリメートルです。
  • デシメートル距離の単位はデシメートルです。
  • 海里距離の単位は海里です。
String
デフォルトの日付
(オプション)

時間フィールド値として日付が指定されない場合の日付。 訪問先オブジェクトに対する時間フィールド (TimeWindowStart など) が時刻のみを示す値である場合、日付はデフォルトの日付となります。 時間フィールド値として特定の日付がすでに指定されている場合、デフォルトの日付は無効になります。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
時間フィールドのタイム ゾーン
(オプション)

このツールでサポートされている入力日時フィールドに使用されるタイム ゾーンを指定します。

UTC 形式での日時の値の指定は、訪問先や拠点があるタイム ゾーンが不明な場合や、訪問先と拠点が複数のタイム ゾーンに分散しているときに、すべての日時の値を同時に開始する必要がある場合に役立ちます。 UTC オプションは、ネットワーク データセットでタイム ゾーン属性が定義されている場合のみ適用されます。 定義されていない場合、すべての日時の値はその場所に対応するタイム ゾーンと見なされます。

  • ロケーションのローカル タイム訪問先または拠点に関連付けられた日時の値は、それらの訪問先と拠点のタイム ゾーンにあります。 ルートの場合、日時の値は、ルートの開始拠点があるタイム ゾーンをベースとします。 ルートの開始拠点がない場合は、全ルートにわたるすべての訪問先と拠点が 1 つのタイム ゾーンにある必要があります。 休憩の場合、日時の値は、ルートのタイム ゾーンをベースとします。 これがデフォルトです。
  • UTC訪問先または拠点に関連付けられた日時の値は、UTC (協定世界時) 形式であり、それらの訪問先や拠点のタイム ゾーンをベースとしません。
String
出力ルート形状
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

  • ネットワーク沿い出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • ラインなし出力ルートに形状は生成されません。
  • 直線出力ルート形状はストップ間を結ぶ 1 本の直線になります。選択したネットワーク データ ソースがサービスの場合、このオプションは使用できません。
String
タイム ウィンドウ違反の重要度
(オプション)

違反が発生しないタイム ウィンドウの重要度を指定します。 タイム ウィンドウ違反は、タイム ウィンドウが閉じてから訪問先、拠点、または休憩にルートが到着した場合に発生します。 この超過時間は、タイム ウィンドウの終了からルートの到着時間までの時間です。

  • 全体の移動時間の増大を無視して、タイム ウィンドウ違反を最小にするソリューションを検索します。 全体のソリューション コストを最小にするよりも訪問先に時間どおりに到着することが重要である場合は、この設定を選択します。 訪問先で顧客と打ち合わせをする予定があり、遅刻して先方に迷惑をかけたくないという場合に使用します (別のオプションとして、超過が許されない厳格なタイム ウィンドウを使用することもできます)。配車ルートの他の制約が指定されている場合、タイム ウィンドウの期間内に立ち寄ることができない訪問先が出てくると考えられます。 この場合は、[高] 設定でも違反が発生することがあります。
  • タイム ウィンドウの条件を満たすことと、全体のソリューション コストを削減することのバランスを取ります。 これがデフォルトです。
  • タイム ウィンドウを無視して、全体の移動時間を最小にするソリューションを検索します。 タイム ウィンドウの条件を満たすことが全体のソリューション コストを削減することより重要でない場合は、この設定を選択します。 未処理のサービス依頼が増えている場合は、この設定を使用すると便利です。 保有車両の到着が遅れて顧客に迷惑をかけることになっても、1 日にサービスを提供する訪問先の数を増やして手持ちの注文をさばくために、この設定を選択することができます。
String
超過移動時間の重要度
(オプション)

超過移動時間を減らすことの重要度を指定します。 超過移動時間とは、訪問先ペア間を直接移動するのに必要な時間に対する超過時間です。 この超過時間は、訪問先ペアへの立ち寄りの途中で、休憩を取ったり、他の訪問先や拠点に移動したりすることで発生します。 このパラメーターは、訪問先ペアを使用する場合のみ関連します。

訪問先ペアの詳細

  • 全体の移動コストの増大を無視して、訪問先ペア間で超過移動時間が短いソリューションを検索します。 訪問先ペア間で人を輸送し、乗車時間を短くしたい場合にこの設定を使用します。 これはタクシー サービスの特性です。
  • 超過移動時間を短縮することと、全体のソリューション コストを削減することのバランスを取ります。 これがデフォルトです。
  • 超過移動時間を無視して、全体のソリューション コストを最小にするソリューションを検索します。 この設定は一般に宅配サービスで使用されます。 宅配業者は、人ではなく荷物を輸送するので、一般に、乗車時間はそれほど重要ではありません。 宅配業者はこの設定を使用することで、訪問先ペアに適切な順序でサービスを提供し、全体のソリューション コストを最小にすることができます。
String
解析時にルート案内を生成
(オプション)

ルート案内を生成するかどうかを指定します。

  • オン - 解析時にルート案内が生成されます。 これがデフォルトです。
  • オフ - 解析時にルート案内が生成されません。
Boolean
空間クラスタリング
(オプション)

空間クラスタリングを使用するかどうかを指定します。

  • オン - 個別のルートに割り当てられた訪問先が、空間的にクラスタリングされます。 訪問先をクラスタリングすると、ルートを含む領域がより小さく保たれ、ルート ラインの交点数が減少する傾向がありますが、同時に、移動時間全体が増加する可能性があります。 これがデフォルトです。
  • オフ - 解析で、訪問先を空間的にクラスタリングすることを優先せず、ルート ラインが交差することがあります。 ルート ゾーンを指定する場合は、このオプションを使用してください。
Boolean
解析時に無効なロケーションを除外
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。

  • オン - 無効な入力ロケーションが除外されます。これにより、有効なロケーションだけを使用して解析が正常に実行されるようになります。
  • オフ - 無効なロケーションが除外されず、解析が正常に実行されません。 これがデフォルトです。
Boolean

派生した出力

ラベル説明データ タイプ
Network Analyst レイヤー

新しいネットワーク解析レイヤー。

Network Analyst Layer

arcpy.management.MakeVehicleRoutingProblemAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {time_units}, {distance_units}, {default_date}, {time_zone_for_time_fields}, {line_shape}, {time_window_factor}, {excess_transit_factor}, {generate_directions_on_solve}, {spatial_clustering}, {ignore_invalid_locations})
名前説明データ タイプ
network_data_source

ネットワーク解析が実行されるネットワーク データセットまたはサービス。 サービスのポータル URL を使用します。

Network Dataset Layer; String
layer_name
(オプション)

作成する VRP ネットワーク解析レイヤーの名前。

String
travel_mode
(オプション)

解析で使用する移動モードの名前。 移動モードは、移動規制や U ターン ポリシーなど、歩行者、車、トラック、その他の交通手段がネットワークをどのように移動するかを決定するネットワーク設定のコレクションを表します。 移動モードは、ネットワーク データ ソースに対して定義されます。 arcpy.na.TravelMode オブジェクトおよび移動モードの有効な JSON 表現を含む文字列もパラメーターの入力として使用できます。

String
time_units
(オプション)

解析レイヤーのサブレイヤーおよびテーブル (ネットワーク解析のクラス) の時間的なフィールドで使用される時間の単位を指定します。 この値は、時間コスト属性の単位と一致する必要はありません。

コスト属性の詳細

  • Minutes時間単位は分です。 これがデフォルトです。
  • Seconds時間単位は秒です。
  • Hours時間単位は時間です。
  • Days時間単位は日です。
String
distance_units
(オプション)

解析レイヤーのサブレイヤーおよびテーブル (ネットワーク解析のクラス) の距離的なフィールドで使用される距離の単位を指定します。 この値は、オプションである距離コスト属性の単位と一致する必要はありません。

コスト属性の詳細

  • Miles距離の単位はマイルです。 これがデフォルトです。
  • Kilometers距離の単位はキロメートルです。
  • Feet距離の単位はフィートです。
  • Yards距離の単位はヤードです。
  • Meters距離の単位はメートルです。
  • Inches距離の単位はインチです。
  • Centimeters距離の単位はセンチメートルです。
  • Millimeters距離の単位はミリメートルです。
  • Decimeters距離の単位はデシメートルです。
  • NauticalMiles距離の単位は海里です。
String
default_date
(オプション)

時間フィールド値として日付が指定されない場合の日付。 訪問先オブジェクトに対する時間フィールド (TimeWindowStart など) が時刻のみを示す値である場合、日付はデフォルトの日付となります。 時間フィールド値として特定の日付がすでに指定されている場合、デフォルトの日付は無効になります。

特定の静的な日付の代わりに曜日または現在の日付をモデル化するには、次のいずれかの特殊な日付を使用するように解析を構成します。

  • 今日 - 12/30/1899
  • 日曜 - 12/31/1899
  • 月曜 - 1/1/1900
  • 火曜 - 1/2/1900
  • 水曜 - 1/3/1900
  • 木曜 - 1/4/1900
  • 金曜 - 1/5/1900
  • 土曜 - 1/6/1900

ネットワーク解析での日時の使用と解釈の詳細

Date
time_zone_for_time_fields
(オプション)

このツールでサポートされている入力日時フィールドに使用されるタイム ゾーンを指定します。

  • LOCAL_TIME_AT_LOCATIONS訪問先または拠点に関連付けられた日時の値は、それらの訪問先と拠点のタイム ゾーンにあります。 ルートの場合、日時の値は、ルートの開始拠点があるタイム ゾーンをベースとします。 ルートの開始拠点がない場合は、全ルートにわたるすべての訪問先と拠点が 1 つのタイム ゾーンにある必要があります。 休憩の場合、日時の値は、ルートのタイム ゾーンをベースとします。 これがデフォルトです。
  • UTC訪問先または拠点に関連付けられた日時の値は、UTC (協定世界時) 形式であり、それらの訪問先や拠点のタイム ゾーンをベースとしません。

UTC 形式での日時の値の指定は、訪問先や拠点があるタイム ゾーンが不明な場合や、訪問先と拠点が複数のタイム ゾーンに分散しているときに、すべての日時の値を同時に開始する必要がある場合に役立ちます。 UTC オプションは、ネットワーク データセットでタイム ゾーン属性が定義されている場合のみ適用されます。 定義されていない場合、すべての日時の値はその場所に対応するタイム ゾーンと見なされます。

String
line_shape
(オプション)

解析で出力されるルート フィーチャに使用される形状タイプを指定します。

  • ALONG_NETWORK出力ルートはネットワーク ソースの正確な形状を保持します。 リニア リファレンスのためのルートのメジャー値が出力に含まれます。 メジャー値は、最初のストップから増加し、指定された位置に到着するまでの累積インピーダンスを記録します。
  • NO_LINES出力ルートに形状は生成されません。
  • STRAIGHT_LINES出力ルート形状はストップ間を結ぶ 1 本の直線になります。選択したネットワーク データ ソースがサービスの場合、このオプションは使用できません。

指定した出力形状のタイプに関係なく、常に最適なルートはユークリッド距離ではなくネットワーク インピーダンスによって決定されます。 これは、ルート形状のみが異なり、ネットワークの基となっているトラバースは同じであることを意味します。

String
time_window_factor
(オプション)

違反が発生しないタイム ウィンドウの重要度を指定します。 タイム ウィンドウ違反は、タイム ウィンドウが閉じてから訪問先、拠点、または休憩にルートが到着した場合に発生します。 この超過時間は、タイム ウィンドウの終了からルートの到着時間までの時間です。

  • High全体の移動時間の増大を無視して、タイム ウィンドウ違反を最小にするソリューションを検索します。 全体のソリューション コストを最小にするよりも訪問先に時間どおりに到着することが重要である場合は、この設定を選択します。 訪問先で顧客と打ち合わせをする予定があり、遅刻して先方に迷惑をかけたくないという場合に使用します (別のオプションとして、超過が許されない厳格なタイム ウィンドウを使用することもできます)。配車ルートの他の制約が指定されている場合、タイム ウィンドウの期間内に立ち寄ることができない訪問先が出てくると考えられます。 この場合は、[高] 設定でも違反が発生することがあります。
  • Mediumタイム ウィンドウの条件を満たすことと、全体のソリューション コストを削減することのバランスを取ります。 これがデフォルトです。
  • Lowタイム ウィンドウを無視して、全体の移動時間を最小にするソリューションを検索します。 タイム ウィンドウの条件を満たすことが全体のソリューション コストを削減することより重要でない場合は、この設定を選択します。 未処理のサービス依頼が増えている場合は、この設定を使用すると便利です。 保有車両の到着が遅れて顧客に迷惑をかけることになっても、1 日にサービスを提供する訪問先の数を増やして手持ちの注文をさばくために、この設定を選択することができます。
String
excess_transit_factor
(オプション)

超過移動時間を減らすことの重要度を指定します。 超過移動時間とは、訪問先ペア間を直接移動するのに必要な時間に対する超過時間です。 この超過時間は、訪問先ペアへの立ち寄りの途中で、休憩を取ったり、他の訪問先や拠点に移動したりすることで発生します。 このパラメーターは、訪問先ペアを使用する場合のみ関連します。

訪問先ペアの詳細

  • High全体の移動コストの増大を無視して、訪問先ペア間で超過移動時間が短いソリューションを検索します。 訪問先ペア間で人を輸送し、乗車時間を短くしたい場合にこの設定を使用します。 これはタクシー サービスの特性です。
  • Medium超過移動時間を短縮することと、全体のソリューション コストを削減することのバランスを取ります。 これがデフォルトです。
  • Low超過移動時間を無視して、全体のソリューション コストを最小にするソリューションを検索します。 この設定は一般に宅配サービスで使用されます。 宅配業者は、人ではなく荷物を輸送するので、一般に、乗車時間はそれほど重要ではありません。 宅配業者はこの設定を使用することで、訪問先ペアに適切な順序でサービスを提供し、全体のソリューション コストを最小にすることができます。
String
generate_directions_on_solve
(オプション)

ルート案内を生成するかどうかを指定します。

  • DIRECTIONS解析時にルート案内が生成されます。 これがデフォルトです。
  • NO_DIRECTIONS解析時にルート案内が生成されません。
Boolean
spatial_clustering
(オプション)

空間クラスタリングを使用するかどうかを指定します。

  • CLUSTER個別のルートに割り当てられた訪問先が、空間的にクラスタリングされます。 訪問先をクラスタリングすると、ルートを含む領域がより小さく保たれ、ルート ラインの交点数が減少する傾向がありますが、同時に、移動時間全体が増加する可能性があります。 これがデフォルトです。
  • NO_CLUSTER解析で、訪問先を空間的にクラスタリングすることを優先せず、ルート ラインが交差することがあります。 ルート ゾーンを指定する場合は、このオプションを使用してください。
Boolean
ignore_invalid_locations
(オプション)

無効な入力ロケーションを除外するかどうかを指定します。

  • SKIP無効な入力ロケーションが除外されます。これにより、有効なロケーションだけを使用して解析が正常に実行されるようになります。
  • HALT無効なロケーションが除外されず、解析が正常に実行されません。 これがデフォルトです。
Boolean

派生した出力

名前説明データ タイプ
out_network_analysis_layer

新しいネットワーク解析レイヤー。

Network Analyst Layer

コードのサンプル

MakeVehicleRoutingProblemAnalysisLayer の例 1 (Python ウィンドウ)

必須パラメーターのみを使用してツールを実行します。

import arcpy 
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb" 
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer("Transportation/Streets_ND")
MakeVehicleRoutingProblemAnalysisLayer の例 2 (Python ウィンドウ)

すべてのパラメーターを使用してツールを実行します。

import arcpy
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer('Streets_ND', 'FridayRoutes', 
                                                'Driving Time', 'Minutes', 
                                                'Miles', '1/2/2020', 
                                                'LOCAL_TIME_AT_LOCATIONS', 
                                                'TRUE_LINES_WITHOUT_MEASURES', 
                                                'High', 'Medium', 'DIRECTIONS')
MakeVehicleRoutingProblemAnalysisLayer の例 3 (ワークフロー)

次のスタンドアロン Python スクリプトは、MakeVehicleRoutingProblemAnalysisLayer 関数を使用して複数の車両で訪問先にサービスを提供する方法を示しています。

# Name: MakeVRPAnalysisLayer_Ex3_Workflow.py
# Description: Find the best routes for a fleet of vehicles, which is operated
#              by a distribution company, to deliver goods from a main
#              distribution center to a set of grocery stores.
# Requirements: Network Analyst Extension

# Import system modules
import arcpy
import os

try:
    # Check out the Network Analyst license if available.
    # Fail if the Network Analyst
    # license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")

    # Set environment settings
    output_dir = r"C:\Data"
    # The NA layer's data will be saved to the workspace specified here
    arcpy.env.workspace = os.path.join(output_dir, "Output.gdb")
    arcpy.env.overwriteOutput = True

    # Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "StoreDeliveryRoute"
    travel_mode = "Driving Time"
    time_units = "Minutes"
    distance_units = "Miles"
    in_orders = os.path.join(input_gdb, "Analysis", "Stores")
    in_depots = os.path.join(input_gdb, "Analysis", "DistributionCenter")
    in_routes = os.path.join(input_gdb, "Analysis", "Routes")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    # Create a new Vehicle Routing Problem (VRP) layer. Since the time-based
    # attributes such as ServiceTime on orders and CostPerUnitTime on routes is
    # recorded in minutes, we use minutes for time_units parameter. As we are
    # using cost per unit distance in routes, we have to specify a distance
    # attribute. The values for CosterPerUnitDistance are in miles, so we
    # specify miles for distance units parameter
    result_object = arcpy.na.MakeVehicleRoutingProblemAnalysisLayer(
        network, layer_name, travel_mode, time_units, distance_units,
        line_shape="STRAIGHT_LINES")

    # Get the layer object form the result object. The route layer can now be
    # referenced using the layer object.
    layer_object = result_object.getOutput(0)

    # Get the names of all the sublayers within the VRP layer.
    sub_layer_names = arcpy.na.GetNAClassNames(layer_object)
    # Store the layer names that we will use later
    orders_layer_name = sub_layer_names["Orders"]
    depots_layer_name = sub_layer_names["Depots"]
    routes_layer_name = sub_layer_names["Routes"]

    # Load the store locations as orders. Using field mappings we map the
    # TimeWindowStart1, TimeWindowEnd1, and DeliveryQuantities properties
    # for Orders from the fields of store features and assign a value of
    # 0 to MaxViolationTime1 property. The Name and ServiceTime properties
    # have the correct mapped field names when using the candidate fields
    # from store locations feature class.
    candidate_fields = arcpy.ListFields(in_orders)
    order_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, orders_layer_name, False, candidate_fields)
    order_field_mappings["TimeWindowStart"].mappedFieldName = "TimeStart1"
    order_field_mappings["TimeWindowEnd"].mappedFieldName = "TimeEnd1"
    order_field_mappings["DeliveryQuantity_1"].mappedFieldName = "Demand"
    order_field_mappings["MaxViolationTime"].defaultValue = 0
    arcpy.na.AddLocations(layer_object, orders_layer_name, in_orders, order_field_mappings, "")

    # Load the depots from the distribution center features. Using field mappings
    # we map the Name properties for Depots from the fields of distribution
    # center features and assign a value of 8 AM for TimeWindowStart1 and a
    # value of 5 PM for TimeWindowEnd1 properties
    depot_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, depots_layer_name)
    depot_field_mappings["Name"].mappedFieldName = "Name"
    depot_field_mappings["TimeWindowStart"].defaultValue = "8 AM"
    depot_field_mappings["TimeWindowEnd"].defaultValue = "5 PM"
    arcpy.na.AddLocations(layer_object, depots_layer_name, in_depots, depot_field_mappings, "")

    # Load the routes from a table containing information about routes. In this
    # case, since the fields on the routes table and property names for Routes
    # are the same, we will just use the default field mappings
    routes_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, routes_layer_name)
    routes_field_mappings["Name"].mappedFieldName = "Name"
    routes_field_mappings["StartDepotName"].mappedFieldName = "StartDepotName"
    routes_field_mappings["EndDepotName"].mappedFieldName = "EndDepotName"
    routes_field_mappings["StartDepotServiceTime"].mappedFieldName = "StartDepotServiceTime"
    routes_field_mappings["Capacity_1"].mappedFieldName = "Capacities"
    routes_field_mappings["CostPerUnitTime"].mappedFieldName = "CostPerUnitTime"
    routes_field_mappings["CostPerUnitDistance"].mappedFieldName = "CostPerUnitDistance"
    routes_field_mappings["MaxOrderCount"].mappedFieldName = "MaxOrderCount"
    routes_field_mappings["MaxTotalTime"].mappedFieldName = "MaxTotalTime"
    routes_field_mappings["MaxTotalTravelTime"].mappedFieldName = "MaxTotalTravelTime"
    routes_field_mappings["MaxTotalDistance"].mappedFieldName = "MaxTotalDistance"
    arcpy.na.AddLocations(layer_object, routes_layer_name, in_routes, routes_field_mappings, "")

    # Solve the VRP layer
    arcpy.na.Solve(layer_object)

    # Save the solved VRP layer as a layer file on disk with relative paths
    arcpy.management.SaveToLayerFile(layer_object, output_layer_file, "RELATIVE")

    print("Script Completed Successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback
    import sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))