Problems

Problemsエンティティは、配車ルートのProblemsを表しています。 プランと運行管理の 2 つの主要な部分で構成されています。

プラン

プランには、処理するジョブのリスト、これらのジョブと車両の関係のリスト、および類似するジョブをグループ化するための設定を含むオプションのクラスタリングオブジェクトが含まれています。

ジョブ

このエンティティは、基本的に、特定のプロパティを考慮して任意の車両がサービスを提供するジョブを表します。

  • location (必須) : 緯度および経度で表される場所 :

    "location": {"lat": 52.5622847, "lng": 13.4023099}

  • duration (必須) : 秒単位の期間 ( サービス時間 ) : 指定した場所での所要時間 :

    "duration": 120

  • demand (必須):需要は、体積、質量、サイズなどの多次元の測定単位で表されます。

    "demand": [1]

  • times (任意):車両が特定の場所を訪問できる時間帯のリスト。 日付は RFC3339 形式で表されます。

    "times": [["2020-07-04T06:00:05.000Z","2020-07-04T12:05:05.000Z"]]

  • skills (任意):ジョブを処理する車両タイプで定義する必要があるスキルのリスト。

    "skills": ["fridge"]

  • tag (任意):特定の場所に関連付けられているユーザー定義のタグ。 ソリューション内に伝播されます。 ジョブの場所を区別するために使用します。

    "tag": "pickup_1"

  • territoryIds (任意) : 作業場所が属するテリトリ識別子を表します。 これは車両タイプの territories プロパティと併せて使用され、車両が特定の地域で作業を行うことを制限 / 奨励します。 このプロパティは、複数のタスクがある複雑なジョブには使用できません。

    "territoryIds": ["territory1"]

  • priority (任意) : 優先度の高いジョブには 1 、通常のジョブには 2 のジョブの優先度 ( デフォルトは 2) :

    "priority": 1

  • customerId (任意) : 顧客の一意の識別子を指定します。 同じ顧客 ID を持つジョブは、可能であれば 1 つ以上のクラスタにグループ化されます。「クラスタ化」を参照してください。

注 : tag の一部として、機密情報や個人情報を参照しない でください。

tasks プロパティの指定方法に応じて、ジョブは次の 3 つのタイプのいずれかになります。

  • pickup:ルートに沿って何かを集荷し、ルートの最終位置に持って行くためのジョブです。 1 つのジョブタスクを持つ集荷タスクのみが指定されている場合に使用されます。 集荷ジョブの例 :
{
        "id": "pickup1",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5622847,
                    "lng": 13.4023099
                  },
                  "duration": 180,
                  "territoryIds": ["territory1"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      }
  • delivery : ルートの開始時に積み込まれた荷物を配達するジョブです。1 つの作業場所を持つ配達の場所のみが指定されている場合に使用されます。 配達ジョブの例 :
{
        "id": "delivery1",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5252832,
                    "lng": 13.41884
                  },
                  "duration": 180
                }
              ],
              "demand": [1]
            }
          ]
        }
      }
  • pickup and delivery ジョブ : 配達ルートで集荷と配達を行うジョブです。 集荷場所と配達場所の両方を指定する場合に使用されます。 ジョブには複数の集荷と配達を設定できます。 すべてまたはいずれのサービスも提供する必要はありません。 また、集荷場所と配達場所に対するリクエストの合計も同じにする必要があります。 その基本的なシナリオとしては、複数の集荷の後に 1 つの配達が続く場合があります。複数の作業場所があるジョブの例 :
{
        "id": "myMultiJob",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5622847,
                    "lng": 13.4023099
                  },
                  "duration": 180,
                  "tag": "p1"
                }
              ],
              "demand": [1]
            },
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5330881,
                    "lng": 13.3973059
                  },
                  "duration": 180,
                  "tag": "p2"
                }
              ],
              "demand": [1]
            }
          ],
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5252832,
                    "lng": 13.41884
                  },
                  "duration": 180,
                  "tag": "d1"
                }
              ],
              "demand": [2]
            }
          ]
        }
      }

