問題
問題エンティティは、車両ルート検索問題を表しています。エンティティは2つの主な部分 (planとfleet) から構成されています。
計画
計画には、使用する車両のジョブのリストの他、これらのジョブと車両との関係のリスト (任意)、
類似するジョブをグループ化する設定を持つクラスタリングオブジェクト(任意)が含まれます。
ジョブ
基本的に、このエンティティは任意の車両によって遂行されるジョブを表します。ここでは次の特定のプロパティを考慮します。
-
location* (必須) *:緯度と経度、またはカスタムID (カスタムマトリックスを使用する場合のみ) で表される位置情報です。
"location": {"lat": 52.5622847, "lng": 13.4023099}または"location": {"id": "uniqueLocationId"} -
duration* (必須)*:秒単位の所要時間 (サービス時間):特定の場所での所要時間です。
"duration": 120 -
houseKeyId* (任意)*:同じ場所で複数の配達や複数の集荷を行うシナリオで使用される世帯のIDです。
"houseKeyId": "household_1A" -
demand* (必須)*:需要は、体積、質量、サイズなどの多次元の測定単位で表されます。
"demand": [1] -
times* (任意)*:車両が特定の場所を訪問できる時間枠のリストです。 日付はRFC3339形式で表されます。
"times": [["2020-07-04T06:00:05.000Z","2020-07-04T12:05:05.000Z"]]
注
timesプロパティは、問題の運行管理の部分で、シフトの開始時刻と終了時刻、休憩、出発時刻の指定に使用できます。また、計画部分で使用して、タスク時間を指定できます。任意の時間オフセットと併用できますが、ソリューションの結果の時間は常にUTCで返されます。
-
skills* (任意) *:スキルのリストです。ジョブを遂行する車両タイプに対して定義します。
"skills": ["fridge"] -
tag* (任意)*:特定の場所に関連付けられているユーザー定義のタグです。これは返されたソリューションでも使用されます。 ジョブの場所を区別するために使用します。
"tag": "pickup_1" -
territoryIds* (任意)*:ジョブの場所が属するテリトリーの識別子を表します。 これは車両タイプの
territoriesプロパティと併用され、車両が特定のテリトリーでジョブを遂行することを制限/奨励します。 このプロパティは、複数のタスクがある複雑なジョブには使用できません。"territoryIds": ["territory1"] -
groupId* (任意)*:ジョブのグループIDを表します。同じグループに属するジョブは、同じ車両によって処理され、ジョブの場所は連続して訪問されます。つまり、同じグループに属するジョブは同じツアーにまとめ、別のグループのジョブや、どのグループにも属さないジョブを遂行する前に完了させる必要があります。ジョブのグループは、複数の車両で処理することはできません。どのグループにも属さないジョブ、再積載、場所が設定された休憩をグループの途中で行うことはできませんが、それぞれのグループの合間に行うことはできます。場所が設定されていない休憩は、グループの途中で取ることができます。「ジョブグループとPUDO」も参照してください。
"groupId": "first_group" -
priority* (任意)*:優先順位が1のジョブが最も優先順位が高く、2~4は高~中程度の優先順位、5は通常のジョブ (デフォルトは5) です。
"priority": 1**ベータ** すべてのジョブに2つ以上の優先順位レベルを使用することは、まだベータ段階にあります。
-
customerId* (任意)*:顧客の一意の識別子を指定します。同じcustomerIdが設定されたジョブは、 可能な場合は1つまたは複数のクラスターにグループ化されます。「クラスタリング」を参照してください。
-
order* (任意、廃止済み。代わりに__position__を使用)*:ルート内のジョブタスクの順序を指定します。「order」の値が小さいジョブタスクは、orderの値が大きいジョブタスクよりも、ルート内の早い段階にスケジュールが設定される必要があります。orderプロパティが設定されているジョブタスクは、orderプロパティが設定されていないどのジョブタスクよりも、ルート内の早い段階にスケジュールが設定されます。なお、orderプロパティは、割り当てられるジョブの優先順位には影響しません。優先順位についてはpriorityプロパティを参照してください。"order": 1 -
position* (任意)*:ルート内のジョブタスクの位置を指定します。ジョブタスクは、最初、最後、任意、または特定の順序で割り当てることができます。
positionプロパティが設定されているジョブタスクは、positionプロパティが設定されていないジョブタスクよりも、ルート内の早い段階にスケジュールが設定されます (最後のタスクとして割り当てられたposition = 'last'のジョブタスクを除く)。なお、positionプロパティは、割り当てられるジョブの優先順位には影響しません。優先順位についてはpriorityプロパティを参照してください。
{
"position": {
"type":"ordered",
"value": 1
}
}-
maxTimeOnVehicle* (任意)*:ジョブの荷物/乗客を車両に乗せたままにできる最大時間を制限します。 集荷および配達を伴うジョブの場合、これは最初の集荷アクティビティからの出発から、最後の配達アクティビティの到着までの所要時間です 。1件の配達のみを伴うジョブの場合、所要時間は出発アクティビティの 場所または前の再積載アクティビティからカウントされます。集荷のみを伴うジョブの場合、所要時間は到着 アクティビティまたは次の再積載までカウントされます。シフトに終了がない場合、所要時間はツアー内の最後のアクティビティの終了までカウントされます 。
-
category* (任意)*:ジョブのカテゴリーは、特定のジョブカテゴリーの混在を防ぐために指定されます。これを車両の
mixingRestrictionsと併用し、競合するジョブが車両内に混在するのを防ぐことができます。
注
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,
"groupId": "one"
}
],
"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プロパティに複数の場所のエントリが含まれている場合、指定された複数の場所は、そのタスクの代替場所と見なされ、最適化アルゴリズムは最適化の目標関数に最も適した場所を選択しようとします。各場所には独自のlocation、duration、timesが設定されています。
次の例は、タスクに代替場所のあるジョブを示しています。
{
"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]
}
]
}
}テリトリーを示すシナリオの例については、代替場所についてのチュートリアルを参照してください。
priorityとcategoryを伴うジョブの例 (すべてのジョブタイプに適用可能):
{
"id": "delivery1",
"priority": 1,
"category": "food",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.5252832,
"lng": 13.41884
},
"duration": 180
}
],
"demand": [1]
}
]
}
}リクエスト内のタスクの最大数
1つの問題に含めることができるタスクの合計数には上限があります。 タスクの合計数は、全ジョブのすべての集荷と配達の合計として計算されます。 現在、ツアー計画では、問題の同期エンドポイントでは最大250件のタスク、 問題の非同期エンドポイントでは最大6,000件のタスクをサポートしています。 正確な数値については、リリースノートを参照してください。
リレーション
任意パラメーターのrelationsを使用して、ジョブと車両の間のさまざまな関係を定義できます。
次の3つのタイプのリレーションを、typeで指定できます。
- sequence:このリレーションで指定されたジョブの順序は変更できず、この特定の車両で遂行する必要があります 。このリレーションで指定されているジョブの間には、追加のジョブを挿入できません。
- flexible:このリレーションで指定されたジョブは、この特定の車両によって遂行される必要があります。この リレーションで定義されたジョブの順序は変更できません。このリレーションや別のリレーションで指定されていないジョブは、 このリレーションで定義されたジョブの間を含め、この車両のツアーのどこにでも挿入できます。
- tour:__ 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": {"lat": 52.46642, "lng": 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のリレーションに追加されたジョブの制約違反、たとえば
時間枠、スキル要件、過積載、集荷/deliveryの割り当て、ルーティングの可否などはチェックされません。これにより、実現不可能なソリューションや望ましくないソリューションが生じる可能性があります。sequenceおよびflexibleのリレーションと同様に、tourリレーションに追加されたジョブは、一般的に
制約違反はチェックされませんが、tourリレーション内のすべてのジョブが割り当てられない場合があります。
また、複数の集荷または配達が伴うジョブではリレーションは使用できません
。
ジョブグループとPUDO
グループは単体として使用(上述のジョブの場所のgroupIdを参照)できる他、PUDOや配置とも併用できます。
一般的にPUDOとは、荷物を集荷したり配達したりできる場所を指します。ジョブグループには、最大2つのPUDOを含めることができます。assignAtのプロパティを使用して、PUDOの停車地をグループの最初の停車地として訪問するか、最後の停車地として訪問するかを指定できます。
placementは、グループ内のジョブを旅程内でどのように配置するかを定義します。ストリクトモードでは、すべてのグループ要素を他のジョブを挟まず、連続してスケジュールする必要があります。フレキシブルモードでは、これらを旅程内のどこにでも配置でき、他のジョブによって分断されることもあります。
{
"groups": [
{
"id": "group-1",
"placement": "strict",
"pudos": [
{
"id": "pudo1",
"assignAt": "first",
"places": [
{
"times": [
[
"2021-10-23T08:30:00Z",
"2021-10-23T12:00:00Z"
]
],
"location": {
"lat": 52.5354509,
"lng": 13.4516700
},
"duration": 300,
"tag": "first-pudo-group-1"
}
]
}
]
}
]
}
クラスタリング
任意プロパティのクラスタリングを使用して、類似するジョブを1つまたは複数のジョブクラスターにグループ化し、 実現可能な場合はこれらのジョブを同じ停車地に割り当て、まとめて処理できます。
以下の条件をすべて満たしている複数のジョブは、類似していると見なされます。
- 1つのジョブの場所に1つのジョブタスクのみが設定されている
- 同じタイプのタスク (
pickupまたはdeliveryのいずれか) が設定されている - 場所が同じ
- 時間枠が同じ
- スキルが同じ
- 需要の次元数が同じ
- テリトリーが同じ
- ジョブタスク位置が同じ (位置がないジョブタスクは同じ位置が設定されていると見なされる)
次のプロパティが設定されたジョブについては、クラスタリングは考慮されません。
- 複数のタスクを伴うジョブ
- 複数のジョブの場所 (代替場所) を伴うジョブ
- 集荷タスクと配達タスクの両方を伴うジョブ
- 優先順位プロパティを伴うジョブ
- リレーションで参照されるジョブ
簡単に言い換えると、複数の場所を含むジョブ、優先順位を使用するジョブ、リレーションで使用されるジョブは、 どれもクラスタリングの候補とは見なされません。
クラスターが一部の制約に違反すると、複数の小さなクラスターに分割されます。この場合、ジョブのcustomerId
プロパティを使用して、可能であれば同じ顧客のジョブを同じクラスター (またはクラスター群) にグループ化できます。
任意オブジェクトclusteringには、次のプロパティがあります。
- serviceTimeStrategy* (必須)*:ジョブクラスターの所要時間またはサービス時間の決定方法を制御するために使用されます
。
- maxDurationStrategy:ジョブクラスターの合計所要時間は、所要時間が最も長いジョブの所要時間、 より正確にはジョブタスクの場所オブジェクト内で定義された所要時間と等しくなります。
- fixedDurationStrategy:ジョブクラスターの合計所要時間は、戦略オブジェクト内で定義された
durationの値と等しくなります 。 - boundedSumStrategy:ジョブクラスターの合計所要時間は、指定された
maximumによって制限されるジョブの所要時間の合計と等しくなります。
{
"clustering": {
"serviceTimeStrategy": {
"type": "fixedDurationStrategy",
"duration": 300
}
}
}ソフトタイムウィンドウ(アルファ)
ソフト時間枠では、時間枠ごとに時間の制約を緩和できます。これは、他のKPIの重要度の方が高く、遂行できるジョブの総数が増えるなどの利益がある場合に時間枠のわずかな違反が許容されるような状況では有益です。
{
"id": "delivery1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.5252832,
"lng": 13.41884
},
"duration": 180,
"timeWindows": [{
"from": {
"time": "2021-10-23T08:00:00Z",
"preferred": "2021-10-23T10:00:00Z",
"penalty": {
"type": "quadratic"
}
},
"to": {
"time": "2021-10-23T12:00:00Z",
"preferred": "2021-10-23T10:00:00Z"
}
}]
}
],
"demand": [1]
}
]
}
}詳細については、「ソフトタイムウィンドウの設定」を参照してください。
顧客ベースのサービス所要時間
houseKeyIdプロパティを使用して、同じ顧客の場所で処理される複数のジョブのサービス所要時間を制御できます。同じhouseKeyIdが設定された複数のジョブをまとめて遂行する場合、個々のジョブの最大サービス所要時間が、この一連のジョブの合計サービス所要時間として適用されます。
{
"id": "delivery1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.5252832,
"lng": 13.41884
},
"duration": 180,
"houseKeyId": "houseKey01"
}
],
"demand": [1]
},{
"places": [
{
"location": {
"lat": 52.5252832,
"lng": 13.41884
},
"duration": 120,
"houseKeyId": "houseKey01"
}
],
"demand": [1]
}
]
}
}Fleet
運行管理とは、計画されたツアーを完了するために使用される車両群を表します。各車両は、そのタイプとルーティングプロファイルによって定義されます。これにより、法的分類に加え、物理的特性とルーティング特性が決まります。さらに、運行管理のトラフィックモードを定義して、リアルタイムまたは過去のトラフィックデータに基づいてルート計画を最適化できます。
車両タイプでは、車両の物理的特性と運行特性を定義します。車両タイプの定義には、車両あたりのランニングコスト、使用可能な車両の数、シフト時間ウィンドウ、積載容量、距離と停止の制限、車両が運行できるテリトリーなどの属性が含まれます。
各車両タイプは、車両のナビゲーション方法を指定するルーティングプロファイルにリンクされています。このリンクにより、ツアー最適化で物理的な機能とルーティング設定の両方が考慮されます。
次のリストに、各車両タイプパラメーターの詳細な定義を示します。
-
id:車両タイプの一意のIDです。ソリューションでは、 パターン
${vehicleTypeId}_${sequenceIndex}を使用して、特定の車両IDを生成するために使用されます。"id": "myVehicleType"sequenceIndexは車両のインデックスです。たとえば、あるvehicleTypeIdに対し、amountが2と指定されている場合、指定可能な車両IDは${vehicleTypeId}_1および${vehicleTypeId}_2です。注
Avoid referencing any confidential or personal information as part of the vehicle's
Id. -
profile:車両タイプに関連付けられているルート検索プロファイルの名前を指定します。そのパラメーターの値は、
fleet.profiles配列の一部として定義されたプロファイル名に対応している必要があります。以下に例を示します。"profile": "light_delivery_truck" -
costs:さまざまな車両コストを定義します。
- fixed:車両の使用を開始するための固定費
- distance:1メートルあたりの距離コスト
- time:1秒あたりの時間コスト
{ "costs": { "distance": 0.0002, "time": 0.004806, "fixed": 22 } }distance、time、fixedは、特定のタスクまたはルートでの車両の使用に関連する費用を測定するためのオプションのプロパティです。timeとdistance両方の値を0に設定することはできません。詳しくは、コストのためにツアーを最適化するを参照してください。 -
shifts:この特定のタイプの車両が配送を開始および終了する倉庫の場所の配列を指定します。
{ "shifts": [{ "start": { "time": "2020-07-04T09:00:00Z", "location": {"lat": 52.46642, "lng": 13.28124} }, "end": { "time": "2020-07-04T18:00:00Z", "location": {"lat": 52.46642, "lng": 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, "policy": "allowAtTheEnd" } ], "recharges": { "maxDistance": 10000, "stations": [ { "times": [["2020-07-04T13:00:05.000Z","2020-07-04T16:05:05.000Z"]], "location": {"lat": 52.46642, "lng": 13.28124}, "duration": 3600 } ] }, "stopBaseDuration":{ "type": "oncePerStop", "value": 10 }, "mixingRestrictions": { "level": "tour", "restrictions": [{ "conflictingCategories": [ "Flammable Liquids", "Flammable Gases" ] }] }, "stopConfig": { "type": "dbscan", "maxDistanceToNeighbor": 50.0, "profile": "pedestrian" } }] }運行管理のシフトを指定する際は、次の点を考慮してください。
-
車両ごとの最大許容シフト数:
- 車両タイプごとのシフトの最大数は7つで、シフトは重複できません。1回のシフトにつき最大5回の休憩を指定できます。
-
場所仕様:
- 各場所は
timeとlocationで指定します。 Start locationは省略できます。これにより、車両に不明な出発場所を指定して、ツアーの出発地点がツアーの最初の停車地と同じであることを示すことができます。end locationは任意です。省略した場合、車両のルートは最後のジョブの場所で終了します。
- 各場所は
-
開始/終了時刻:
Start timeは最も早い出発時刻を意味するのに対して、end timeは最も遅い到着時刻を意味します。Start timeOffsetは、出発時刻の最適化における最大調整時間 (シフトの最大所要時間によって制限される) を定義します。これは、車両の終了場所 (将来の使用のために予約されている) には影響しません。
-
休憩:
-
任意パラメーター
breaksでは、ツアー中の車両休憩のリストを指定します。シフトごとに最大5つの休憩がサポートされます。休憩のtime windowsの重複は認められません。 -
休憩にはオプションの位置指定プロパティがあります。このプロパティを省略すると、車両は最後に配達されたジョブの位置で休憩を取ります。
-
休憩の時間枠が終了する前に車両が集配センターに到着した場合、デフォルトで休憩はスキップされます。この動作を変更して、旅程の最後に休憩を入れるには、休憩に
policyプロパティを追加して、allowAtTheEnd値を設定します。詳細については、「休憩のアカウント」を参照してください。
-
-
再積載:
-
任意プロパティ
reloadsを使用して、一連のVehicleReloadsを指定できます。シフトごとに最大5件の再積載がサポートされます。 -
VehicleReloadは車両が荷物を積み下ろしできる場所 (集配センターなど) です。 -
必須の
durationプロパティを使用して、車両の積み下ろしにかかる時間を指定できます。 -
任意プロパティ
timesでは、車両が積載または再積載のために再積載場所に到着する必要がある時間枠を定義します。 -
再積載を指定すると、対応する車両はツアーごとに複数の旅程 (再積載ごとに1件追加) を実行します。ただし、これは運行管理で再積載を行わなければすべてのジョブに対処できない場合に限定されます。
-
ソリューションのツアーオブジェクトの再積載アクティビティでは、同じ車両による2つの個別の旅程アクティビティは区別されます。アルゴリズムが再積載を伴わないソリューションを見つけた場合、たとえば、運行管理の容量に十分な余裕があり、1回の旅程ですべてのジョブを遂行できる場合は、再積載のアクティビティは旅程に追加されません。
詳細については、「複数のリロードポイントを有効にする」を参照してください。
-
-
充電:
- オプションの
rechargesプロパティでは、指定されたシフト内で車両に使用可能な充電ステーションのリストを定義できます。1回のシフトにつき最大20か所の充電ステーションを指定できます。 - 車両が
maxDistance制限に到達する前に、リストされている充電ステーションの1つが自動的にツアーに挿入されます。 - 必須の
durationプロパティでは、車両がステーションで充電に費やす時間を定義します。 - オプションの
timesプロパティを使用すると、車両が充電のためにステーションに到着する必要がある時間ウィンドウを設定できます。
詳細については、「指定されたステーションでEV充電をスケジュールすることで、フリートの効率を上げる」を参照してください。
- オプションの
-
停車の基本所要時間:
-
任意パラメーター
stopBaseDurationを使用して、各停車地に一定の時間を追加できます。 -
指定された場合は、
valueで定義された一定の時間が、各停車地に車両が到着した直後に追加されます (typeと同様に停車地ごとに1回のみ)。この時間は、たとえば車両の駐車にかかる時間、積み込み/積み下ろしのための車両の準備時間、一部の施設の入館手続きなどのモデル化に使用できます。 -
停車所要時間は、倉庫における出発と/to到着を除くすべての停車地に適用されます。また、ジョブタスクの所要時間は停車所要時間の影響を受けず、停車所要時間後またはその時間枠の開始のどちらか遅い方の時点から開始されます。
詳細については、「車両依存停止ベース期間によるディスパッチの改善」を参照してください。
-
-
混載制限:
-
1台の車両内で競合するジョブが混在しないようにするには、任意プロパティ
mixingRestrictionsを使用して、競合するジョブカテゴリーのセットを指定できます。ジョブカテゴリーは、ジョブのcategoryプロパティによって参照されます。詳細については、混合荷重制限の定義を参照してください。
-
-
停止設定:
- 任意で
StopConfigを追加し、停車地の場所と停車地でのアクティビティとの間の最大許容距離を設定できます。
- 任意で
-
休憩時間:
-
restTimesパラメーターを使用すると、運転時間、勤務時間、またはその両方に基づいて休憩と作業制限を定義できます。この機能は、休憩および勤務制限に関連する法的または契約上の要件をモデル化するのに役立ちます。 -
サポートされるパラメーター
driving
累積運転時間のみに基づいて休憩を定義します。working
合計勤務時間 (運転時間+その他の作業時間) に基づいて休憩を定義します。dutyRule
義務的な休憩期間が必要となる前に許容される最大の勤務時間や運転時間を定義します。
-
restTimesフィーチャーは、breaksフィーチャーと組み合わせることはできません。 -
restTimesが使用されている場合、出発時間の最適化は無効になります。
注
これは開発中のアルファ機能です。
{ "restTimes": { "driving": { "type": "fixedDuration", "interval": 14400, "breakDuration": 1800 }, "working": { "type": "fixedDuration", "interval": 28800, "breakDuration": 2700 }, "dutyRule": { "type": "fixedDuration", "maxWorkingTime": 32400, "maxDrivingTime": 32400, "minOffTime": 39600 } } }詳細については、「REST Timesを組み込む」を参照してください。
-
-
-
燃料:旅程の燃料
consumptionおよびco2emission統計情報を計算するための車両エネルギー消費パラメーターが含まれています。詳細については、「燃料消費量およびCO ₂排出量の監視」を参照してください。 -
capacity:車両が輸送できる商品の数や体積の制限です。容量は、体積、質量、サイズなどの多次元測定単位で表されます。
"capacity": [10] -
skills:ジョブの処理に使用できる車両スキルのリストです。スキルを使用すると、特定の車両タイプを特定のジョブにマッチングすることができます。ジョブスキルに一致するスキルを持つ車両のみが、これらのジョブを完了できます。
"skills": ["fridge"] -
limits:車両タイプに適用される制約を指定します
-
maxDistance:車両の最大距離の制限をメートル単位で指定します
-
shiftTime:車両のシフト時間を秒単位で定義します
-
stops:シフトあたりの停車地数の制限を定義します
- maxCount:車両が1シフトで対応できる停車地の最大数を定義します
- minCount:車両が1シフトで対応する必要がある停車地の最小数を定義します
注
停車地の最小数を定義する機能はアルファ機能です。次のような潜在的な問題に注意してください。
- 最小値が、他の制約に基づいて許容される停車地の最大数に非常に近い場合、ソリューションを見つけることが困難な場合があります
- 制約を満たすと、目標の観点でソリューションの品質が大幅に悪くなる可能性があります。特に、すべての優先順位の高いジョブが未割り当てのままになると悪化します
- 指定された制限を満たすことのみを目的に、不要な停車地が発生する場合があります
{ "limits": { "maxDistance": 30000, "shiftTime": 28800, "stops": { "maxCount": { "value": 42 }, "minCount": { "value": 13 } } } }詳細については、「ルート制限の設定」を参照してください。
-
-
territories:優先順位が設定された車両タイプのテリトリー。
strictがfalseに設定されている場合、その車両タイプは割り当てられたテリトリー外でジョブを遂行できますが、優先順位は低くなります。そうでない場合には、テリトリー外ではジョブを遂行できません。各テリトリーには、必須の
idプロパティと、デフォルト値1が設定された任意プロパティpriorityがあります。priorityで許可される値の範囲は、最も高い優先順位を示す1から最も低い優先順位を示す5までです。特定の車両タイプにとって優先順位の高いテリトリー内のジョブは、そのタイプの車両に割り当てることをお勧めします。ジョブのテリトリーは、ジョブの場所の
territoryIdsプロパティを使用して指定します。{ "territories": { "strict": true, "items": [ { "id": "territory1", "priority": 1 } ] } }
ルート検索プロファイル
ルート検索プロファイルでは、車両がルートを進む方法の属性と設定を指定します。これには、ルート検索プロファイル (car、truck、scooterなど)、回避または除外するルート/エリア/国、ルーティングに影響を与える可能性のある特定のプロファイルタイプに固有の物理的特性などのパラメーターが含まれます。
たとえば、プロファイルは、車両が危険物を運ぶことができるかどうか、または特定のトンネルカテゴリーへのアクセスを制限されているかどうかを示すことができます。ルート検索プロファイル定義により、車両の効率性と規制への準拠が最適化されます。
注
プロファイルを多く作りすぎると、レスポンス時間が遅くなり、サービスコストが増加する可能性があります。各プロファイルには、評価と処理のために余剰計算リソースが必要です。
冗長性を回避するには:
- 値が類似したプロファイルを、柔軟なパラメーターが含まれる単一のプロファイルにまとめます。
- わずかな違いしかないのに別のプロファイルを作成しないようにします。
車両のルート検索プロファイル定義の一部として、次のパラメーターを使用できます。
-
name:ルート検索プロファイルの一意の名前です。車両タイプの定義で使用されます。
"name": "light_delivery_truck" -
type:ルート検索プロファイルタイプを指定します。これは、車両の特性と制約に基づいてルートが計算される方法に影響します。使用可能な値は以下のとおりです。
taxicartruckscooterbicyclepedestrianbusprivateBus
例:
"type": "car"注
一部のプロファイルオプションは特定のプロファイルタイプに限定されます。たとえば、
shippedHazardousGoodsオプションはトラックプロファイルでのみ使用できます。 -
departureTime:車両の出発時刻を指定します。省略した場合、同じ車両プロファイルを共有するすべての車両タイプの 最も早いシフト開始時刻が使用されます。
-
avoid:ルート計算中に回避すべきルート、エリア、またはフィーチャーを指定します。これにより、特定のニーズや制限に合わせてルート検索を調整し、効率性と現地の規制や好みへの準拠を強化できます。
必要に応じて、次のエンティティを回避できます。
featuresareassegmentszoneIdentifiertruckRoadTypeszoneCategories
詳細については、「APIリファレンス」を参照してください。
注
- 問題で定義されているすべての場所の最小包含円の半径が490 km以下の場合にのみ、このフィーチャーを使用します。次の図は、APIがロケーショングループの半径を決定する方法を示しています。

