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

このガイドでは、遷移属性の使用例について説明します。このチュートリアルでは、車両を駐車する時間を最適化されたルートに組み込むことと、各ルートが特定の場所への訪問で終了することの 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_tag と TransitionAttributes.dst_tag を PARKING_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 つの新しいタグ(CLEANED や ROUTE_END など)を選択します。前者は車両がクリーンな状態であるか、クリーンな状態になる場所に使用し、後者はルートの終了に使用します。
  2. 車両ごとに、次の属性を持つ清掃施設への訪問を表す新しい配送のみのシップメントを追加します。
    1. 各清掃施設の場所は、この配送の配送訪問リクエストとして表す必要があります。
    2. 洗浄施設の配送の各訪問リクエストの VisitRequest.tags に CLEANED を追加します。この場所から出発する車両が清潔であることを示します。モデル内の他の訪問リクエストでは、このタグを使用しないでください。これにより、車両が「クリーンでない」と見なされます。
    3. penalty_cost を小さい数値に設定して、車両が使用されていない場合にオプティマイザーがこの配送をスキップできるようにします。
  3. 車両ごとに、CLEANED を Vehicle.start_tags に追加します。これは、集荷や配達を行う前に、車両を清潔な状態としてマークするために使用されます。前日の作業終了時に清掃されたと想定し、開始ウェイポイントから終了ウェイポイントに直接移動できるようにします。このようなルートが実際に発生しない場合でも、このシナリオを許可すると、オプティマイザーは最適化されたルートをより効率的に検索できます。

  4. 車両ごとに、ROUTE_END を Vehicle.end_tags に追加します。

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

    1. TransitionAttributes.excluded_src_tag を CLEANED に設定します。

    2. TransitionAttributes.dst_tag を ROUTE_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_tag と TransitionAttributes.excluded_src_tag のいずれか、および TransitionAttributes.dst_tag と TransitionAttributes.excluded_dst_tag のいずれかが必要です。

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

関連情報