places タスクのプロパティに複数の場所のエントリが含まれている場合、提供された場所がそのタスクの代替場所と見なされ、最適化アルゴリズムは最適化の目的関数に最適な場所を選択しようとします。 各場所には独自のlocationdurationtimesがあります 。

次の例では、タスクに代替の場所があるジョブを示します。

{
        "id": "delivery1",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5252832,
                    "lng": 13.41884
                  },
                  "duration": 180,
                  "times": [["2019-01-01T00:00:00Z","2019-01-01T12:00:00Z"]],
                  "tag": "place1"
                },
                {
                  "location": {
                    "lat": 53.5252832,
                    "lng": 14.41884
                  },
                  "duration": 240,
                  "times": [["2019-01-01T13:00:00Z","2019-01-01T18:00:00Z"]],
                  "tag": "place2"
                }
              ],
              "demand": [1]
            }
          ]
        }
      }

地域を示すシナリオの例については、 代替の場所のチュートリアルを参照してください。

優先度の高いジョブの例 ( すべてのジョブタイプに適用可能 ) :

{
        "id": "delivery1",
        "priority": 1,
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.5252832,
                    "lng": 13.41884
                  },
                  "duration": 180
                }
              ],
              "demand": [1]
            }
          ]
        }
      }

ジョブ数の上限

作業の合計量は、代替場所(場所)を含むすべての集荷と配達の合計として計算されます。

関係

オプションの relations パラメーターを使用して、ジョブと車両の間のさまざまな関係を定義できます。

type で指定されているリレーションには、次の 3 つのタイプ があります

  • sequence : この関連で指定されたジョブの順序は変更できず、この特定の車両でサービスを提供する必要があります。 この関係で指定されているジョブの間には、追加のジョブを挿入できません。
  • flexible : この関連で指定された作業は、この特定の車両によって実行される必要があります。 この関係で定義されているジョブの順序は変更できません。 この関係または別の関係で指定されていないジョブは、この関連で定義されているジョブの間であっても、この車両のツアーの任意の場所に挿入できます。
  • tour : この関連で指定された作業は、この特定の車両によって実行される必要があります。 この関係で指定されたジョブの順序を変更してもかまいません。

それぞれの関係は、jobs プロパティを伴って、特定の車両で実行されるべきアクティビティのリストを指定します。 ジョブには、次の 4 つのタイプがあります。

  • JobID:通常のジョブ ID (注意 :jobId の一部として、機密情報や個人情報を参照しない でください。)
  • departure: 出発アクティビティ
  • arrival: 到着アクティビティ
  • break: 車両の休憩アクティビティ

vehicleId プロパティは、ジョブを、指定した ID の特定の車両に紐づけるために使用されます。 車両 ID の詳細については、次のセクションを参照してください

このプロパティ shiftIndex は、ジョブをスケジュールする車両シフトを指定するために使用されます。 このプロパティの値は shifts 、車両タイプで定義された配列のインデックスです(このドキュメントの後半を参照)。 たとえば shifts 、車両タイプが次のような場合です。

  {
    "shifts": [
      {
        "start": {
          "time": "2022-05-06T09:00:00Z",
          "location": {"lat": 52.46642, "lng": 13.28124}
        },
        "end": {
          "time": "2022-05-06T18:00:00Z",
          "location": [52.46642, 13.28124]
        }
      },
      {
        "start": {
          "time": "2022-05-07T08:00:00Z",
          "location": {"lat": 52.46642, "lng": 13.28124}
        }
      }
    ]
  }

この配列で指定された車両の 2 番目のシフトで関連するジョブを処理する場合は、リレーションで shiftIndex = 1 を定義する必要があります。 車両ごとに最大 7 シフトを定義できるため shiftIndex 、プロパティの値は 0 ~ 6 の範囲にする必要があります。

車両および作業に関係を使用することで、再計画プロセスのアルゴリズムの動作およびその結果に影響を与えることができます。

{
  "relations": [
    {
      "type": "sequence",
      "jobs": ["departure", "job1", "job2"],
      "vehicleId": "myVehicleType_1",
      "shiftIndex": 1
    }
  ]
}