次の手順では、半径の計算方法を説明しています。 1.すべてのジョブの場所を含むバウンディングボックスを生成します。 2.バウンディングボックスの中心を指定します。 。中心から、バウンディングボックス内の最も遠いポイントを見つけます。 4.中心から最も遠いポイントまでの距離を測定します。この距離が半径と見なされます。
avoidフィーチャーを使用した際、指定された属性を計算されたルートで回避できなかった場合には、REACHABLE_CONSTRAINTの理由によりジョブが未割り当てになる可能性があります。
次の例は
avoid.areasオプションを示したものです。{ "avoid": { "areas": [ { "type": "boundingBox", "north": 52.581602074654555, "south": 52.54549707905248, "east": 13.397741756250387, "west": 13.31585928556846 } ] } } -
Eexclude:ツアー計画から
countriesとareasのどちらを除外するかを指定します。国コードはISO 3166-1 alpha-3形式で指定する必要があります。エリアは、バウンディングボックス、ポリゴン、またはエンコードされたポリゴンを表す一連の座標によって定義されます。注
- 国を除外するときに意味のある結果を得るには、すべての場所を囲む最小包含円の半径が小さすぎず、490 kmを超えていないことを確認してください。円の計算方法の詳細については、
avoidオプションを参照してください。 - 半径が490 kmを超えると、検証エラーが返されます。このバランスは、国の除外を効果的に処理するために必要です。
次の例は
exclude.countriesオプションを示したものです。{ "exclude": { "countries": [ "AUT", "CHE" ] } }次の例は
exclude.areasオプションを示したものです。{ "exclude": { "areas": [ { "type": "boundingBox", "north": 52.581602074654555, "south": 52.54549707905248, "east": 13.397741756250387, "west": 13.31585928556846 } ] } } - 国を除外するときに意味のある結果を得るには、すべての場所を囲む最小包含円の半径が小さすぎず、490 kmを超えていないことを確認してください。円の計算方法の詳細については、
-
traffic:車両プロファイルの交通情報パラメーターを指定します。
modeをdisabledに設定すると、長期閉鎖を含むすべての交通データが無視されます。指定しない場合、トラフィックmodeは自動的にdefaultに設定され、fleet.traffic設定が使用されます。{ "traffic": { "mode":"disabled" } } -
ignoreRouteViolations:閉鎖された道路や通行禁止区域などのルート検索違反を無視できるようになります。このような制限はルートの最後の数メートルにのみ適用されることが多く、ドライバーは残りの行程を歩くことができます。
次のいずれかのタイプを指定できます。
- all - 通行止め道路、進入禁止エリア、その他のルート制限など、すべてのルーティング違反を無視します。
- traffic - 道路の閉鎖や交通状況による障害など、交通関連の違反のみを無視します。
注
一部のロケーションに到達できない場合でもソリューションが提供される可能性があるため、この機能は注意して使用してください。
{ "ignoreRouteViolations": [ "traffic" ] } -
matrix:同期リクエストの車両プロファイルにカスタムルーティングマトリックスを指定できます。マトリックスには、問題で使用されているすべて位置IDを伴う
origins配列と、travelTimesおよびdistancesの2つのフラット配列を含める必要があります。 これらの配列はどちらも2次元マトリックスを表し、行はorigins、列はdestinationsに対応します。 データはorigins配列と同じ順序で並べる必要があるため、両方の配列の要素の順序が重要となります。{ "matrix": { "origins": [ { "type": "id", "id": "location_1" }, { "type": "id", "id": "location_2" } ], "travelTimes":[0,1632,1650,0], "distances":[0,20977,24635,0] } } -
matrixId:ALPHAでは、非同期リクエストで車両プロファイルのカスタムルーティングマトリックスIDを参照できます。マトリックスをIDで参照する前に、
/matricesエンドポイントを通じてマトリックスをアップロードする必要があります。注
このエンドポイントへのアクセスについては、各地域のHERE担当者にお問い合わせください。このようなマトリックスの形式は、上述の同期エンドポイント用のマトリックスと同一です。
{ "matrixId": "2d3b04bc-055d-4d6a-8dff-49d3608be805" }
タイプ固有のオプション
特定のプロファイルタイプには、optionsパラメーター内で定義された排他的なオプションのセットが付属しています。これらのオプションはプロファイルタイプに固有であり、すべてのプロファイルタイプに共通のオプションとともに提供されます。
たとえば、taxiプロファイルタイプの場合、allowDriveThroughTaxiRoadsオプションを使用して、車両がタクシー専用の道路や車線を走行できるかどうかを指定します。
別の例として、truckプロファイルタイプにはshippedHazardousGoodsオプションが含まれています。この必要に応じては、トラックが輸送する危険物 (爆発物、ガス、水に有害な物質など) のリストを設定します。
これらのパラメーターは、さまざまな車両タイプやシナリオの特定のニーズや制約に合わせてルート検索を調整するのに役立ちます。各プロファイルタイプで使用可能なオプションの詳細については、APIリファレンスを参照してください。
トラフィック
traffic設定では、ルート検索で考慮すべき交通情報の種類を設定します。
liveOrHistorical:将来の出発時刻にはリアルタイムまたは過去の交通データが適用されます (出発時刻がどれだけ先かに応じて変わります)。過去の出発時刻には、過去の交通データのみが 適用されます。車両タイプの出発時刻は、車両プロファイルの任意のdepartureTimeプロパティを使用して設定できます 。車両プロファイルを定義するときにこのプロパティが省略された場合は、 その同じ車両プロファイルを共有するすべての車両タイプの最も早いシフトの開始時刻が、そのプロファイルの出発時刻として使用されます。この設定は すべての場所が半径490 km以内にあり、可能な限りリアルタイムの交通データを使用する場合に選択します。historicalOnly:過去の交通データに基づく自由流速速度のみが適用されます。この設定は、リアルタイムの交通データの 使用を避ける場合に選択します。automatic:すべての座標が半径490 km以内の場合はliveOrHistoricalと同じです。それ以外の場合は以下と同じです。historicalOnly。最適なオプションをサービスが自動的に決定するようにする場合は、この設定を選択します。
デフォルト値はautomaticです。
位置情報
各locationオブジェクトには、緯度と経度の2つの必須パラメーターが含まれている必要があります。
場所をより正確に指定するには、さらに次の2つの任意パラメーターを指定できます。
-
sideOfStreetHint:ルート検索時に、この場所で道路のどちら側を使用するかを決定するためのヒントです。 このヒントは、道路の横にある、車両が停止する地点にします。{ "lat": 41.53761, "lng": -8.45025, "sideOfStreetHint": { "lat": 41.53761, "lng": -8.45025, "matchSideOfStreet":"always" } } -
nameHint:ルート計算で、類似した名前の場所を検索するように指示します。 このヒントは、たとえば高架道路の下にある場所に到達するために使用できます。{ "lat": 52.39195, "lng": 13.08384, "nameHint": "Friedrich-List-Straße" }
設定
設定はアルゴリズムのデフォルトの動作を調整するために使用できます。詳しくは「設定」のドキュメントを参照してください。次の例では、ソルバーは問題を解決するのに最大2秒 (maxTime) かかり、その2秒のうちソリューションを十分に改善しない期間が1秒間 (stagnationTime) ある場合、アルゴリズムは終了します。
例
__問題__の例:
{
"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": "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": "car",
"type": "car",
"departureTime": "2020-07-04T09:15:00Z"
}]
},
"configuration": {
"termination": {
"maxTime": 2,
"stagnationTime": 1
}
}
}先月の更新