代替場所を含むVRP
別のツアープランニングフィーチャを使用すると、ジョブの代替場所を設定することで、ツアーの最適化をさらに有利に進めることができます。 つまり、配達を最適化するときに、ジョブの実行にかかる特定の時間だけでなく、同じジョブに指定されている別の場所も考慮されます。 代替の場所を追加すると、注文を処理できる場所に関して顧客の柔軟性が高まります。また、作業割り当ての改善や効率的なツアーの可能性も向上します。
1 日の特定の時間帯に配達を受け取ることができる顧客がいるとします。 午前中にHomeの住所で受け取り、日中は、Workの住所に配達でき、午後は、Homeの住所または任意の場所で受け取ることができます。 別の場所を使用すると、これらの制約をすべて考慮して、適切な時間に適切な場所を訪問できます。
代替場所を使用できるもう一つの状況としては、何らかの理由で顧客の場所に到達できない場合、または指定した時間帯にその場所に顧客が到達できない場合があります。 ディスパッチャーは、少なくとも配達がまだ発生し、顧客が他の適切な時間にアイテムを受け取ることができるように、これらのジョブの近くの集荷場所を追加できます。ドライバーは、これらのジョブをキャンセルしたり、延期したりする必要はありません。
以下の簡単な例では、 8 時から 21 時までの特定のシフト時間の車両と、実行する 2 つのジョブ(集荷 1 つと配達 1 つ)がある場合に問題があると考えています。 ここでは、 2 つの異なる時間帯と、それぞれのジョブに 2 つの異なる場所を使用しています。 ジョブの時間帯は通常の方法で指定しますが、代替場所を考慮するために、ジョブごとに別の場所を指定します。
また、ソリューションをより簡単に読み取ることができるように、タグを使用して場所を指定することもできます。 この例では、代替の場所として「 Home 」と「 Work 」を指定していますが、選択した他のタグを使用できます。
この例の問題は次のようになります。
{
"fleet": {
"types": [
{
"id": "Vehicle_1",
"profile": "car",
"costs": {
"fixed": 10.0,
"distance": 0.002,
"time": 0.003
},
"shifts": [
{
"start": {
"time": "2021-10-23T08:00:00Z",
"location": {
"lat": 52.5163527,
"lng": 13.3779290
}
},
"end": {
"time": "2021-10-23T21:00:00Z",
"location": {
"lat": 52.5163527,
"lng": 13.3779290
}
}
}
],
"capacity": [
10
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "Job_1",
"tasks": {
"pickups": [
{
"places": [
{
"times": [
[
"2021-10-23T08:30:00Z",
"2021-10-23T09:00:00Z"
]
],
"location": {
"lat": 52.5154509,
"lng": 13.4216700
},
"duration": 1150,
"tag": "Home"
},
{
"times": [
[
"2021-10-23T10:00:00Z",
"2021-10-23T19:00:00Z"
]
],
"location": {
"lat": 52.6834366,
"lng": 13.2781471
},
"duration": 1150,
"tag": "Work"
}
],
"demand": [
1
]
}
]
}
},
{
"id": "Job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-10-23T08:00:00Z",
"2021-10-23T10:30:00Z"
]
],
"location": {
"lat": 52.4583508,
"lng": 13.5787622
},
"duration": 1150,
"tag": "Home"
},
{
"times": [
[
"2021-10-23T11:10:00Z",
"2021-10-23T18:30:00Z"
]
],
"location": {
"lat": 52.4939523,
"lng": 13.5397955
},
"duration": 1150,
"tag": "Work"
}
],
"demand": [
1
]
}
]
}
}
]
}
}
このような問題の解決策は次のとおりです。 この簡単な例から、合計コスト、距離などのすべての統計情報を取得できます。 最初の集荷ジョブが「Home」の場所で実行され、 2 番目の配達ジョブが「Work」の場所で実行されるように、配達が最適化されたことがわかります。これは、作業時間の窓と場所、車両のシフト時間によって異なります。
{
"statistic": {
"cost": 98.11200000000001,
"distance": 27697,
"duration": 10906,
"times": {
"driving": 3012,
"serving": 2300,
"waiting": 5594,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.5163527,
"lng": 13.377929
},
"time": {
"arrival": "2021-10-23T08:00:00Z",
"departure": "2021-10-23T08:50:21Z"
},
"load": [
1
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.5154509,
"lng": 13.42167
},
"time": {
"arrival": "2021-10-23T09:00:00Z",
"departure": "2021-10-23T09:19:10Z"
},
"load": [
2
],
"activities": [
{
"jobId": "Job_1",
"type": "pickup",
"jobTag": "Home"
}
]
},
{
"location": {
"lat": 52.4939523,
"lng": 13.5397955
},
"time": {
"arrival": "2021-10-23T09:36:46Z",
"departure": "2021-10-23T11:29:10Z"
},
"load": [
1
],
"activities": [
{
"jobId": "Job_2",
"type": "delivery",
"jobTag": "Work"
}
]
},
{
"location": {
"lat": 52.5163527,
"lng": 13.377929
},
"time": {
"arrival": "2021-10-23T11:52:07Z",
"departure": "2021-10-23T11:52:07Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 98.11200000000001,
"distance": 27697,
"duration": 10906,
"times": {
"driving": 3012,
"serving": 2300,
"waiting": 5594,
"break": 0
}
},
"shiftIndex": 0
}
]
}