複数の再積載地点を有効にする
車両の積載量には限りがあるため、1回の旅程ですべての商品を配送できない場合があります。したがって、シフト時間が許せば、より多くの商品を配達できるようにするために、車両は複数回のツアーを必要とする場合があります。reloads機能を使用すると、前回のツアーのすべてのタスクが完了した後、車両が集配センター (またはその他の場所) に戻り、さらにアイテムを受け取ることができます。
このユースケースの最も単純な例は、特定の積載量の車両と、その積載量を超える総需要のあるジョブがある場合です。車両の積載量に合わないジョブの一部はツアーに割り当てられないことが予想されます。したがって、車両の積載量を増やしたり車両を追加したりする機会はないものの、それでも既存の車両でツアーを完了する必要がある場合は、前のタスクが完了した後で車両がさらに商品を追加できるようにする再積載オプションを問題制約に追加する必要があります。再積載は、出発集配センター、配達場所または集荷場所、またはその他の場所など、さまざまな場所で行うことができます。次のように、再積載を行う正確なlocationとそのdurationとともに、再積載オプションを問題のfleet部分に追加する必要があります。
"reloads":[
{
"location":{
"lat": 52.530976,
"lng": 13.384916
},
"duration":60
},
{
"location":{
"lat": 52.530976,
"lng": 13.384916
},
"duration":60
},
]車両の積載量がジョブの総需要 (積載量 - 3、需要 - 5) よりも小さい、つまり需要が車両の積載量を超えている単純な状況を考えてみましょう。このケースについては、このドキュメントの「容量制約付き配送計画問題を解決する」セクションで確認できます。前述の例の車両が旅程を完了できるように、問題にreloadsオプションを追加しましょう。以下の問題の例では、車両がツアーを開始したのと同じ場所にreloadsを追加しました。
問題
{
"fleet": {
"types": [
{
"id": "e429c9c1e6df",
"profile": "car_bd5be9a38474",
"costs": {
"fixed": 6.0,
"distance": 0.002,
"time": 0.007
},
"shifts": [
{
"start": {
"time": "2022-06-01T08:05:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2022-06-01T18:05:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"reloads": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"duration": 60
}
]
}
],
"capacity": [
3
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_bd5be9a38474"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T14:05:00Z",
"2022-06-01T18:05:00Z"
]
],
"location": {
"lat": 52.44664947511696,
"lng": 13.484988905387555
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.632489506294235,
"lng": 13.341605471791963
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T12:05:00Z"
]
],
"location": {
"lat": 52.577856866026835,
"lng": 13.423782100910442
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_5",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション
以下のソリューションから、3つのジョブを遂行し、その積載量をすべて使用した後、車両は再積載場所 (このケースでは開始集配センター) に向かい、その後、ツアーに残っている最後のジョブを遂行することがわかります。
{
"statistic": {
"cost": 273.482,
"distance": 92161,
"duration": 11880,
"times": {
"driving": 9568,
"serving": 1560,
"waiting": 752,
"break": 0
}
},
"tours": [
{
"vehicleId": "e429c9c1e6df_1",
"typeId": "e429c9c1e6df",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T08:05:00Z",
"departure": "2022-06-01T11:20:56Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 52.577856866026835,
"lng": 13.423782100910442
},
"time": {
"arrival": "2022-06-01T11:38:11Z",
"departure": "2022-06-01T11:43:11Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_4",
"type": "pickup"
}
],
"distance": 16100
},
{
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"time": {
"arrival": "2022-06-01T11:57:43Z",
"departure": "2022-06-01T12:07:43Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_3",
"type": "pickup",
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"time": {
"start": "2022-06-01T11:57:43Z",
"end": "2022-06-01T12:02:43Z"
}
},
{
"jobId": "job_5",
"type": "pickup",
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"time": {
"start": "2022-06-01T12:02:43Z",
"end": "2022-06-01T12:07:43Z"
}
}
],
"distance": 27415
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T12:32:18Z",
"departure": "2022-06-01T12:33:18Z"
},
"load": [
0
],
"activities": [
{
"jobId": "reload",
"type": "reload"
}
],
"distance": 36817
},
{
"location": {
"lat": 52.632489506294235,
"lng": 13.341605471791963
},
"time": {
"arrival": "2022-06-01T13:05:00Z",
"departure": "2022-06-01T13:10:00Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_2",
"type": "pickup"
}
],
"distance": 44396
},
{
"location": {
"lat": 52.44664947511696,
"lng": 13.484988905387556
},
"time": {
"arrival": "2022-06-01T13:52:28Z",
"departure": "2022-06-01T14:10:00Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_1",
"type": "pickup"
}
],
"distance": 65595
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T14:38:56Z",
"departure": "2022-06-01T14:38:56Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 82587
}
],
"statistic": {
"cost": 273.482,
"distance": 92161,
"duration": 11880,
"times": {
"driving": 9568,
"serving": 1560,
"waiting": 752,
"break": 0
}
},
"shiftIndex": 0
}
]
}これが基本的なreloadsオプションの仕組みですが、場合によっては、再積載を使用するときに他の制約を考慮する必要があります。以下では、複数の再積載があり、さらに再積載が集配センターの場所以外でも行われるサンプル問題を構築してみましょう。さらに、再積載場所は日中の特定の時間帯しか利用できないため、再積載の時間枠も考慮する必要があります。
Tour Planningでは、車両シフトごとに最大5つのreloadsを追加できます。各reloadsに異なるlocation、duration、timesを設定できます (任意)。
以下の例でも、需要が積載量を超える(積載量が5に対してジョブ需要が7)だけでなく、再積載に特定の時間帯がある状況であり、これを車両シフト時間の制約に追加します。また、積載量には集配センターだけでなく、任意の場所を追加できます。したがって、この例では、積載量の1つは車両の出発場所 (集配センター) で行われ、もう1つはジョブの場所の1つで行われます。
問題
{
"fleet": {
"types": [
{
"id": "e429c9c1e6df",
"profile": "car_bd5be9a38474",
"costs": {
"fixed": 6.0,
"distance": 0.002,
"time": 0.007
},
"shifts": [
{
"start": {
"time": "2022-06-01T08:05:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2022-06-01T18:05:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"reloads": [
{
"times": [
[
"2022-06-01T09:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"duration": 60
},
{
"times": [
[
"2022-06-01T13:05:00Z",
"2022-06-01T18:05:00Z"
]
],
"location": {
"lat": 52.57541509905306,
"lng": 13.409878314747719
},
"duration": 60
}
]
}
],
"capacity": [
5
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car_bd5be9a38474"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T09:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.44664947511696,
"lng": 13.484988905387555
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.632489506294235,
"lng": 13.341605471791963
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T12:05:00Z"
]
],
"location": {
"lat": 52.577856866026835,
"lng": 13.423782100910442
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_5",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T09:05:00Z",
"2022-06-01T14:05:00Z"
]
],
"location": {
"lat": 52.57541509905306,
"lng": 13.409878314747719
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_6",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T09:05:00Z",
"2022-06-01T14:05:00Z"
]
],
"location": {
"lat": 52.486595664301646,
"lng": 13.423728674699783
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_7",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2022-06-01T08:05:00Z",
"2022-06-01T13:05:00Z"
]
],
"location": {
"lat": 52.471783668934606,
"lng": 13.469038314828833
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション
以下のソリューションから、車両はjob_2、job_3、job_6、job_1、job_7を処理してから、指定された時間枠内に集配センターで再積載を行い、その後job_5とjob_4を処理することがわかります。
{
"statistic": {
"cost": 260.9809999999999,
"distance": 81441,
"duration": 13157,
"times": {
"driving": 10997,
"serving": 2160,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "e429c9c1e6df_1",
"typeId": "e429c9c1e6df",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T08:05:00Z",
"departure": "2022-06-01T08:05:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 52.632489506294235,
"lng": 13.341605471791963
},
"time": {
"arrival": "2022-06-01T08:36:42Z",
"departure": "2022-06-01T08:41:42Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_2",
"type": "pickup"
}
],
"distance": 6640
},
{
"location": {
"lat": 52.5983459422347,
"lng": 13.392007658723308
},
"time": {
"arrival": "2022-06-01T09:05:56Z",
"departure": "2022-06-01T09:10:56Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_3",
"type": "pickup"
}
],
"distance": 8022
},
{
"location": {
"lat": 52.486595664301646,
"lng": 13.423728674699785
},
"time": {
"arrival": "2022-06-01T09:49:34Z",
"departure": "2022-06-01T09:54:34Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_6",
"type": "pickup"
}
],
"distance": 24199
},
{
"location": {
"lat": 52.44664947511696,
"lng": 13.484988905387556
},
"time": {
"arrival": "2022-06-01T10:10:22Z",
"departure": "2022-06-01T10:15:22Z"
},
"load": [
4
],
"activities": [
{
"jobId": "job_1",
"type": "pickup"
}
],
"distance": 29363
},
{
"location": {
"lat": 52.471783668934606,
"lng": 13.469038314828833
},
"time": {
"arrival": "2022-06-01T10:24:23Z",
"departure": "2022-06-01T10:29:23Z"
},
"load": [
5
],
"activities": [
{
"jobId": "job_7",
"type": "pickup"
}
],
"distance": 37457
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T10:56:26Z",
"departure": "2022-06-01T10:57:26Z"
},
"load": [
0
],
"activities": [
{
"jobId": "reload",
"type": "reload"
}
],
"distance": 45849
},
{
"location": {
"lat": 52.57541509905306,
"lng": 13.40987831474772
},
"time": {
"arrival": "2022-06-01T11:12:34Z",
"departure": "2022-06-01T11:17:34Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_5",
"type": "pickup"
}
],
"distance": 61949
},
{
"location": {
"lat": 52.577856866026835,
"lng": 13.423782100910442
},
"time": {
"arrival": "2022-06-01T11:21:24Z",
"departure": "2022-06-01T11:26:24Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_4",
"type": "pickup"
}
],
"distance": 73264
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-06-01T11:44:17Z",
"departure": "2022-06-01T11:44:17Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 82666
}
],
"statistic": {
"cost": 260.9809999999999,
"distance": 81441,
"duration": 13157,
"times": {
"driving": 10997,
"serving": 2160,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}次のステップ
詳細については、以下を参照してください。
- Submit a Vehicle Routing Problem to solve it synchronously (車両ルート検索問題を送信して同期的に解決する)
- Submit a Vehicle Routing Problem to solve it asynchronously (車両ルート検索問題を送信して非同期的に解決する)
26 日前の更新