最大距離を制限する
一部の特定のタイプの車両、特に電気自動車でVRPを解決する場合、最大距離が重要な制約になります。集配センターでEVを扱うときは、車両のタイプによっては蓄電量が限られているため、フル充電状態から次の充電スタンドまで限られた最大距離を走行できることを想定する必要があります。そのため、電気自動車のVRPを解決するときには、車両の最大距離と充電スタンドの位置を考慮する必要があります。
問題
同じ集配センター内でシフトの開始と終了を行い、1回のフル充電で最大200kmの距離を走行できる電気自動車がある場合の問題を考えてみましょう。これらの制約を設定するには、maxDistanceパラメーターを制限に追加し、最大距離をメートル単位で指定する必要があります。
その後、いつものように位置と需要を伴うジョブを追加して問題を設定しますが、問題はmaxDistanceなどの車両の制限を考慮して解決されます。そのため、それらの制限により実行できないジョブは実行されません。最大走行距離が200kmのEVと、さまざまな場所でのいくつかの配達ジョブを使用して、このような問題を解決してみましょう。
Click to expand/collapse the sample JSON
{
"fleet": {
"types": [
{
"id": "Vehicle_1",
"profile": "car",
"costs": {
"fixed": 7.0,
"distance": 0.003,
"time": 0.007
},
"shifts": [
{
"start": {
"time": "2021-05-10T09:00:00Z",
"location": {
"lat": 52.57222054041576,
"lng": 13.353990529709701
}
},
"end": {
"time": "2021-05-10T21:01:00Z",
"location": {
"lat": 52.57222054041576,
"lng": 13.353990529709701
}
}
}
],
"capacity": [
12
],
"limits": {
"maxDistance": 200000
},
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "car"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T12:00:00Z",
"2021-05-10T12:30:00Z"
]
],
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328511
},
"duration": 180
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T09:30:00Z",
"2021-05-10T10:00:00Z"
]
],
"location": {
"lat": 52.48262965703328,
"lng": 13.306346002296653
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T10:00:00Z",
"2021-05-10T10:30:00Z"
]
],
"location": {
"lat": 52.48262965703328,
"lng": 13.306346002296653
},
"duration": 60
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T10:30:00Z",
"2021-05-10T11:00:00Z"
]
],
"location": {
"lat": 52.52013955092772,
"lng": 13.332585890518219
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_5",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T11:00:00Z",
"2021-05-10T11:30:00Z"
]
],
"location": {
"lat": 52.52013955092772,
"lng": 13.332585890518219
},
"duration": 720
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_6",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T11:30:00Z",
"2021-05-10T12:00:00Z"
]
],
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328512
},
"duration": 720
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_7",
"tasks": {
"deliveries": [
{
"places": [
{
"times": [
[
"2021-05-10T12:00:00Z",
"2021-05-10T12:30:00Z"
]
],
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328511
},
"duration": 720
}
],
"demand": [
1
]
}
]
}
}
]
}
}ソリューション
この問題のソリューションは次のようになります。
Click to expand/collapse the sample JSON
{
"statistic": {
"cost": 217.291,
"distance": 45387,
"duration": 10590,
"times": {
"driving": 4181,
"serving": 3000,
"waiting": 3409,
"break": 0
}
},
"tours": [
{
"vehicleId": "Vehicle_1_1",
"typeId": "Vehicle_1",
"stops": [
{
"location": {
"lat": 52.57222054041576,
"lng": 13.3539905297097
},
"time": {
"arrival": "2021-05-10T09:00:00Z",
"departure": "2021-05-10T09:42:00Z"
},
"load": [
7
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
],
"distance": 0
},
{
"location": {
"lat": 52.48262965703328,
"lng": 13.306346002296651
},
"time": {
"arrival": "2021-05-10T10:00:00Z",
"departure": "2021-05-10T10:06:00Z"
},
"load": [
5
],
"activities": [
{
"jobId": "job_2",
"type": "delivery",
"location": {
"lat": 52.48262965703328,
"lng": 13.306346002296651
},
"time": {
"start": "2021-05-10T10:00:00Z",
"end": "2021-05-10T10:05:00Z"
}
},
{
"jobId": "job_3",
"type": "delivery",
"location": {
"lat": 52.48262965703328,
"lng": 13.306346002296651
},
"time": {
"start": "2021-05-10T10:05:00Z",
"end": "2021-05-10T10:06:00Z"
}
}
],
"distance": 13742
},
{
"location": {
"lat": 52.52013955092772,
"lng": 13.33258589051822
},
"time": {
"arrival": "2021-05-10T10:20:57Z",
"departure": "2021-05-10T11:12:00Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_4",
"type": "delivery",
"location": {
"lat": 52.52013955092772,
"lng": 13.33258589051822
},
"time": {
"start": "2021-05-10T10:20:57Z",
"end": "2021-05-10T10:35:00Z"
}
},
{
"jobId": "job_5",
"type": "delivery",
"location": {
"lat": 52.52013955092772,
"lng": 13.33258589051822
},
"time": {
"start": "2021-05-10T10:35:00Z",
"end": "2021-05-10T11:12:00Z"
}
}
],
"distance": 21047
},
{
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328512
},
"time": {
"arrival": "2021-05-10T11:25:14Z",
"departure": "2021-05-10T11:42:00Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_6",
"type": "delivery"
}
],
"distance": 27784
},
{
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328511
},
"time": {
"arrival": "2021-05-10T11:42:00Z",
"departure": "2021-05-10T12:15:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_1",
"type": "delivery",
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328511
},
"time": {
"start": "2021-05-10T11:42:00Z",
"end": "2021-05-10T12:03:00Z"
}
},
{
"jobId": "job_7",
"type": "delivery",
"location": {
"lat": 52.471480179496325,
"lng": 13.33652317328511
},
"time": {
"start": "2021-05-10T12:03:00Z",
"end": "2021-05-10T12:15:00Z"
}
}
],
"distance": 27784
},
{
"location": {
"lat": 52.57222054041576,
"lng": 13.3539905297097
},
"time": {
"arrival": "2021-05-10T12:38:30Z",
"departure": "2021-05-10T12:38:30Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
],
"distance": 45390
}
],
"statistic": {
"cost": 217.291,
"distance": 45387,
"duration": 10590,
"times": {
"driving": 4181,
"serving": 3000,
"waiting": 3409,
"break": 0
}
}
}
]
}このソリューションの統計から、指定された制約に関する車両の総コスト、距離、所要時間の他、配達、サービス、待機にかかる時間を確認できます。
次のステップ
- 詳細については、次の記事を参照してください。
- Submit a Vehicle Routing Problem to solve it synchronously (車両ルート検索問題を送信して同期的に解決する)
- Submit a Vehicle Routing Problem to solve it asynchronously (車両ルート検索問題を送信して非同期的に解決する)
- 他の制限タイプについて詳しくは、「ルート制限を設定する」を参照してください。
26 日前の更新