ガイドAPIリファレンス
ガイド

混載の制限を定義する

HERE Tour Planning APIの混載制限により、特定の種類の商品を1回の配送で同時に積載することを禁止する制約が課されます。

たとえば、ラストワンマイルの配達シナリオでは、宅配業者がさまざまな商品を個人の住所、企業、受け取り場所などの複数の場所に配達することがよくあります。このような商品には、サイズ、重量、割れ物などの特定の要件が指定されている場合があるため、同時に出荷できないことがよくあります。たとえば、温度管理が必要な生鮮品と壊れやすい電子機器は、それぞれのタイプに必要な取り扱い方法や保管条件が異なるため、一緒に輸送するのが困難になる場合があります。

ルーティング問題に混載制限を含める

ルーティング問題に混載制限を含めてHERE Tour Planning APIを構成するには、以降のセクションで説明するように、特定の制限がある商品のカテゴリーを定義し、それに関係する商品の種類に基づいて各ジョブをカテゴリーに割り当てる必要があります。

混載してはいけない商品のカテゴリーを特定する

まず、問題仕様で、次の例に示すように、シフト構成の一部としてmixingRestrictionsオブジェクトを作成し、一緒に輸送できない商品カテゴリーを指定します。

"shifts": [
  {
      "start": { ... },
      "end": { ... }
      },
      "mixingRestrictions": {
        "level": "tour",
        "restrictions": [{
          "conflictingCategories":
          [
            "a",
            "b"
          ]
        }
      ]
    }
  }
]
📘

カテゴリー名はユーザーが定義します。特定のニーズに基づいて、独自のカテゴリーを柔軟に作成し、名前を付けることができます。

mixingRestrictionsオブジェクトにはlevelプロパティとrestrictionsプロパティがあり、これらによって車両で一緒に輸送できない商品カテゴリーと、制限が適用されるレベルを定義します。

  • restrictions:このプロパティでは、種類や特性などの要素に基づいて、一緒に輸送してはならない商品カテゴリーを定義します。restrictionsプロパティで、conflictingCategoriesリストは競合するカテゴリーのセットで構成されています。例:
  "mixingRestrictions": {
    "level": "tour",
    "restrictions": [
      {
        "conflictingCategories": [ 
          "perishable",
          "electronics"
        ]
      },
      {
        "conflictingCategories": [
          "flammable",
          "oxidizing-agents"
        ]
      }
    ]
  }
  • level:次のレベルの混合制限を使用できます。
    • "tour":この値では、ツアー中に車両が輸送できる商品の種類を定義します。たとえば、ツアー中に車両が冷蔵品を運んでいる場合、ツアーレベルの制限により、同じツアーに冷蔵品以外を追加することが禁止されます。簡単に言えば、車両はツアー全体を通じて、制限された単一のカテゴリーに属する​​商品しか輸送できません。
    • "subTour":この値では、混載がツアーのサブセットに適用されることを指定します。これらの制限は、積み込みまたは積み下ろしの順序を決定したり、特定の商品を一緒に配達または集荷してはならないことを指定したりする場合があります。たとえば、subTourを使用すると、車両は行きに生鮮品を配達し、帰りに電子機器を集荷できます。このレベルの柔軟性はツアー設定では不可能です。
    追加の例として、異なるカテゴリーの商品を運ぶ間に車両の清掃や再構成が必要になるシナリオを考えてみましょう。このようなケースではtour設定の方が適しています。ただし、より高い柔軟性が必要な複雑なシナリオ、特に1つのツアー中にさまざまなカテゴリーの商品を配達および集荷する場合、subTourはより汎用性の高いソリューションを提供します。

ジョブを分類する

次に、最適化アルゴリズムでジョブの混載制限を考慮するには、restrictions配列の一部として指定したカテゴリー名をそのジョブに割り当てます。次に例を示します。

{
  "jobs": [
    {
      "id": "job_1",
      "category": "perishable",
      "tasks": {...}
    }
  ]
}
📘

categoryパラメーターは必須ではありません。ジョブにカテゴリーが割り当てられていない場合、このジョブには混載制限は適用されません。

以降のセクションでは、混載制限がツアー全体の最適化と、個々のジョブの順序と優先順位においてどのような影響を与えるかを示すサンプルシナリオを紹介します。

シナリオ1:ツアーレベルの混載制限

次のサンプル問題仕様では、フリートが1台の車両で構成されています。この車両には、levelパラメーターで示されているように、ツアー全体を通じてperishableelectronicsの両方のカテゴリーに属する​​商品の同時輸送を禁止する混載制限が適用されます。特に、この制限により、車両はツアー全体を通じて、制限された単一のカテゴリーからしか商品を集荷または配達することができません。

