特定の最適化目標に合わせて目的関数を使用する
目的とは最適化問題における目標です。問題の制約を満たすすべての実行可能なソリューションで最小化または最大化される値です。目的が使用されると、objectivesプロパティを使用して配列として一緒に指定されます。すべての目的を毎回指定する必要はありません。目的の有/absenceと、リスト表示されている順序が重要です。リストの先頭に表示される目的は下位に表示されるものよりも重要になります。ソフト制約は他の設定を考慮しますが、ハード制約は必須です。シーケンスを使用すると、複数の目的のソリューションを実現できます。
注
minimizeUnassignedとminimizeCostの目的は必須です。省略するとAPIエラーが生じます。
これらの目的の効果を理解するために、ドライバーが働いた時間に基づいて報酬を受け取るシナリオを考えてみましょう。このような場合、ディスパッチャはできるだけ短時間でルートを構成して運営コストの削減と効率化の向上を図ります。目的関数を使用すると、ソリューションにこのロジックを適用できます。
目的minimizeDurationを使用すると、ルートの時間を短縮できます。問題に追加する目的配列の例を次に示します。
"objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "minimizeDuration"
},
{
"type": "minimizeCost"
}
]目的を指定しない場合、デフォルトではソルバーはこのロジックに従います。
- 重要度を最高に設定すると、割り当てられていないジョブの量が最小限に抑えられます。
- 重要度を中に設定すると、ルート数が最小限に抑えられます。
- 重要度を最低に設定すると、総コストを最小限に抑えられます。
これは次の定義と同等です。
"objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "optimizeTourCount"
"action": "minimize"
},
{
"type": "minimizeCost"
}
]すべての目的リストを含む詳細については、「目的」を参照してください。
タスクシーケンスのユースケースを最適化する
このセクションでは、目的optimizeTaskOrderを使用してルートのジョブタスクアクティビティの順序を制御する方法を説明します。タスクの順序はハード制約またはソフト制約のいずれかとして使用できます。optimizeTaskOrderがソフト制約の場合、順序プロパティ値に従うよう試みます。ただし、ジョブが割り当てられなくなる可能性がある場合は、順序制約に違反してジョブが割り当てられるようにします。
問題の定式化は3つあり、ジョブタイプはpickupです。
- まず、時間枠の競合など、何らかの理由でタスクの順序を実現できないという簡単な問題があります。
- 次に、目的がなければルートが作成されず、目的があればルートが作成されることを示す問題があります。
- 3番目の問題では、時間枠が削除され、その場合にはジョブの順序が守られていることが示されています。この例ではシフト終了が指定されていないため、最短ルートはオープンVRPを使用して、1つのジョブを集配センターの近くに、もう1つのジョブを集配センターの遠くに配置することです。ソルバーはデフォルトで、まず集配センターの近くでジョブを実行しようとします。これにより、全体的なルートが短縮されるためです。
問題:optimizeTaskOrder仕様がない
以下のような基本的な問題があります。
- シフトを伴うVRP (開始と終了の集配センターの場所が異なる)
- 遂行するのは次の3つのジョブ
Job_1(指定された時間枠を使用)Job_2Job_3はシフトの開始地点から順次、道路で快適に遂行される
ソリューションを参照してください。
{
"plan": {
"jobs": [
{
"id": "Job_1_1h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"times": [
[
"2023-09-20T08:00:00Z",
"2023-09-20T10:00:00Z"
]
],
"duration": 3600
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2_2h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"duration": 3600
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_3_3h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"duration": 3600
}
],
"demand": [
1
]
}
]
}
}
]
},
"fleet": {
"types": [
{
"id": "vehicle_1",
"profile": "normal_car",
"costs": {
"fixed": 22,
"distance": 0.0002,
"time": 0.0048
},
"shifts": [
{
"start": {
"time": "2023-09-20T08:00:00Z",
"location": {
"lat": 48.821421,
"lng": 12.931591
}
},
"end": {
"time": "2023-09-22T23:00:00Z",
"location": {
"lat": 50.912724,
"lng": 7.1055
}
}
}
],
"capacity": [
10
],
"amount": 1
}
],
"profiles": [
{
"name": "normal_car",
"type": "car",
"traffic": {
"mode": "disabled"
}
}
]
}
}ソリューション:optimizeTaskOrder仕様がない
{
"statistic": {
"cost": 275.6742,
"distance": 559867,
"duration": 29521,
"times": {
"driving": 18721,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"time": {
"arrival": "2023-09-20T08:00:00Z",
"departure": "2023-09-20T08:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"time": {
"start": "2023-09-20T08:00:00Z",
"end": "2023-09-20T08:00:00Z"
}
}
],
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"distance": 0
},
{
"time": {
"arrival": "2023-09-20T08:50:15Z",
"departure": "2023-09-20T09:50:15Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_1_1h_driving",
"type": "pickup",
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"time": {
"start": "2023-09-20T08:50:15Z",
"end": "2023-09-20T09:50:15Z"
}
}
],
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"distance": 86277
},
{
"time": {
"arrival": "2023-09-20T10:38:58Z",
"departure": "2023-09-20T11:38:58Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_2_2h_driving",
"type": "pickup",
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"time": {
"start": "2023-09-20T10:38:58Z",
"end": "2023-09-20T11:38:58Z"
}
}
],
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"distance": 174491
},
{
"time": {
"arrival": "2023-09-20T12:29:23Z",
"departure": "2023-09-20T13:29:23Z"
},
"load": [
3
],
"activities": [
{
"jobId": "Job_3_3h_driving",
"type": "pickup",
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"time": {
"start": "2023-09-20T12:29:23Z",
"end": "2023-09-20T13:29:23Z"
}
}
],
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"distance": 258526
},
{
"time": {
"arrival": "2023-09-20T16:12:01Z",
"departure": "2023-09-20T16:12:01Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"time": {
"start": "2023-09-20T16:12:01Z",
"end": "2023-09-20T16:12:01Z"
}
}
],
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"distance": 559867
}
],
"statistic": {
"cost": 275.6742,
"distance": 559867,
"duration": 29521,
"times": {
"driving": 18721,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
問題:ハード制約としてのタスク順序
optimizeTaskOrderは指定されていないものの、orderプロパティが定義されている場合、違反できないハード制約と見なされます。
この例では、初期ファイルを変更して順序を変えます。Job_3、Job_2、Job_1の順に遂行する必要があるとします。同時にJob_1は8:00~9:00の時間枠内に遂行する必要があります。
ソリューションを参照してください。
{
"plan": {
"jobs": [
{
"id": "Job_1_1h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"times": [
[
"2023-09-20T08:00:00Z",
"2023-09-20T10:00:00Z"
]
],
"duration": 3600
}
],
"demand": [
1
],
"order": 3
}
]
}
},
{
"id": "Job_2_2h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"duration": 3600
}
],
"demand": [
1
],
"order": 2
}
]
}
},
{
"id": "Job_3_3h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"duration": 3600
}
],
"demand": [
1
],
"order": 1
}
]
}
}
]
},
"fleet": {
"types": [
{
"id": "vehicle_1",
"profile": "normal_car",
"costs": {
"fixed": 22,
"distance": 0.0002,
"time": 0.0048
},
"shifts": [
{
"start": {
"time": "2023-09-20T08:00:00Z",
"location": {
"lat": 48.821421,
"lng": 12.931591
}
},
"end": {
"time": "2023-09-22T23:00:00Z",
"location": {
"lat": 50.912724,
"lng": 7.1055
}
}
}
],
"capacity": [
10
],
"amount": 1
}
],
"profiles": [
{
"name": "normal_car",
"type": "car",
"traffic": {
"mode": "disabled"
}
}
]
}
}ソリューション:ハード制約としてのタスク順序
この場合、ソリューションは次のように変わります。
- リクエストにあるように、
Job_3から始める Job_2の場所を訪問する- リクエストされた時間枠内で
Job_1を3番目に遂行することはできないため、ハード制約に違反するとJob_1は未割り当てになる
{
"statistic": {
"cost": 330.42359999999996,
"distance": 751702,
"duration": 32934,
"times": {
"driving": 25734,
"serving": 7200,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"time": {
"arrival": "2023-09-20T08:00:00Z",
"departure": "2023-09-20T08:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"time": {
"start": "2023-09-20T08:00:00Z",
"end": "2023-09-20T08:00:00Z"
}
}
],
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"distance": 0
},
{
"time": {
"arrival": "2023-09-20T10:29:23Z",
"departure": "2023-09-20T11:29:23Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_3_3h_driving",
"type": "pickup",
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"time": {
"start": "2023-09-20T10:29:23Z",
"end": "2023-09-20T11:29:23Z"
}
}
],
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"distance": 258526
},
{
"time": {
"arrival": "2023-09-20T12:35:50Z",
"departure": "2023-09-20T13:35:50Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_2_2h_driving",
"type": "pickup",
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"time": {
"start": "2023-09-20T12:35:50Z",
"end": "2023-09-20T13:35:50Z"
}
}
],
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"distance": 366326
},
{
"time": {
"arrival": "2023-09-20T17:08:54Z",
"departure": "2023-09-20T17:08:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"time": {
"start": "2023-09-20T17:08:54Z",
"end": "2023-09-20T17:08:54Z"
}
}
],
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"distance": 751702
}
],
"statistic": {
"cost": 330.42359999999996,
"distance": 751702,
"duration": 32934,
"times": {
"driving": 25734,
"serving": 7200,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
],
"unassigned": [
{
"jobId": "Job_1_1h_driving",
"reasons": [
{
"code": "TIME_WINDOW_CONSTRAINT",
"description": "cannot be assigned due to violation of time window",
"details": [
{
"vehicleId": "vehicle_1_1",
"shiftIndex": 0
}
]
}
]
}
]
}
問題:時間枠付きのソフト制約としてのタスク順序
指定されている場合、optimizeTaskOrderはソフト制約と見なされ、ソルバーは時間枠を使用して違反の数を最小限に抑えようと試みます。
ここでは、新しい順序を維持しようとするものの、未割り当てになるのではなく、制約に違反することになります。
- 指定された順序に反するものの、指定された時間枠内で
Job_1から開始します。 - できる限り順序を維持するよう試みて、最初に遂行すべき3番目のジョブに進みます。
- 最後に、
Job_2を訪問します。これは妥協案です。順序はできる限り保持されますが、未割り当てのジョブが犠牲になることはありません。この目的の方が重要であると指定されているためです。
ソリューションを参照してください。
{ "objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "optimizeTaskOrder"
},
{
"type": "minimizeCost"
}
],
"plan": {
"jobs": [
{
"id": "Job_1_1h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"times": [
[
"2023-09-20T08:00:00Z",
"2023-09-20T10:00:00Z"
]
],
"duration": 3600
}
],
"demand": [
1
],
"order": 3
}
]
}
},
{
"id": "Job_2_2h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"duration": 3600
}
],
"demand": [
1
],
"order": 2
}
]
}
},
{
"id": "Job_3_3h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"duration": 3600
}
],
"demand": [
1
],
"order":1
}
]
}
}
]
},
"fleet": {
"types": [
{
"id": "vehicle_1",
"profile": "normal_car",
"costs": {
"fixed": 22,
"distance": 0.0002,
"time": 0.0048
},
"shifts": [
{
"start": {
"time": "2023-09-20T08:00:00Z",
"location": {
"lat": 48.821421,
"lng": 12.931591
}
},
"end": {
"time": "2023-09-22T23:00:00Z",
"location": {
"lat": 50.912724,
"lng": 7.1055
}
}
}
],
"capacity": [
10
],
"amount": 1
}
],
"profiles": [
{
"name": "normal_car",
"type": "car",
"traffic": {
"mode": "disabled"
}
}
]
}
}ソリューション:時間枠付きのソフト制約としてのタスク順序
{
"statistic": {
"cost": 347.7036,
"distance": 751702,
"duration": 36534,
"times": {
"driving": 25734,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"time": {
"arrival": "2023-09-20T08:00:00Z",
"departure": "2023-09-20T08:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"time": {
"start": "2023-09-20T08:00:00Z",
"end": "2023-09-20T08:00:00Z"
}
}
],
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"distance": 0
},
{
"time": {
"arrival": "2023-09-20T08:50:15Z",
"departure": "2023-09-20T09:50:15Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_1_1h_driving",
"type": "pickup",
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"time": {
"start": "2023-09-20T08:50:15Z",
"end": "2023-09-20T09:50:15Z"
}
}
],
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"distance": 86277
},
{
"time": {
"arrival": "2023-09-20T11:29:23Z",
"departure": "2023-09-20T12:29:23Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_3_3h_driving",
"type": "pickup",
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"time": {
"start": "2023-09-20T11:29:23Z",
"end": "2023-09-20T12:29:23Z"
}
}
],
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"distance": 258526
},
{
"time": {
"arrival": "2023-09-20T13:35:50Z",
"departure": "2023-09-20T14:35:50Z"
},
"load": [
3
],
"activities": [
{
"jobId": "Job_2_2h_driving",
"type": "pickup",
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"time": {
"start": "2023-09-20T13:35:50Z",
"end": "2023-09-20T14:35:50Z"
}
}
],
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"distance": 366326
},
{
"time": {
"arrival": "2023-09-20T18:08:54Z",
"departure": "2023-09-20T18:08:54Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"time": {
"start": "2023-09-20T18:08:54Z",
"end": "2023-09-20T18:08:54Z"
}
}
],
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"distance": 751702
}
],
"statistic": {
"cost": 347.7036,
"distance": 751702,
"duration": 36534,
"times": {
"driving": 25734,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
問題:時間枠なしのソフト要件としてのタスク順序
この問題ではタスクの順序がソフト制約と見なされます。ソリューションでは時間枠を使用せずに違反の数を最小限に抑えようと試みます。
ここで、指定された時間枠内にJob_1を配達する必要はないと仮定します。この状況ではすべてのジョブを希望の順序で遂行できます。未割り当てになることはありません。したがって、タスクの順序をハード制約とソフト制約のどちらとして使用する場合でも、ジョブの順序は同じ、Job_3、Job_2、Job_1になります。
ソリューションを参照してください。
{ "objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "optimizeTaskOrder"
},
{
"type": "minimizeCost"
}
],
"plan": {
"jobs": [
{
"id": "Job_1_1h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"duration": 3600
}
],
"demand": [
1
],
"order": 3
}
]
}
},
{
"id": "Job_2_2h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"duration": 3600
}
],
"demand": [
1
],
"order": 2
}
]
}
},
{
"id": "Job_3_3h_driving",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"duration": 3600
}
],
"demand": [
1
],
"order":1
}
]
}
}
]
},
"fleet": {
"types": [
{
"id": "vehicle_1",
"profile": "normal_car",
"costs": {
"fixed": 22,
"distance": 0.0002,
"time": 0.0048
},
"shifts": [
{
"start": {
"time": "2023-09-20T08:00:00Z",
"location": {
"lat": 48.821421,
"lng": 12.931591
}
},
"end": {
"time": "2023-09-22T23:00:00Z",
"location": {
"lat": 50.912724,
"lng": 7.1055
}
}
}
],
"capacity": [
10
],
"amount": 1
}
],
"profiles": [
{
"name": "normal_car",
"type": "car",
"traffic": {
"mode": "disabled"
}
}
]
}
}ソリューション:時間枠なしのソフト要件としてのタスク順序
{
"statistic": {
"cost": 418.1166,
"distance": 945823,
"duration": 43115,
"times": {
"driving": 32315,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"time": {
"arrival": "2023-09-20T08:00:00Z",
"departure": "2023-09-20T08:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"time": {
"start": "2023-09-20T08:00:00Z",
"end": "2023-09-20T08:00:00Z"
}
}
],
"location": {
"lat": 48.821421,
"lng": 12.931591
},
"distance": 0
},
{
"time": {
"arrival": "2023-09-20T10:29:23Z",
"departure": "2023-09-20T11:29:23Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_3_3h_driving",
"type": "pickup",
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"time": {
"start": "2023-09-20T10:29:23Z",
"end": "2023-09-20T11:29:23Z"
}
}
],
"location": {
"lat": 49.785296,
"lng": 10.129362
},
"distance": 258526
},
{
"time": {
"arrival": "2023-09-20T12:35:50Z",
"departure": "2023-09-20T13:35:50Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_2_2h_driving",
"type": "pickup",
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"time": {
"start": "2023-09-20T12:35:50Z",
"end": "2023-09-20T13:35:50Z"
}
}
],
"location": {
"lat": 49.526849,
"lng": 11.066198
},
"distance": 366326
},
{
"time": {
"arrival": "2023-09-20T14:36:48Z",
"departure": "2023-09-20T15:36:48Z"
},
"load": [
3
],
"activities": [
{
"jobId": "Job_1_1h_driving",
"type": "pickup",
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"time": {
"start": "2023-09-20T14:36:48Z",
"end": "2023-09-20T15:36:48Z"
}
}
],
"location": {
"lat": 49.066063,
"lng": 11.917153
},
"distance": 472233
},
{
"time": {
"arrival": "2023-09-20T19:58:35Z",
"departure": "2023-09-20T19:58:35Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"time": {
"start": "2023-09-20T19:58:35Z",
"end": "2023-09-20T19:58:35Z"
}
}
],
"location": {
"lat": 50.912724,
"lng": 7.1055
},
"distance": 945823
}
],
"statistic": {
"cost": 418.1166,
"distance": 945823,
"duration": 43115,
"times": {
"driving": 32315,
"serving": 10800,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
車両のユースケースを最適化する
目的optimizeTourCountではソリューションのルートの数を最適化するために、車の使用を制御します。
この場合、集配センターは配達される2つのジョブの間にあります。
-
この例では積載量が2で固定コストのない同一の車両が2台あります。このため、配達に1台の車両を使用するか2台を使用するかに関係なく、時間と距離のみが考慮されます。
-
1台の車両を使用する場合、時間と所要時間の両方が長くなります。これは、最初のジョブを訪問し、次に2番目のジョブを訪問してから集配センターに戻る必要があるためです。
これはアクション属性optimizeTourCountとmaximizeを使用して、目的minimizeで実行できます。
action=maximizeの場合、両方の車両が使用されます。action=minimizeの場合は、両方のジョブに1台の車両のみが使用されます。
問題:optimizeTourCountを省略する
この問題は目的optimizeTourCountを使用せずに表現されます。
前述のように、特定の目的がない場合、optimizeTourCountはminimizeCostよりも高くなります。つまりデフォルトでは、コストが高くなるとしても、使用する車両は可能な限り少なくなります。
ソリューションを参照してください。
{
"fleet": {
"types": [
{
"profile": "vehicle",
"amount": 2,
"capacity": [
2
],
"costs": {
"distance": 5,
"time": 5,
"fixed": 0
},
"id": "vehicle_1",
"shifts": [
{
"start": {
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": "2023-11-30T08:00:00+01:00"
}
}
]
}
],
"profiles": [
{
"name": "vehicle",
"type": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "Job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55635,
"lng": 13.38465
}
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55162,
"lng": 13.43017
}
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション:optimizeTourCountを省略する
{
"statistic": {
"cost": 28475,
"distance": 4521,
"duration": 1174,
"times": {
"driving": 574,
"serving": 600,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_2",
"typeId": "vehicle_1",
"stops": [
{
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"arrival": "2023-11-30T07:00:00Z",
"departure": "2023-11-30T07:00:00Z"
},
"load": [
2
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"start": "2023-11-30T07:00:00Z",
"end": "2023-11-30T07:00:00Z"
}
}
],
"distance": 0
},
{
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"arrival": "2023-11-30T07:03:06Z",
"departure": "2023-11-30T07:08:06Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery",
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"start": "2023-11-30T07:03:06Z",
"end": "2023-11-30T07:08:06Z"
}
}
],
"distance": 1280
},
{
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"arrival": "2023-11-30T07:14:34Z",
"departure": "2023-11-30T07:19:34Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_1",
"type": "delivery",
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"start": "2023-11-30T07:14:34Z",
"end": "2023-11-30T07:19:34Z"
}
}
],
"distance": 4521
}
],
"statistic": {
"cost": 28475,
"distance": 4521,
"duration": 1174,
"times": {
"driving": 574,
"serving": 600,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}問題:optimizeTourCountを指定してすべての運行管理を使用する
目的を使用すると、この動作を変更できます。すべての運行管理を使用することを目的に設定すると、よりコストを抑えたソリューションを実現できます。両方の車両を使用し、それぞれの車両は集配センターを出発して1つのジョブのみを配達し、集配センターに戻ります。車両は最短の東西ルートを使用します。
注
ルートの数が増えるとコストが高くなる傾向にあるため、
"action": "maximize"に設定した目的optimizeTourCountを目的minimizeCostの上に配置して、効果が失われないようにします。
ソリューションを参照してください。
{
"objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "optimizeTourCount",
"action": "maximize"
},
{
"type": "minimizeCost"
}
],
"fleet": {
"types": [
{
"profile": "vehicle",
"amount": 2,
"capacity": [
2
],
"costs": {
"distance": 5,
"time": 5,
"fixed": 0
},
"id": "vehicle_1",
"shifts": [
{
"start": {
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": "2023-11-30T08:00:00+01:00"
}
}
]
}
],
"profiles": [
{
"name": "vehicle",
"type": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "Job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55635,
"lng": 13.38465
}
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55162,
"lng": 13.43017
}
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション:optimizeTourCountを指定してすべての運行管理を使用する
{
"statistic": {
"cost": 22315,
"distance": 3421,
"duration": 1042,
"times": {
"driving": 442,
"serving": 600,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_2",
"typeId": "vehicle_1",
"stops": [
{
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"arrival": "2023-11-30T07:00:00Z",
"departure": "2023-11-30T07:00:00Z"
},
"load": [
1
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"start": "2023-11-30T07:00:00Z",
"end": "2023-11-30T07:00:00Z"
}
}
],
"distance": 0
},
{
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"arrival": "2023-11-30T07:03:06Z",
"departure": "2023-11-30T07:08:06Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery",
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"start": "2023-11-30T07:03:06Z",
"end": "2023-11-30T07:08:06Z"
}
}
],
"distance": 1280
}
],
"statistic": {
"cost": 8830,
"distance": 1280,
"duration": 486,
"times": {
"driving": 186,
"serving": 300,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
},
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"arrival": "2023-11-30T07:00:00Z",
"departure": "2023-11-30T07:00:00Z"
},
"load": [
1
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"start": "2023-11-30T07:00:00Z",
"end": "2023-11-30T07:00:00Z"
}
}
],
"distance": 0
},
{
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"arrival": "2023-11-30T07:04:16Z",
"departure": "2023-11-30T07:09:16Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_1",
"type": "delivery",
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"start": "2023-11-30T07:04:16Z",
"end": "2023-11-30T07:09:16Z"
}
}
],
"distance": 2141
}
],
"statistic": {
"cost": 13485,
"distance": 2141,
"duration": 556,
"times": {
"driving": 256,
"serving": 300,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}問題:optimizeTourCountを指定して使用する車両の数を最小限に抑える
このソリューションでは使用する車両の数が最も少なくなります。minimizeCostでは多くの場合、このソリューションが選択されます。
optimizeTourCountを"action": "minimize"と一緒に明示的に使用すると、デフォルトと同じソリューションを得られます。ほとんどの場合、移動回数が減るとコスト削減につながります。
{
"objectives": [
{
"type": "minimizeUnassigned"
},
{
"type": "optimizeTourCount",
"action": "minimize"
},
{
"type": "minimizeCost"
}
],
"fleet": {
"types": [
{
"profile": "vehicle",
"amount": 2,
"capacity": [
2
],
"costs": {
"distance": 5,
"time": 5,
"fixed": 0
},
"id": "vehicle_1",
"shifts": [
{
"start": {
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": "2023-11-30T08:00:00+01:00"
}
}
]
}
],
"profiles": [
{
"name": "vehicle",
"type": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "Job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55635,
"lng": 13.38465
}
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"duration": 300,
"location": {
"lat": 52.55162,
"lng": 13.43017
}
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション:optimizeTourCountを指定して使用する車両の数を最小限に抑える
{
"statistic": {
"cost": 28475,
"distance": 4521,
"duration": 1174,
"times": {
"driving": 574,
"serving": 600,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"arrival": "2023-11-30T07:00:00Z",
"departure": "2023-11-30T07:00:00Z"
},
"load": [
2
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.55364,
"lng": 13.41467
},
"time": {
"start": "2023-11-30T07:00:00Z",
"end": "2023-11-30T07:00:00Z"
}
}
],
"distance": 0
},
{
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"arrival": "2023-11-30T07:03:06Z",
"departure": "2023-11-30T07:08:06Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery",
"location": {
"lat": 52.55162,
"lng": 13.43017
},
"time": {
"start": "2023-11-30T07:03:06Z",
"end": "2023-11-30T07:08:06Z"
}
}
],
"distance": 1280
},
{
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"arrival": "2023-11-30T07:14:34Z",
"departure": "2023-11-30T07:19:34Z"
},
"load": [
0
],
"activities": [
{
"jobId": "Job_1",
"type": "delivery",
"location": {
"lat": 52.55635,
"lng": 13.38465
},
"time": {
"start": "2023-11-30T07:14:34Z",
"end": "2023-11-30T07:19:34Z"
}
}
],
"distance": 4521
}
],
"statistic": {
"cost": 28475,
"distance": 4521,
"duration": 1174,
"times": {
"driving": 574,
"serving": 600,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}26 日前の更新