遷移属性を使用してビジネス ロジックをモデル化する

このガイドでは、遷移属性の使用例を紹介します。最適化されたルートに車両の駐車時間を組み込む例と、各ルートが特定の場所への訪問で終わるようにする例の 2 つの例で、現実世界のシナリオをモデル化する方法を説明します。

始める前に

遷移属性 を使用すると、最適化されたルートの特定の遷移にモデル固有の費用と遅延を追加できます。 これらの費用と遅延は、使用する車両のパラメータに基づいて地図データから計算された遷移時間と 費用に加えて追加されます。

遷移 とは、ある場所から次の場所をつなぐルートのセグメントです。

場所 とは、車両のルート上の次のいずれかの地点を指します。

  • ルートの始点。
  • 集荷または配達が行われる停車地。
  • ルートの終点。

モデルのすべての遷移属性を定義するには、リスト ShipmentModel.transition_attributesに追加します。 リストの各要素は、遷移属性の 1 つのセットを定義し、遷移の開始地点と終了地点のタグを使用して、ルート内の遷移と照合されます。遷移属性について詳しくは、 TransitionAttributes のリファレンス ドキュメントをご覧ください。

現実世界のシナリオをモデル化する

このセクションでは、遷移属性を使用して現実世界のビジネス上の制約を実装する 2 つの簡単な例を示します。

駐車時間を確保する

このシナリオでは、運転手は場所 A に行く前に車両を駐車する必要があります。場所 B は近くにあり、運転手は両方の訪問に同じ駐車スペースを使用できます。運転手が A の直後に B に行く場合、駐車スペースから離れて車両を再度駐車する必要がないため、時間を節約できます。Route Optimization API では、遷移属性を使用して、運転手が 1 つの駐車スペースから別の駐車スペースに移動する場合にのみ、車両を駐車するための追加時間を追加できます。

駐車時間を訪問時間とは別にモデル化すると、同じ駐車場を使用する訪問がグループ化されたルートの所要時間が短くなります。モデルの精度を高めるとともに、オプティマイザが訪問がグループ化されたルートを優先するようにします。

Route Optimization API リクエストでこれを行う手順は次のとおりです。

  1. VisitRequest.duration は、訪問の実行に必要な時間のみに使用します。たとえば、荷物を引き渡して顧客から署名を受け取る場合などです。

  2. モデルで使用される個別の駐車スペースごとに、モデル内の他の用途に使用されていない新しいタグ(PARKING_123 など)を使用します。

  3. このタグを次に追加します。

    1. VisitRequest.tags この駐車スペースを使用するすべての訪問リクエストの。

    2. Vehicle.start_tags 車両がこの駐車スペースからルートを開始する場合は。

    3. Vehicle.end_tags 車両がこの駐車スペースでルートを終了する場合は。

  4. 新しい駐車タグごとに、別の駐車スペースから移動する場合に駐車の遅延を追加するエントリを ShipmentModel.transition_attributes に追加します。 手順は次のとおりです。

    1. TransitionAttributes.excluded_src_tagTransitionAttributes.dst_tagPARKING_123 に設定します。

    2. TransitionAttributes.delay を車両の駐車に必要な時間に設定します。

    たとえば、場所のタグが PARKING_123 で、車両の駐車に 150 秒かかる場合は、次の エントリを ShipmentModel.transition_attributes に追加します。

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

ルートの最後に必須の清掃を行う

このシナリオでは、ルートの最後に車両を清掃する必要があります。次の追加の制約があります。

  • 清掃は、車両デポに戻る前に、専門の清掃施設で行われます。最適化されたルートでは、清掃施設の場所と、車両が行った集荷と配達の場所に基づいて、最適な清掃施設が使用されます。
  • 清掃後、車両は追加の集荷や配達を行ってはなりません。
  • 清掃施設までの移動時間と車両の清掃時間は、運転手の勤務時間に含まれ、ルートの最大時間に収まる必要があります。