sequence または flexible リレーションに追加されたジョブは、時間帯、スキル要件、積載量違反、集荷 / 配達の割り当て、経路割り当て可能かなどの、いっさいの制約違反のチェックがされないことに注意してください。これにより、実現不可能な解決策や望ましくない解決策が生じる可能性があります。 sequence リレーションおよび flexible リレーションと同様に、 tour リレーションに追加されたジョブは、一般に制約違反がないかチェックされませんが、tour リレーションのすべてのジョブが割り当てられない場合があります。 また、複数の集荷または配達を行うジョブでは、関係を使用できません。

クラスタリング

オプションのクラスタリングプロパティを使用すると、類似したジョブを 1 つ以上のジョブクラスタにグループ化して、可能であれば同じ停止位置に割り当てて、一緒に処理することができます。

以下のすべての条件を満たすジョブは、類似していると見なされます。

  • 1つの作業場所で行う1つのジョブタスクのみを持つ
  • タスクのタイプが pickup かまたは delivery のいずれかで同じ
  • 場所が同じ
  • 時間帯が同じ
  • スキルが同じ
  • demandの次元が同じです
  • テリトリーが同じ

次のプロパティを持つジョブは、クラスタリングでは考慮されません。

  • 複数のタスクがあるジョブ
  • 複数の作業場所があるジョブ ( 代替場所 )
  • 集荷と配達の両方のタスクを持つジョブ
  • 優先度プロパティを持つジョブ
  • 関連で参照されているジョブ

または、単純に言えば、複数の場所を含むすべてのジョブ、優先度を使用するジョブ、または関係で使用されるジョブは、クラスタリングの候補とは見なされません。

クラスタが一部の制約に違反すると、複数の小さなクラスタに分割されます。 この場合、可能であれば、ジョブの customerId プロパティを使用して、同じ顧客のジョブを同じクラスタ(もしくはクラスタ群)にグループ化できます。

オプションの clustering オブジェクトには、次のプロパティがあります。

  • serviceTimeStrategy( 必須 ): ジョブクラスタの期間またはサービス時間を制御するために使用されます。
    • MaxDurationStrategy : ジョブクラスタの合計時間は、最長のジョブの期間、より正確には、ジョブタスクの場所オブジェクトで定義された期間と同じでなければなりません。
    • FixedDurationStrategy : ジョブクラスターの合計期間は、戦略オブジェクトで定義された duration 値と同じでなければなりません。
{
  "clustering": {
      "serviceTimeStrategy": {
        "type": "fixedDurationStrategy",
        "duration": 300
      }
  }
}

フリート

運行管理は、交通状況の考慮オプションのほかに、車両タイプおよびそのルーティングプロファイルのリストを指定します。

VehicleType

各車両タイプは、次のプロパティによって定義されます。

  • ID:車両タイプの一意の ID 。 解決策では、パターン ${vehicleTypeId}_${sequenceIndex} を使用して特定の車両 ID を生成するために使用されます。

    "id": "myVehicleType"

    sequenceIndex は車両のインデックスです。 たとえば、あるvehicleTypeIdに対し、amountが2と指定されている場合、指定可能な車両 ID は $ { vehicleTypeId } _1 および $ { vehicleTypeId } _2 です。

注 : 車両Id の一部として機密情報や個人情報を参照しないでください。

  • profile:ルーティングプロファイルの名前を指定します(次の項を参照)。

    "profile": "normal_car"

注 :車両のナンバープレート番号のような、実世界のIDを、ルーティングプロファイルの profileName として割り当てることは避けてください。

  • costs: さまざまな車両コストを定義します。
    • fixed 車両の使用を開始するための固定費
    • distance メートルあたりの距離コスト
    • time 1 秒あたりの時間コスト
  {
    "costs": {
      "distance": 0.0002,
      "time": 0.004806,
      "fixed": 22
    }
  }

