道路の側設定でルートを最適化する
sideOfStreetHintでは、特定の場所を訪問する際に、ドライバーが駐車時に優先すべき道路の側を指定でき、停車時の不要、非効率、あるいは危険な道路横断を回避できます。これは、インフラ設備の保守、郵便配達、ごみ収集などのシナリオで特に有効であり、車両が道路の一方の側での停車を完了してから反対側に移動する方が、実用的で安全です。
この機能は、サービスエリア (たとえば人口密度の高い都市中心部) に、中央分離帯のある大通りや複数車線の幹線道路といった分離された道路が含まれる場合に重要な役割を果たします。sideOfStreetHintを使用すると、わずかに距離を短縮するために車両が不要な方向転換を行ったり、車線をまたぐジグザグ走行したりする必要性を減らせます。
次の図は、双方向道路の道路沿いで停車地点に対応する際に、sideOfStreetHint機能の想定される適用例を視覚的に示しています。
左側のソリューションは、より効率的になる可能性はあるものの、車両が目的のジョブの位置とは反対側の道路で停車するか、対向車線を横切る必要がある停車順を示しています (停車地2および5)。
右側のソリューションは、車両が道路の対応する側でジョブを処理し、横断や車線をまたぐジグザグ走行を行う必要がない停車順を示しています。これは、ごみ収集、設備保守、郵便サービスなどでは有効な場合があります。
道路側ヒントの仕組み
sideOfStreetHintはジョブplaces配列内のlocationオブジェクトの一部であり、次のコンポーネントを含みます。
- 優先する道路の側の地点を示す
latおよびlng座標です。このモデルは、移動方向に関係なく、明確な地理的参照を提供します。 matchSideOfStreetパラメーターには次のオプションがあります。always:この設定は、すべての道路タイプで道路の側の優先指定を厳密に適用します。たとえば、道路状況に関係なく車両を常に特定の側に駐車させる必要がある場合や、総走行距離や所要時間を増やしてでも、狭い道路で潜在的に危険な操作を最小限に抑えたい場合に、この設定を使用できます。onlyIfDivided:この設定は分離された道路に限り道路の側の指定を適用します。これは、車線が白線で区切られている道路や、芝生、コンクリート、路面標示で区切られた領域などの物理的な仕切りで分けられている道路です。たとえば、主要な交通の流れを横切ることを避けつつ、より柔軟なルーティングを行いたい場合に、この設定を使用できます。
次のスニペットは、sideOfStreetHintを含むサンプルのジョブ設定を示しています。
{
"location": {
"lat": 52.53643,
"lng": 13.40718,
"sideOfStreetHint": {
"lat": 52.53643,
"lng": 13.40718,
"matchSideOfStreet": "always"
}
},
"duration": 300
}注
ジョブに
sideOfStreetHintを設定する際は、次の点に留意してください。
- 同じ座標にあるすべてのジョブは、同じ
sideOfStreetHint属性にする必要があります。- 最適化アルゴリズムが道路の側の指定を考慮するようにするには、次のいずれかの方法で
sideOfStreetHint座標を設定します。
- シンプルな方法:道路の側を指定する座標をジョブの
location座標と同一に設定する- 正確な方法:道路の向きに基づいて、道路に対して垂直方向に10〜20メートルずらした座標を算出する
シンプルな方法はほとんどのシナリオで有効に機能し、正確な方法は複雑な道路形状でより明確に道路の側を示します。
例:道路の側の最適化を考慮したごみ収集
次のセクションでは、ベルリンの中央分離帯のある大通りに沿ってごみ収集車がごみ箱を回収する簡略化されたシナリオを示します。このシナリオでは、ごみ収集車は道路の両側に配置された8つのごみ箱 (東側4つ、西側4つ) を回収する必要があります。重量のあるごみ箱を扱いながら交通量の多い中央分離帯のある道路を横断することは重大な安全リスクとなります。そのため、最適なソリューションでは、ドライバーを保護するためにこうした横断を最小限に抑える必要があります。
道路側ヒントなしの問題
最初の問題では、sideOfStreetHintを設定しないごみ回収ジョブを定義します。各ジョブには、基本の位置 (lat/lng) と300秒のサービス時間のみが含まれます。最適化アルゴリズムは、未割り当てジョブとツアーコストの最小化を優先するデフォルトのツアー目標を使用します。これらの目標には道路横断時の安全性が考慮されていないため、割り当てを完了するために車両が道路をジグザグに横切る可能性があります。
問題JSON全体については、次のセクションを参照してください。
Click to expand/collapse the sample JSON
{
"fleet": {
"types": [
{
"id": "garbage_truck",
"profile": "truck_profile",
"costs": {
"distance": 0.0002,
"time": 0.005,
"fixed": 100
},
"shifts": [
{
"start": {
"time": "2024-12-04T06:00:00Z",
"location": {
"lat": 52.53567,
"lng": 13.40641
}
},
"end": {
"time": "2024-12-04T14:00:00Z",
"location": {
"lat": 52.53567,
"lng": 13.40641
}
}
}
],
"capacity": [100],
"amount": 1
}
],
"profiles": [
{
"name": "truck_profile",
"type": "truck"
}
]
},
"plan": {
"jobs": [
{
"id": "east_1",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.536,
"lng": 13.40731
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_1",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53643,
"lng": 13.40718
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_2",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53668,
"lng": 13.40802
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_2",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53758,
"lng": 13.40839
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_3",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.5379,
"lng": 13.4093
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_3",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53902,
"lng": 13.40991
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_4",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53944,
"lng": 13.41036
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_4",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53967,
"lng": 13.41118
},
"duration": 300
}
],
"demand": [1]
}
]
}
}
]
}
}道路側ヒントなしのソリューション
生成されたソリューションでは、次の停車順となります。
east_2 → east_4 → west_4 → west_3 → east_3 → west_2 → west_1 → east_1
車両は東側から西側 (west_4) に移る際に一度、中央分離帯のある道路を横断する必要があります。しかし最適化アルゴリズムは、その後個別の停車地 (east_3およびeast_1) に対応するために、残りの西側の収集の前にさらに2回道路を横断するルートを選択します。このような不要な経路途中の横断は、ドライバーが重量のあるごみ箱を扱いながら交通量の多い道路を何度も行き来することになり、重大な安全リスクを生じさせます。次の図は、この非効率なソリューションを視覚化し、ジグザグのパターンを強調表示しています。
Click to expand/collapse the sample JSON
{
"statistic": {
"cost": 112.8096,
"distance": 1098,
"duration": 2518,
"times": {
"driving": 118,
"serving": 2400,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "garbage_truck_1",
"typeId": "garbage_truck",
"stops": [
{
"time": {
"arrival": "2024-12-04T06:00:00Z",
"departure": "2024-12-04T06:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"time": {
"start": "2024-12-04T06:00:00Z",
"end": "2024-12-04T06:00:00Z"
}
}
],
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"distance": 0
},
{
"time": {
"arrival": "2024-12-04T06:00:16Z",
"departure": "2024-12-04T06:05:16Z"
},
"load": [
1
],
"activities": [
{
"jobId": "east_2",
"type": "pickup",
"location": {
"lat": 52.53668,
"lng": 13.40802
},
"time": {
"start": "2024-12-04T06:00:16Z",
"end": "2024-12-04T06:05:16Z"
}
}
],
"location": {
"lat": 52.53668,
"lng": 13.40802
},
"distance": 153
},
{
"time": {
"arrival": "2024-12-04T06:05:57Z",
"departure": "2024-12-04T06:10:57Z"
},
"load": [
2
],
"activities": [
{
"jobId": "east_4",
"type": "pickup",
"location": {
"lat": 52.53967,
"lng": 13.41118
},
"time": {
"start": "2024-12-04T06:05:57Z",
"end": "2024-12-04T06:10:57Z"
}
}
],
"location": {
"lat": 52.53967,
"lng": 13.41118
},
"distance": 549
},
{
"time": {
"arrival": "2024-12-04T06:11:03Z",
"departure": "2024-12-04T06:16:03Z"
},
"load": [
3
],
"activities": [
{
"jobId": "west_4",
"type": "pickup",
"location": {
"lat": 52.53944,
"lng": 13.41036
},
"time": {
"start": "2024-12-04T06:11:03Z",
"end": "2024-12-04T06:16:03Z"
}
}
],
"location": {
"lat": 52.53944,
"lng": 13.41036
},
"distance": 601
},
{
"time": {
"arrival": "2024-12-04T06:16:10Z",
"departure": "2024-12-04T06:21:10Z"
},
"load": [
4
],
"activities": [
{
"jobId": "west_3",
"type": "pickup",
"location": {
"lat": 52.53902,
"lng": 13.40991
},
"time": {
"start": "2024-12-04T06:16:10Z",
"end": "2024-12-04T06:21:10Z"
}
}
],
"location": {
"lat": 52.53902,
"lng": 13.40991
},
"distance": 657
},
{
"time": {
"arrival": "2024-12-04T06:21:24Z",
"departure": "2024-12-04T06:26:24Z"
},
"load": [
5
],
"activities": [
{
"jobId": "east_3",
"type": "pickup",
"location": {
"lat": 52.5379,
"lng": 13.4093
},
"time": {
"start": "2024-12-04T06:21:24Z",
"end": "2024-12-04T06:26:24Z"
}
}
],
"location": {
"lat": 52.5379,
"lng": 13.4093
},
"distance": 785
},
{
"time": {
"arrival": "2024-12-04T06:26:30Z",
"departure": "2024-12-04T06:31:30Z"
},
"load": [
6
],
"activities": [
{
"jobId": "west_2",
"type": "pickup",
"location": {
"lat": 52.53758,
"lng": 13.40839
},
"time": {
"start": "2024-12-04T06:26:30Z",
"end": "2024-12-04T06:31:30Z"
}
}
],
"location": {
"lat": 52.53758,
"lng": 13.40839
},
"distance": 848
},
{
"time": {
"arrival": "2024-12-04T06:31:45Z",
"departure": "2024-12-04T06:36:45Z"
},
"load": [
7
],
"activities": [
{
"jobId": "west_1",
"type": "pickup",
"location": {
"lat": 52.53643,
"lng": 13.40718
},
"time": {
"start": "2024-12-04T06:31:45Z",
"end": "2024-12-04T06:36:45Z"
}
}
],
"location": {
"lat": 52.53643,
"lng": 13.40718
},
"distance": 1000
},
{
"time": {
"arrival": "2024-12-04T06:36:49Z",
"departure": "2024-12-04T06:41:49Z"
},
"load": [
8
],
"activities": [
{
"jobId": "east_1",
"type": "pickup",
"location": {
"lat": 52.536,
"lng": 13.40731
},
"time": {
"start": "2024-12-04T06:36:49Z",
"end": "2024-12-04T06:41:49Z"
}
}
],
"location": {
"lat": 52.536,
"lng": 13.40731
},
"distance": 1035
},
{
"time": {
"arrival": "2024-12-04T06:41:58Z",
"departure": "2024-12-04T06:41:58Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"time": {
"start": "2024-12-04T06:41:58Z",
"end": "2024-12-04T06:41:58Z"
}
}
],
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"distance": 1098
}
],
"statistic": {
"cost": 112.8096,
"distance": 1098,
"duration": 2518,
"times": {
"driving": 118,
"serving": 2400,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}道路側ヒントありの問題
このバージョンの前の問題との違いは、各ジョブに、ジョブのlocation座標と同じ座標を持つsideOfStreetHintが含まれている点だけです。matchSideOfStreetパラメーターは、すべての道路タイプで厳密に適用されるようalwaysに設定されています。
問題JSON全体については、次のセクションを参照してください。
Click to expand/collapse the sample JSON
{
"fleet": {
"types": [
{
"id": "garbage_truck",
"profile": "truck_profile",
"costs": {
"distance": 0.0002,
"time": 0.005,
"fixed": 100
},
"shifts": [
{
"start": {
"time": "2024-12-04T06:00:00Z",
"location": {
"lat": 52.53567,
"lng": 13.40641
}
},
"end": {
"time": "2024-12-04T14:00:00Z",
"location": {
"lat": 52.53567,
"lng": 13.40641
}
}
}
],
"capacity": [100],
"amount": 1
}
],
"profiles": [
{
"name": "truck_profile",
"type": "truck"
}
]
},
"plan": {
"jobs": [
{
"id": "east_1",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.536,
"lng": 13.40731,
"sideOfStreetHint": {
"lat": 52.536,
"lng": 13.40731,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_1",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53643,
"lng": 13.40718,
"sideOfStreetHint": {
"lat": 52.53643,
"lng": 13.40718,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_2",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53668,
"lng": 13.40802,
"sideOfStreetHint": {
"lat": 52.53668,
"lng": 13.40802,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_2",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53758,
"lng": 13.40839,
"sideOfStreetHint": {
"lat": 52.53758,
"lng": 13.40839,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_3",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.5379,
"lng": 13.4093,
"sideOfStreetHint": {
"lat": 52.5379,
"lng": 13.4093,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_3",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53902,
"lng": 13.40991,
"sideOfStreetHint": {
"lat": 52.53902,
"lng": 13.40991,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "west_4",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53944,
"lng": 13.41036,
"sideOfStreetHint": {
"lat": 52.53944,
"lng": 13.41036,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
},
{
"id": "east_4",
"tasks": {
"pickups": [
{
"places": [
{
"location": {
"lat": 52.53967,
"lng": 13.41118,
"sideOfStreetHint": {
"lat": 52.53967,
"lng": 13.41118,
"matchSideOfStreet": "always"
}
},
"duration": 300
}
],
"demand": [1]
}
]
}
}
]
}
}道路側ヒントありのソリューション
この場合、車両が次の順序でまず道路の片側を回り、その後もう一方を回るため、サービス面ではルート効率が大幅に向上します。
east_1 → east_2 → east_3 → east_4 → (折り返し) → west_4 → west_3 → west_2 → west_1
次の図はルートの内訳を視覚的に示したものです。
このソリューションが示すように、前のソリューションと比べて走行距離は400m増加しています (1100mから1500m)。ツアー所要時間も143秒増加しており (2518秒から2661秒)、総コストも112.81から113.60に増加しています。この場合、コスト、距離、所要時間がわずかに増加しても、安全性が大幅に向上することで十分に補われます。
ソリューションのJSON全体については、次のセクションを参照してください。
Click to expand/collapse the sample JSON
{
"statistic": {
"cost": 113.60499999999999,
"distance": 1500,
"duration": 2661,
"times": {
"driving": 261,
"serving": 2400,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "garbage_truck_1",
"typeId": "garbage_truck",
"stops": [
{
"time": {
"arrival": "2024-12-04T06:00:00Z",
"departure": "2024-12-04T06:00:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"time": {
"start": "2024-12-04T06:00:00Z",
"end": "2024-12-04T06:00:00Z"
}
}
],
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"distance": 0
},
{
"time": {
"arrival": "2024-12-04T06:00:07Z",
"departure": "2024-12-04T06:05:07Z"
},
"load": [
1
],
"activities": [
{
"jobId": "east_1",
"type": "pickup",
"location": {
"lat": 52.536,
"lng": 13.40731
},
"time": {
"start": "2024-12-04T06:00:07Z",
"end": "2024-12-04T06:05:07Z"
}
}
],
"location": {
"lat": 52.536,
"lng": 13.40731
},
"distance": 63
},
{
"time": {
"arrival": "2024-12-04T06:05:16Z",
"departure": "2024-12-04T06:10:16Z"
},
"load": [
2
],
"activities": [
{
"jobId": "east_2",
"type": "pickup",
"location": {
"lat": 52.53668,
"lng": 13.40802
},
"time": {
"start": "2024-12-04T06:05:16Z",
"end": "2024-12-04T06:10:16Z"
}
}
],
"location": {
"lat": 52.53668,
"lng": 13.40802
},
"distance": 153
},
{
"time": {
"arrival": "2024-12-04T06:10:32Z",
"departure": "2024-12-04T06:15:32Z"
},
"load": [
3
],
"activities": [
{
"jobId": "east_3",
"type": "pickup",
"location": {
"lat": 52.5379,
"lng": 13.4093
},
"time": {
"start": "2024-12-04T06:10:32Z",
"end": "2024-12-04T06:15:32Z"
}
}
],
"location": {
"lat": 52.5379,
"lng": 13.4093
},
"distance": 313
},
{
"time": {
"arrival": "2024-12-04T06:15:58Z",
"departure": "2024-12-04T06:20:58Z"
},
"load": [
4
],
"activities": [
{
"jobId": "east_4",
"type": "pickup",
"location": {
"lat": 52.53967,
"lng": 13.41118
},
"time": {
"start": "2024-12-04T06:15:58Z",
"end": "2024-12-04T06:20:58Z"
}
}
],
"location": {
"lat": 52.53967,
"lng": 13.41118
},
"distance": 549
},
{
"time": {
"arrival": "2024-12-04T06:23:27Z",
"departure": "2024-12-04T06:28:27Z"
},
"load": [
5
],
"activities": [
{
"jobId": "west_4",
"type": "pickup",
"location": {
"lat": 52.53944,
"lng": 13.41036
},
"time": {
"start": "2024-12-04T06:23:27Z",
"end": "2024-12-04T06:28:27Z"
}
}
],
"location": {
"lat": 52.53944,
"lng": 13.41036
},
"distance": 1003
},
{
"time": {
"arrival": "2024-12-04T06:28:34Z",
"departure": "2024-12-04T06:33:34Z"
},
"load": [
6
],
"activities": [
{
"jobId": "west_3",
"type": "pickup",
"location": {
"lat": 52.53902,
"lng": 13.40991
},
"time": {
"start": "2024-12-04T06:28:34Z",
"end": "2024-12-04T06:33:34Z"
}
}
],
"location": {
"lat": 52.53902,
"lng": 13.40991
},
"distance": 1059
},
{
"time": {
"arrival": "2024-12-04T06:33:53Z",
"departure": "2024-12-04T06:38:53Z"
},
"load": [
7
],
"activities": [
{
"jobId": "west_2",
"type": "pickup",
"location": {
"lat": 52.53758,
"lng": 13.40839
},
"time": {
"start": "2024-12-04T06:33:53Z",
"end": "2024-12-04T06:38:53Z"
}
}
],
"location": {
"lat": 52.53758,
"lng": 13.40839
},
"distance": 1250
},
{
"time": {
"arrival": "2024-12-04T06:39:08Z",
"departure": "2024-12-04T06:44:08Z"
},
"load": [
8
],
"activities": [
{
"jobId": "west_1",
"type": "pickup",
"location": {
"lat": 52.53643,
"lng": 13.40718
},
"time": {
"start": "2024-12-04T06:39:08Z",
"end": "2024-12-04T06:44:08Z"
}
}
],
"location": {
"lat": 52.53643,
"lng": 13.40718
},
"distance": 1402
},
{
"time": {
"arrival": "2024-12-04T06:44:21Z",
"departure": "2024-12-04T06:44:21Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"time": {
"start": "2024-12-04T06:44:21Z",
"end": "2024-12-04T06:44:21Z"
}
}
],
"location": {
"lat": 52.53567,
"lng": 13.40641
},
"distance": 1500
}
],
"statistic": {
"cost": 113.60499999999999,
"distance": 1500,
"duration": 2661,
"times": {
"driving": 261,
"serving": 2400,
"waiting": 0,
"stopping": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}次のステップ
sideOfStreetHintスキーマの詳細については、「APIリファレンス」を参照してください。- 廃棄物管理に関する別のユースケースについては、「廃棄物運行管理に合わせて効率的なルートを計画する」を参照してください。
- ツアーを地図上で可視化する手順については、「旅程のルートポリラインを取得する」を参照してください。
26 日前の更新