ツアー計画には以下のジョブが含まれています。

  • perishableカテゴリーの配達ジョブ
  • electronicsカテゴリーの集荷ジョブ

次のJSONスニペットは問題の完全な仕様を示しています。

{
  "fleet": {
    "types": [
      {
        "id": "my_delivery_truck",
        "profile": "car_96348d48d98f",
        "costs": {
          "fixed": 1,
          "distance": 0.5,
          "time": 0.2
        },
        "shifts": [
          {
            "start": {
              "time": "2022-10-15T00:01:00Z",
              "location": {
                "lat": 52.55066573174976,
                "lng": 13.388972561428876
              }
            },
            "end": {
              "time": "2022-10-15T23:51:00Z",
              "location": {
                "lat": 52.55066573174976,
                "lng": 13.388972561428876
              }
            },
            "mixingRestrictions": {
              "level": "tour",
              "restrictions": [{
                "conflictingCategories":
                  [
                    "perishable",
                    "electronics"
                  ]
                }
              ]
            }
          }
        ],
        "capacity": [
          10
        ],
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "truck",
        "name": "car_96348d48d98f"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "job_1",
        "category": "perishable",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.494682192176725,
                    "lng": 13.36425332402917
                  },
                  "duration": 90
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "job_2",
        "category": "electronics",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.501370545070884,
                    "lng": 13.486476220061036
                  },
                  "duration": 90
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      }
    ]
  }
}

次の図は、HERE Tour Planning APIが返したソリューションを示しています。

混載のツアーレベルの制限

前の図に示されているように、APIが1つのジョブのみを割り当て、他のジョブ割り当てないソリューションを、次のような説明とともに返しました。

"reasons": [
    {
        "code": "MIXING_RESTRICTION_CONSTRAINT",
        "description": "cannot be assigned due to job mixing restriction",
        "details": [
            {
                "vehicleId": "my_delivery_truck_1",
                "shiftIndex": 0
            }
        ]
    }
]

このシナリオでは、APIはツアーレベルで混載制限 (問題で指定されているように) を適用し、ツアー全体を通じて1つの制限されたカテゴリーに属する​​ジョブのみを1台の車両に割り当てました。このケースでは、車両にとってそのジョブの方が効率的であるため、perishableカテゴリーに属する​​ジョブをAPIが選択しました。

📘

前の例はデモを目的として簡略化されたものです。より現実的なシナリオでは、次の方法でツアー内の未割り当てジョブを回避できます。

  • 車両のシフト数を増やす
  • フリート内の車両の台数を増やす

詳細については、「問題」を参照してください。

シナリオ2:サブツアーレベルの制限

このシナリオの問題仕様は、1つの変更を除いて以前と同じです。

  • 次のスニペットが示すように、混載制限のlevelパラメーターの値はsubTourになりました。
"mixingRestrictions": {
  "level": "subTour",
  "restrictions": [{
    "conflictingCategories": 
      [
        "perishable",
        "electronics"
      ]
    }
  ]
}

次の図は、混載制限レベルを更新した後に返されたソリューションがどのように変化したかを示しています。

混載のサブツアーレベルの制限

ここでは、最適化アルゴリズムにより、車両に制限対象商品が混載されないようにしますが、この制限はsubTourレベルでのみ適用されます。このシナリオでは、車両はまずperishable商品の配達を開始します。そのタスクを完了すると、空になった車両はelectronicsカテゴリーの商品を集荷できます。これは、perishableelectronicsの両方のカテゴリーが同じ車両のツアーに含まれていても、車両がそれらを同時に積載することはないことを意味します。これは、ツアー全体を通じてそのような混載を禁止するtour制限レベルとは対照的です。

📘

このシナリオのケースでは、job_2に集荷ではなく配達が含まれている場合、その特定のジョブは割り当てられません。これは、単一のジョブ (このケースではjob_1) 中に混載不可の商品を輸送すると、subTourレベルの混載制限に違反することになり、最適化アルゴリズムがそれを防止するためです。

結論

  • toursubTourのレベルでの混載制限により、輸送シナリオの特定の制約と優先順位に基づいた柔軟なカスタマイズが可能となり、輸送中の商品の効率的かつ法令に遵守した管理に大きく貢献します。
  • 混載制限が適用されるレベルの選択は、輸送シナリオの特定の要件によって異なります。subTourレベルでは、ツアー内のジョブ間で車両の積載量が異なる可能性があるシナリオに対して、よりきめ細かい制御が可能となります。一方、tourレベルの制約はより厳格であり、輸送全体を通じて混載不可の商品を分離することが重要なシナリオに適しています。

次のステップ

  • HERE Tour Planning APIで問題を作成する方法の詳細については、「問題」を参照してください。
  • HERE Tour Planning APIのメソッド、エンドポイント、パラメーターの詳細については、「APIリファレンス」を参照してください。