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

このガイドでは、遷移属性の使用例について説明します。2 つの例(車両の駐車時間の最適化ルートへの組み込みと、各ルートの終了時に特定の場所への訪問を確実に行う)で、現実世界のシナリオをモデル化する方法を学びます。

始める前に

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

遷移とは、ある場所を次の場所に接続するルートのセグメントです。

ロケーションとは、車両のルート上の次のいずれかの地点を指します。

  • ルートの始点。
  • 荷物の受け取りや配達を行う停留所。
  • ルートの終点。

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

実際のシナリオをモデル化する

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

駐車場の時間を予約する

このシナリオでは、ドライバーはロケーション A に移動する前に車を駐車する必要があります。場所 B は近くにあり、ドライバーは両方の訪問で同じ駐車場を使用できます。ドライバーが A の直後に B を訪問する場合、駐車場から出て車を再び駐車する必要がないため、時間を節約できます。Route Optimization API では、遷移属性を使用して、ドライバーが駐車場から別の駐車場に移動する場合にのみ、車両を駐車するための追加時間を追加できます。

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

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. 車両ごとに、Vehicle.start_tagsCLEANED を追加します。これは、集荷や配達を行う前に車両を清掃済みとしてマークし、前営業日の終わりに清掃済みであると想定して、開始地点から終了地点に直接移動できるようにするために使用されます。このようなルートが実際に発生しない場合でも、このシナリオを許可すると、オプティマイザーが最適化されたルートをより効率的に検索できます。

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

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

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

関連情報