distancetime および fixed の使用は任意で、デフォルト値は0です。 時間と距離のコストが指定されていない場合は、 0.00000000001 という小さな時間コストが代わりに使用されます。 時間コストと距離コストの両方の値をゼロに設定することはできません。

  • shifts: この特定のタイプの車両を開始および終了するデポの場所の配列を指定します。

    {
      "shifts": [{
        "start": {
          "time": "2020-07-04T09:00:00Z",
          "location": {"lat": 52.46642, "lng": 13.28124}
        },
        "end": {
          "time": "2020-07-04T18:00:00Z",
          "location": [52.46642, 13.28124]
        },
        "breaks": [
          {
           "times": [["2020-07-04T12:00:05.000Z","2020-07-04T14:05:05.000Z"]],
           "location": {"lat": 52.46642, "lng": 13.28124},
           "duration": 3600
          }
        ]
      }]
    }
    

    各場所は time および location で指定 します。 Start time は最も早い出発時刻、 end time は最も遅い到着時刻を意味します。 オプションのパラメータ breaks では、配達中の車両休憩のリストを指定します ( 現時点では複数の休憩を指定することはできません ) 。 休憩にはオプションの位置指定プロパティがあります。このプロパティを省略すると、車両は最後に配達されたジョブの位置で休憩を取ります。

    シフト end は任意です。シフトを省略すると、車両のルートは最後の作業場所で終了します。

    車両タイプごとのシフトの最大数はで 7 あり、シフトのオーバーラップは許可されていません。 シフトごとに最大 1 回の休憩を指定できます。

  • capacity: 多次元単位 ( 容積、質量、サイズなど ) で表される車両積載量 :

    "capacity": [10]

  • skills: 作業に使用できる車両スキルのリスト

    "skills": ["fridge"]

  • limits: 車両タイプに適用される制約を指定します

    • maxDistance: 車両の最大距離の制限をメートル単位で指定します
    • shiftTime:車両のシフト時間を秒単位で定義します
{
  "limits": {
    "maxDistance": 30000,
    "shiftTime": 28800
  }
}
  • territories: 車両タイプのテリトリを優先順位で表します。 strictfalse に設定されている場合、その車両タイプは割り当てられている地域外で作業を行うことができますが、優先度は低くなります。そうでない場合、ジョブを処理することはできません。 各テリトリには、必須の id プロパティと、デフォルト値 1 を持つオプションの priority プロパティがあります。 priority に許可される値の範囲は、最高優先度を示す 1 から最低優先度を示す 5 までです。 特定の車両タイプにとって優先順位の高い地域での作業は、そのタイプの車両に割り当てることをお勧めします。 作業テリトリーは、作業場所の territoryIds プロパティを使用して指定します。
    {
    "territories": {
      "strict": true,
      "items": [
        {
          "id": "territory1",
          "priority": 1
        }
      ]
    }
    }
    

テリトリーのデモを行うシナリオの例については、テリトリーのチュートリアルを参照してください。

ルーティングプロファイル

profiles コレクション内の要素として、いくつかのルーティングプロファイルが指定されています。 次の 5 つのプロファイルタイプを指定可能です:cartruckscooterbicycle および pedestrian。 これらのプロファイルタイプには、次の共通のプロパティがあります。

  • name: ルーティングプロファイルの一意の名前。 車両タイプの定義で使用されます "name": "normal_car"

  • type:ルーティングプロファイルタイプを指定します。可能な値は次のとおりです:cartruckscooterbicyclepedestrian"type": "car"

  • departureTime: 車両の出発時間を指定します。 省略すると、同じ車両プロファイルを共有するすべての車両タイプの最も早いシフト開始時間が使用されます。

  • avoid: 回避するルーティング機能のリストを指定します。 このプロパティは、問題で定義されているすべての場所の最小境界円の半径が 190 km 以下の場合にのみ使用できます

  • exclude: ツアーの計画から除外する国を指定します。 国コードは、 ISO 3166-1 alpha-3 形式で提供する必要があります。 このような除外の結果を意味のあるものにするには、最終的にすべての場所の最小境界円の半径を増やす必要があります。 この機能を使用する場合、問題で定義されているすべての場所の最小境界円の半径が 190 km を超えてはなりません。超えると、検証エラーが返されます。

    {
    "exclude": {
      "countries": [
        "AUT",
        "CHE"
      ]
    }
    }
    

車両プロファイル

現在、車両プロファイルには追加のプロパティがありません。

トラックプロファイル

トラックの制限は、problemsリクエストのトラックプロファイルの options フィールドを使用して定義されます。

