代替位置を使用する
Tour Planningの別のフィーチャーとしてジョブに代替位置を設定することで、さらに有利な旅程最適化を実現できます。つまり、ツアーを最適化するときに、ジョブの実行時間だけでなく、同じジョブに指定された別の場所も考慮されます。代替場所を追加することで、注文を受け取る場所の観点から顧客に提供できる柔軟性が向上します。また、ジョブの割り当てやツアーの効率が改善される可能性が高まります。
1日の特定の時間枠に配達を受け取ることができる顧客がいるとします。午前中は自宅住所で受け取り、日中は勤務先住所で受け取り、午後は再び自宅住所またはその他の希望する場所で受け取れるようにします。代替場所を使用すると、これらの制約をすべて考慮して、適切な時間に適切な場所を訪問できます。
代替場所を使用できるもう1つの状況としては、何らかの理由で顧客の場所に到達できない場合や、指定された時間枠に顧客と連絡が取れない場合があります。その場合、ディスパッチャは、そのジョブに近くの集荷場所を追加できます。これにより、少なくとも配達はできるため、顧客は都合のよい時間に商品を受け取ることができ、ドライバーはそのジョブをキャンセルまたは延期する必要がなくなります。
次の簡単な例で、特定のシフト時間 (8:00~21:00) の車両が、2つのジョブ (1つの集荷と1つの配達) を実行するという問題を考えてみましょう。この例では、各ジョブにはそれぞれ異なる時間枠と異なる場所が設定されています。ジョブの時間枠は通常どおりに指定しますが、代替場所を考慮するために、ジョブごとに別の場所を追加で指定します。
ソリューションを読みやすくするために、場所にタグを使用することもできます。この例では、代替場所として[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"
}
],
"distance": 0
},
{
"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"
}
],
"distance": 4592
},
{
"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"
}
],
"distance": 14568
},
{
"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"
}
],
"distance": 27697
}
],
"statistic": {
"cost": 98.11200000000001,
"distance": 27697,
"duration": 10906,
"times": {
"driving": 3012,
"serving": 2300,
"waiting": 5594,
"break": 0
}
},
"shiftIndex": 0
}
]
}次のステップ
詳細については、以下を参照してください。
- Submit a Vehicle Routing Problem to solve it synchronously (車両ルート検索問題を送信して同期的に解決する)
- Submit a Vehicle Routing Problem to solve it asynchronously (車両ルート検索問題を送信して非同期的に解決する)
26 日前の更新