この要件をモデル化するには、空のルート、または最後の訪問が清掃施設への訪問であるルートのみを許可します。Route Optimization API では、清掃施設またはルートの始点以外の場所からルートの終点ウェイポイントへの遷移を禁止することで、これを行います。

  1. モデル内のどこでも使用されていない 2 つの新しいタグ(CLEANEDROUTE_END など)を選択します。前者は車両が清掃される場所、後者はルートの終点です。
  2. 車両ごとに、次の属性を持つ清掃施設への訪問を表す配達専用の新しい配送を追加します。
    1. 各清掃施設の場所は、この配送の配達訪問リクエストとして表す必要があります。
    2. 清掃施設の配送の各訪問リクエストの VisitRequest.tagsCLEANEDを追加します。これにより、この場所から出発する車両が清掃済みであることを示します。モデル内の他の訪問リクエストではこのタグを使用しないでください。これにより、車両が清掃施設から出発する際に「清掃済みでない」と見なされます。
    3. 車両が他の用途で使用されていない場合は、 penalty_cost を小さい値に設定して、オプティマイザがこの配送をスキップできるようにします。
  3. 車両ごとに、CLEANEDVehicle.start_tagsに追加します。 これは、前日の勤務終了時に清掃されたことを前提として、集荷や配達を行う前に車両を清掃済みとしてマークし、始点ウェイポイントから終点ウェイポイントに直接移動できるようにするために使用されます。このようなルートが実際には発生しない場合でも、このシナリオを許可することで、オプティマイザは最適化されたルートをより効率的に検索できます。

  4. 車両ごとに、ROUTE_ENDVehicle.end_tags に追加します。

  5. 清掃されていない車両が車両の終点ウェイポイントに到着することを禁止する新しいエントリを ShipmentModel.transition_attributes に追加します。プロパティは次のとおりです。

    1. TransitionAttributes.excluded_src_tagCLEANED に設定します。

    2. TransitionAttributes.dst_tagROUTE_END に設定します。

    3. TransitionAttributes.delay を大きな値に設定します。遅延をルートの最大時間よりも長くすると、オプティマイザがルートでこの遷移を使用することを効果的に禁止できます。

    たとえば、モデルの時間スケールが 1 営業日の場合、24 時間(86,400 秒)の遅延を使用して、清掃施設とルートの始点以外の場所からルートの終点への遷移を禁止できます。

    {
      "excluded_src_tag": "CLEANED",
      "dst_tag": "ROUTE_END",
      "delay": "86400s"
    }
    

遅延と費用のどちらを選択するか

遅延と費用のどちらを選択するかは、実装するビジネス ロジックと制約の性質によって異なります。 TransitionAttributes.delay は、厳しい制約を実装する場合や、 費やした時間でトレードオフを表す場合に最適です。 TransitionAttributes.cost は、追加費用として表されるソフトな設定やトレードオフを実装する場合に適しています。費やした時間と費用の両方が関係する場合は、遅延と費用を任意に組み合わせることができます。

車両の清掃の例では、非常に長い遅延を使用しています。これは、ルートの最後に 車両を清掃することが厳しい要件であり、長い遅延 によってオプティマイザが要件を無視することを防ぐためです。費用のみを設定した場合、オプティマイザは清掃をスキップすることを選択できます。たとえば、車両を清掃しないことで「節約」した時間でより多くの配送を行うなど、他の場所で費用を補う方法が見つかった場合です。

駐車の例では、車両の駐車に必要な追加時間に対応する短い遅延を使用しています。 運転手が有料駐車場に停車する場合は、遅延と組み合わせて費用を使用することもできます。

すべての訪問リクエストに一致する遷移属性を追加する方法

上記の例では、特定のタグを持つ場所、またはタグのない場所に一致する遷移属性を使用しています。ただし、すべての遷移に適用される遷移属性を追加する必要がある場合はどうすればよいでしょうか。

タグを省略することはできません。各 TransitionAttributes メッセージには、 TransitionAttributes.src_tagTransitionAttributes.excluded_src_tag のいずれか 1 つと、 TransitionAttributes.dst_tagTransitionAttributes.excluded_dst_tagのいずれか 1 つが必要です。

ただし、 TransitionAttributes.excluded_src_tag または TransitionAttributes.excluded_dst_tag をモデル内のどこでも使用されていないタグに設定することで、すべてのタグに一致させることができます。これにより、このタグのないすべての場所が一致しますが、どの場所でも使用されていないタグを意図的に選択したため、これらの遷移属性はすべての場所に一致します。

関連情報