このオプションshippedHazardousGoodsでは、爆発物、ガス、水に有害な物質など、トラックによって出荷される危険物質のリストを設定します。 すべてのオプションのリストについては 、『 API リファレンス』を参照してください。

その他のオプションでは、トラックの物理的な特性(重量制限、車軸重量、車高、車幅、車長)について説明します。 tunnel category オプションを使用すると、ルートがより制約の少ないカテゴリのトンネルのみを通過するように制限されます。

スクータープロファイル

スクーターオプション allowHighway は、problemsリクエストのスクータープロファイルの options フィールドを使用して定義できます。 allowHighway は、ルート探索の計算で高速道路を考慮するかどうかを指定します。 このパラメータが指定されていない場合、デフォルトでは高速道路は使用されません。 フィーチャーの回避 motorway が提供されている場合は、allowHighwaytrue に設定されている場合でも、高速道路は回避されます。

scooter プロファイルは、problemsで定義されているすべての場所の最小境界円の半径が 190km 以下の場合にのみサポートされます。

自転車プロファイル

現在、自転車プロファイルには追加のプロパティがありません。

歩行者プロファイル

現時点では、歩行者プロファイルには追加のプロパティはありません。

Traffic

traffic この設定では、ルーティングで考慮するトラフィック情報の種類を設定します。

  • liveOrHistorical: 将来の出発時間については、将来の出発時間がどれだけ先かによって、ライブまたは履歴のトラフィックデータが適用されます。 過去の出発時間には、過去の交通データのみが適用されます。 車両タイプの出発時間は、車両プロファイルの任意の departureTime プロパティを使用して設定できます。 車両プロファイルの定義時にこのプロパティが省略された場合、同じ車両プロファイルを共有するすべての車両タイプの最も早いシフト開始時間が、そのプロファイルの出発時間として使用されます。 すべての場所が半径 190 km 以内にあり、可能な限りリアルタイムの交通データを使用する場合は、この設定を選択します。
  • historicalOnly: 過去のトラフィックデータに基づいたフリーフロー速度のみが適用されます。 ライブトラフィックのデータ使用量を回避する場合は、この設定を選択します。
  • automatic: すべての座標が半径 190 km 以内の場合、liveOrHistorical と同じで、そうでなければ historicalOnly と同じです。最適なオプションをサービスが自動的に決定するようにする場合は、この設定を選択します。

デフォルト値は automatic です 。

Configuration

設定を使用 して、アルゴリズムのデフォルトの動作を調整できます。この ドキュメント を参照してください。 次の例では、ソルバはproblemsを解決するのに最大 2 秒 (maxTime) を費やし、 その 2 秒のうち 1 秒間(stagnationTime)、解決策を十分に改善しない期間がある場合、アルゴリズムは終了します。

Problemsの例:

{
  "plan": {
    "jobs": [
      {
        "id": "myJob",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {"lat": 52.46642, "lng": 13.28124},
                  "times": [["2020-07-04T10:00:00.000Z","2020-07-04T12:00:00.000Z"]],
                  "duration": 180
                }
              ],
              "demand": [1]
            }
          ]
        }
      }
    ]
  },
  "fleet": {
    "types": [
      {
        "id": "myVehicleType",
        "profile": "normal_car",
        "costs": {
          "distance": 0.0002,
          "time": 0.005,
          "fixed": 22
        },
        "shifts": [{
          "start": {
            "time": "2020-07-04T09:00:00Z",
            "location": {"lat": 52.52568, "lng": 13.45345}
          },
          "end": {
            "time": "2020-07-04T18:00:00Z",
            "location": {"lat": 52.52568, "lng": 13.45345}
          }
        }],
        "limits": {
          "maxDistance": 300000,
          "shiftTime": 28800
        },
        "capacity": [10],
        "amount": 1
      }
    ],
    "profiles": [{
      "name": "normal_car",
      "type": "car",
      "departureTime": "2020-07-04T09:15:00Z"
    }]
  },
  "configuration": {
    "termination": {
      "maxTime": 2,
      "stagnationTime": 1
    }
  }
}

」に一致する結果は 件です

    」に一致する結果はありません