リレーションを使用したツアーの再計算
ツアー計画の 概念により、オプション relations
のパラメータを使用して、特定の車両のジョブの実行ルールおよび実行順序を定義できます。 リレーションを使用すると、再計画プロセスと最終ソリューションのアルゴリズムの動作に影響を与えることができます。リレーションには、次の 3 つのタイプがあります。
-
sequence
- この関連で指定された作業は、この特定の車両によって指定された順序で提供される必要があります。 実行順序は変更できません。また、このリレーションで指定されたジョブの間に追加のジョブを挿入することはできません。
"relations": [
{
"type": "sequence",
"jobs": [
"job_1",
"job_2"
"job_4"
],
"vehicleId": "Vehicle_1_1"
-
flexible
- このリレーションで指定された作業は、この特定の車両によって指定された順序で提供される必要があります。 ジョブの実行順序は変更されませんが、このリレーションまたは別のリレーションで指定されていないジョブは、このリレーションで定義されているジョブの間であっても、この車両のツアーの任意の場所に挿入できます。
"relations": [
{
"type": "flexible",
"jobs": [
"job_1",
"job_2"
"job_4"
],
"vehicleId": "Vehicle_1_1"
-
tour
- このリレーションで指定されたジョブは、この特定の車両が処理する必要がありますが、ジョブの順序は変更される可能性があります。
"relations": [
{
"type": "tour",
"jobs": [
"job_1",
"job_2"
"job_4"
],
"vehicleId": "Vehicle_1_1"
sequence
と flexible
リレーションとは異なり、 このリレーションtour
はすべてのジョブがツアーで割り当てられることを保証するものではありません。 tour
関連する一部のジョブは、容量、時間などの他の制約の理由により、割り当て解除されることがあります これらのジョブをまだ割り当てる必要がある場合は、優先度の高いジョブを使用するか、または割り当てを保証する別の種類の関係を使用する必要があります。
sequence
または flexible
リレーションに追加されたジョブには、時間帯、スキル要件、キャパシティ違反、集荷 / 配達の割り当て、ルーティングの可用性などの制約違反がないことに注意してください。 これにより、実現不可能な解決策や望ましくない解決策が生じる可能性があります。 また、複数 のジョブではリレーションを使用できません。
車両のリレーションに設定されるジョブの数に制限はありません。また、同じツアーの運行管理内の異なる車両に対して複数のリレーションを組み合わせる場合にも制限はありません。
また、vehicleId
は 車両 type
id
+ _index であることに注意してください。 この場合、車両 type
id
は Vehicle_1
であり、車両の量は 3 であるため、例の vehicleId
s は Vehicle_1_1
、Vehicle_1_2
、および Vehicle_1_3
になります。
ツアーを再計画するときに「リレーション」が問題解決にどのような影響を与えるかを確認するために、いくつかの簡単な例を試してみましょう。
Sequence
4 つのジョブを実行するのに十分な容量とそれぞれのシフト時間を備えた車両があるとします。 これら 4 つのジョブのうち 2 つは、配達または集荷の場所があまり近くないにもかかわらず、何らかの方法で接続されているため、次々に実行する必要があります。通常、これらのジョブはツアー内でより有利に最適化されますが、リレーション タイプ sequence
をそれらに設定しているため、次々に実行することしかできません。簡単なproblemの例は次のとおりです。
{
"fleet": {
"types": [
{
"id": "Vehicle_1",
"profile": "car_1",
"costs": {
"fixed": 9.0,
"distance": 0.004,
"time": 0.005
},
"shifts": [
{
"start": {
"time": "2021-08-27T08:03:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2021-08-27T18:03:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
}
}
],
"capacity": [
10
],
"limits": {
"maxDistance": 300000,
"shiftTime": 43200
},
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_1"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T09:03:00Z",
"2021-08-27T18:03:00Z"
]
],
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372257
},
"duration": 360
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T11:03:00Z",
"2021-08-27T20:03:00Z"
]
],
"location": {
"lat": 52.43363386232821,
"lng": 13.403232562191313
},
"duration": 540
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T10:03:00Z",
"2021-08-27T16:03:00Z"
]
],
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"duration": 660
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T09:03:00Z",
"2021-08-27T17:03:00Z"
]
],
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"duration": 1140
}
],
"demand": [
1
]
}
]
}
}
],
"relations": [
{
"type": "sequence",
"jobs": [
"job_1",
"job_4"
],
"vehicleId": "Vehicle_1_1"
}
]
}
}
このProblemの最初の解決策を分析 すると、車両が最初にjob_2
とjob_3
の後にjob_1
が実行され、その後リレーションで指定されたjob_4
になる場合があります。 このようにして、ツアー中に何らかの制約が変更され、ツアーが再計算された場合、順序関係のあるジョブが指定された順序で実行されます。
{
"statistic": {
"cost": 269.051,
"distance": 55254,
"duration": 7807,
"times": {
"driving": 5107,
"serving": 2700,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T08:03:00Z",
"departure": "2021-08-27T10:38:23Z"
},
"load": [
4
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.43363386232821,
"lng": 13.403232562191311
},
"time": {
"arrival": "2021-08-27T11:03:00Z",
"departure": "2021-08-27T11:12:00Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"time": {
"arrival": "2021-08-27T11:30:55Z",
"departure": "2021-08-27T11:41:55Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372255
},
"time": {
"arrival": "2021-08-27T12:03:55Z",
"departure": "2021-08-27T12:09:55Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"time": {
"arrival": "2021-08-27T12:24:34Z",
"departure": "2021-08-27T12:43:34Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T12:48:30Z",
"departure": "2021-08-27T12:48:30Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 269.051,
"distance": 55254,
"duration": 7807,
"times": {
"driving": 5107,
"serving": 2700,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
job_3
の実行後 、近くの場所にあるツアーに 1 つ以上のジョブが追加されたとします。 通常、job_5
は job_1
の後に実行されますが、sequence
のリレーションを考慮すると、 job_1
と job_4
の間にジョブを追加することはできません。そのため、再計画後、job_5
がリレーションから 2 つのジョブの前に実行され、その後 job_1
と job_4
が順番に実行されます。
{
"statistic": {
"cost": 147.98,
"distance": 28900,
"duration": 4676,
"times": {
"driving": 2816,
"serving": 1860,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"time": {
"arrival": "2021-08-27T11:41:55Z",
"departure": "2021-08-27T11:41:55Z"
},
"load": [
3
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.57175589353722,
"lng": 13.360747750372257
},
"time": {
"arrival": "2021-08-27T12:02:47Z",
"departure": "2021-08-27T12:08:47Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_5",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372255
},
"time": {
"arrival": "2021-08-27T12:15:16Z",
"departure": "2021-08-27T12:21:16Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"time": {
"arrival": "2021-08-27T12:35:55Z",
"departure": "2021-08-27T12:54:55Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T12:59:51Z",
"departure": "2021-08-27T12:59:51Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 147.98,
"distance": 28900,
"duration": 4676,
"times": {
"driving": 2816,
"serving": 1860,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
Flexible
4 つの作業を実行するのに十分な積載量とそれぞれのシフト時間を備えた車両がある状況をモデル化しましょう。 これら 4 つのジョブのうち 2 つ ( job_1
およびjob_4
) は、論理的には別の順序で解決されますが、配達または集荷が何らかの形で接続されているため、順番に実行する必要があります。 また、これら 2 つの作業のエリアでは、ツアー中に新しい作業がいくつか発生する可能性があるので、車両でもそれらの作業を実行できるようにする必要があります。
この状況で flexible
は、これらのジョブのリレーションを設定する必要があります。そのため、関連するジョブを実行すると、他のジョブがツアーに追加されることがあります。 このような制約の簡単なProblemの例は、次のとおりです。
{
"fleet": {
"types": [
{
"id": "Vehicle_1",
"profile": "car_1",
"costs": {
"fixed": 9.0,
"distance": 0.004,
"time": 0.005
},
"shifts": [
{
"start": {
"time": "2021-08-27T08:03:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2021-08-27T18:03:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
}
}
],
"capacity": [
10
],
"limits": {
"maxDistance": 300000,
"shiftTime": 43200
},
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_1"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T09:03:00Z",
"2021-08-27T18:03:00Z"
]
],
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372257
},
"duration": 360
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T11:03:00Z",
"2021-08-27T20:03:00Z"
]
],
"location": {
"lat": 52.43363386232821,
"lng": 13.403232562191313
},
"duration": 540
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T10:03:00Z",
"2021-08-27T16:03:00Z"
]
],
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"duration": 660
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-08-27T09:03:00Z",
"2021-08-27T17:03:00Z"
]
],
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"duration": 1140
}
],
"demand": [
1
]
}
]
}
}
],
"relations": [
{
"type": "flexible",
"jobs": [
"job_1",
"job_4"
],
"vehicleId": "Vehicle_1_1"
}
]
}
}
当初の解決策からわかるように、ツアーではjob_4
が job_1
の後に解決され、これら 2 つのジョブがリレーション外のジョブの後に解決されるようにツアーが最適化されました。
{
"statistic": {
"cost": 269.116,
"distance": 55254,
"duration": 7820,
"times": {
"driving": 5120,
"serving": 2700,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T08:03:00Z",
"departure": "2021-08-27T10:38:23Z"
},
"load": [
4
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.43363386232821,
"lng": 13.403232562191311
},
"time": {
"arrival": "2021-08-27T11:03:00Z",
"departure": "2021-08-27T11:12:00Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"time": {
"arrival": "2021-08-27T11:30:55Z",
"departure": "2021-08-27T11:41:55Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372255
},
"time": {
"arrival": "2021-08-27T12:04:08Z",
"departure": "2021-08-27T12:10:08Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"time": {
"arrival": "2021-08-27T12:24:47Z",
"departure": "2021-08-27T12:43:47Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T12:48:43Z",
"departure": "2021-08-27T12:48:43Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 269.116,
"distance": 55254,
"duration": 7820,
"times": {
"driving": 5120,
"serving": 2700,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
job_3
の実行後、近くの場所あるツアーに 2 つのジョブ job_5
とjob_6
が追加されたとし ます。 通常、リレーション sequence
を使用すると、新しく追加された job_5
と job_6
が job_4
の後で実行されます。 ただし 、 job_1
とjob_4
の間にジョブを追加できるリレーションflexible
では、ツアーjob_6
はjob_1
の前に実行されjob_5
は、job_1
とjob_4
の間に挿入されるように最適化され、ツアー内で次々に解決されます。
{{
"statistic": {
"cost": 158.063,
"distance": 29782,
"duration": 5987,
"times": {
"driving": 3767,
"serving": 2220,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.473321658918245,
"lng": 13.28972099097991
},
"time": {
"arrival": "2021-08-27T11:41:55Z",
"departure": "2021-08-27T11:41:55Z"
},
"load": [
4
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.52175589353722,
"lng": 13.357747750372257
},
"time": {
"arrival": "2021-08-27T12:00:23Z",
"departure": "2021-08-27T12:06:23Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_6",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.59175589353722,
"lng": 13.350747750372255
},
"time": {
"arrival": "2021-08-27T12:28:05Z",
"departure": "2021-08-27T12:34:05Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.55175589353722,
"lng": 13.357747750372257
},
"time": {
"arrival": "2021-08-27T12:46:57Z",
"departure": "2021-08-27T12:52:57Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_5",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.54165532725351,
"lng": 13.365047170290309
},
"time": {
"arrival": "2021-08-27T12:57:46Z",
"departure": "2021-08-27T13:16:46Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2021-08-27T13:21:42Z",
"departure": "2021-08-27T13:21:42Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 158.063,
"distance": 29782,
"duration": 5987,
"times": {
"driving": 3767,
"serving": 2220,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
Tour
運行管理 に複数の車両があり、特定の車両によって一部の作業を実行する必要があり、実行順序が重要ではない場合 は、リレーションtour
を使用する必要があります。 たとえば、 2 台の車両の運行管理 と、実行する 6 つのジョブがあります。 私たちの計画によれば、このリストの特定のジョブを実行するには車両の 1 台が必要です。他の 3 つの作業を実行する車両はどれですか? この例では、job_1
、job_2
、および job_3
とのリレーション tour
を Vehicle_1_1
に設定します。 Vehicle_1_1
がこれらのジョブのみを実行し、他のジョブの実行は制限されることは意味しませんが、Vehicle_1_1
のみがそれらのジョブを実行でき、Vehicle_1_2
は実行できないことを意味します。 このような制約のProblemは、次のようになります。
{
"fleet": {
"types": [
{
"id": "Vehicle_1",
"profile": "car",
"costs": {
"fixed": 10.0,
"distance": 0.002,
"time": 0.003
},
"shifts": [
{
"start": {
"time": "2021-10-23T10:16:40Z",
"location": {
"lat": 51.08511,
"lng": 13.76875
}
},
"end": {
"time": "2021-10-23T17:00:00Z",
"location": {
"lat": 51.059188,
"lng": 13.540317
}
}
}
],
"capacity": [
5
],
"amount": 1
},
{
"id": "Vehicle_2",
"profile": "car",
"costs": {
"fixed": 12.0,
"distance": 0.002,
"time": 0.002
},
"shifts": [
{
"start": {
"time": "2021-10-23T08:00:00Z",
"location": {
"lat": 51.059188,
"lng": 13.540317
}
},
"end": {
"time": "2021-10-23T19:00:00Z",
"location": {
"lat": 51.059188,
"lng": 13.540317
}
}
}
],
"capacity": [
5
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "Job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T12:30:00Z",
"2021-10-23T14:00:00Z"
]
],
"location": {
"lat": 51.05238,
"lng": 13.74114
},
"duration": 1800
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T12:05:00Z",
"2021-10-23T17:30:00Z"
]
],
"location": {
"lat": 51.06099,
"lng": 13.75245
},
"duration": 2000
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T13:35:00Z",
"2021-10-23T17:00:00Z"
]
],
"location": {
"lat": 51.08511,
"lng": 13.76875
},
"duration": 1800
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T10:05:00Z",
"2021-10-23T10:30:00Z"
]
],
"location": {
"lat": 51.1323847,
"lng": 13.7779515
},
"duration": 2000
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_5",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T16:35:00Z",
"2021-10-23T17:00:00Z"
]
],
"location": {
"lat": 51.11716,
"lng": 13.73054
},
"duration": 1800
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_6",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T11:05:00Z",
"2021-10-23T11:30:00Z"
]
],
"location": {
"lat": 51.12308,
"lng": 13.76406
},
"duration": 2000
}
],
"demand": [
1
]
}
]
}
}
],
"relations": [
{
"type": "tour",
"jobs": [
"Job_1",
"Job_2",
"Job_3"
],
"vehicleId": "Vehicle_1_1"
}
]
}
}
最初の解決策からわかるよう に、Vehicle_1_1
は、リレーションtour
で指定されたjob_1
、job_2
、job_3
だけでなく、job_4
およびjob_6
も実行します。 さらに、実行順序によって、リレーション内 job_2
job_1
のジョブのシーケンスが保持されず、その後 job_3
にも保持されません。 その結果、Vehicle_2_1
は、 job_5
のみが実行されます。
{
"statistic": {
"cost": 251.099,
"distance": 88444,
"duration": 18630,
"times": {
"driving": 6068,
"serving": 11400,
"waiting": 1162,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 51.08511,
"lng": 13.76875
},
"time": {
"arrival": "2021-10-23T10:16:40Z",
"departure": "2021-10-23T10:19:10Z"
},
"load": [
5
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 51.1323847,
"lng": 13.7779515
},
"time": {
"arrival": "2021-10-23T10:30:00Z",
"departure": "2021-10-23T11:03:20Z"
},
"load": [
4
],
"activities": [
{
"jobId": "Job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.12308,
"lng": 13.76406
},
"time": {
"arrival": "2021-10-23T11:07:30Z",
"departure": "2021-10-23T11:40:50Z"
},
"load": [
3
],
"activities": [
{
"jobId": "Job_6",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.06099,
"lng": 13.75245
},
"time": {
"arrival": "2021-10-23T11:54:33Z",
"departure": "2021-10-23T12:38:20Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.05238,
"lng": 13.74114
},
"time": {
"arrival": "2021-10-23T12:44:20Z",
"departure": "2021-10-23T13:14:20Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.08511,
"lng": 13.76875
},
"time": {
"arrival": "2021-10-23T13:26:05Z",
"departure": "2021-10-23T14:05:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T14:28:21Z",
"departure": "2021-10-23T14:28:21Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 152.46499999999997,
"distance": 48806,
"duration": 14951,
"times": {
"driving": 4189,
"serving": 9600,
"waiting": 1162,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "Vehicle_2_1",
"typeId": "Vehicle_2",
"stops": [
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T08:00:00Z",
"departure": "2021-10-23T16:18:57Z"
},
"load": [
1
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 51.11716,
"lng": 13.73054
},
"time": {
"arrival": "2021-10-23T16:35:00Z",
"departure": "2021-10-23T17:05:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_5",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T17:20:16Z",
"departure": "2021-10-23T17:20:16Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 98.63400000000001,
"distance": 39638,
"duration": 3679,
"times": {
"driving": 1879,
"serving": 1800,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
Vehicle_1_1
が 最初の 2 つのジョブjob_4
、job_6
を実行し、 さらに 3 つのジョブjob_7
、job_8
、job_9
がツアーに追加さ れたとし ます。 再計算後、ソリューションは変更さ れましたが、リレーションtour
のジョブはVehicle_1_1
によって実行されます。 次に Vehicle_1_1
は 、 job_1
、 job_3
、job_2
、およびjob_7
を実行してツアーを続行します 。 今回Vehicle_1_2
は、次に job_9
、job_5
、job_8
に進みます。
{
"statistic": {
"cost": 288.165,
"distance": 106927,
"duration": 20372,
"times": {
"driving": 6972,
"serving": 13400,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 51.08511,
"lng": 13.76875
},
"time": {
"arrival": "2021-10-23T12:38:20Z",
"departure": "2021-10-23T12:41:08Z"
},
"load": [
4
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 51.05238,
"lng": 13.74114
},
"time": {
"arrival": "2021-10-23T12:53:15Z",
"departure": "2021-10-23T13:23:15Z"
},
"load": [
3
],
"activities": [
{
"jobId": "Job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.08511,
"lng": 13.76875
},
"time": {
"arrival": "2021-10-23T13:35:00Z",
"departure": "2021-10-23T14:05:00Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.06099,
"lng": 13.75245
},
"time": {
"arrival": "2021-10-23T14:13:04Z",
"departure": "2021-10-23T14:46:24Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.09099,
"lng": 13.65245
},
"time": {
"arrival": "2021-10-23T15:04:39Z",
"departure": "2021-10-23T15:37:59Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_7",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T15:53:55Z",
"departure": "2021-10-23T15:53:55Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 126.51100000000001,
"distance": 40905,
"duration": 11567,
"times": {
"driving": 3967,
"serving": 7600,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "Vehicle_2_1",
"typeId": "Vehicle_2",
"stops": [
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T08:00:00Z",
"departure": "2021-10-23T15:41:33Z"
},
"load": [
3
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 51.16099,
"lng": 13.75245
},
"time": {
"arrival": "2021-10-23T15:58:41Z",
"departure": "2021-10-23T16:32:01Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_9",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.11716,
"lng": 13.73054
},
"time": {
"arrival": "2021-10-23T16:45:55Z",
"departure": "2021-10-23T17:15:55Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_5",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.11099,
"lng": 13.70245
},
"time": {
"arrival": "2021-10-23T17:20:46Z",
"departure": "2021-10-23T17:54:06Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_8",
"type": "delivery"
}
]
},
{
"location": {
"lat": 51.059188,
"lng": 13.540317
},
"time": {
"arrival": "2021-10-23T18:08:18Z",
"departure": "2021-10-23T18:08:18Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 161.654,
"distance": 66022,
"duration": 8805,
"times": {
"driving": 3005,
"serving": 5800,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
注意tour
関係を使用しているときに、ソリューションで未割り当てのジョブがいくつか発生してもそれらのジョブを割り当てる必要がある場合は、それらのジョブに高い優先度を使用するか、または割り当てを保証するリレーションの sequence
または flexible
タイプを使用する必要があります。