回避オプションの使用
運行管理 の車両ルーティングの問題( VRP )を、大規模なテリトリーで複雑な制約条件を使用して構築する場合、特定のテリトリーを訪問したり、特定の道路を使用を回避するために、特定の車両を使用することが非常によくあります この場合 、オプションを使用することをお勧めします。このオプションを使用すると、問題に対するより正確な制約を設定でき、車両は特定のプロパティに違反する特定の不要または非優先ルートを回避できます。 avoid
回避オプションは、位置分布半径 (すべてのジョブの位置と車両の開始、終了、休憩の位置を含む) が 190 km 未満の場合にのみ適用されることに注意してください。
フィーチャーの回避
-
features
- ルート計算から除外することを推奨するルーティング機能の配列。 使用可能な回避機能のオプションは次のとおりです。 -
tollRoad
- 有料道路を避けます -
controlledAccessHighway
- アクセス制御された高速道路の回避 -
ferry
- フェリーの回避 -
carShuttleTrain
- シャトルバスの回避 -
tunnel
- トンネルの回避 -
dirtRoad
- 泥道の回避 -
difficultTurns
- 難しいカーブ、急カーブ、自動車専用道路と高速道路での U ターンの回避 ( トラックのみ ) -
uTurns
- 自動車専用道路と高速道路でのU ターンの回避 ( トラックのみ )
たとえば、トンネルやアクセス制御された高速道路を回避するルートを構築するには、問題のフリート部分の車両制約に次の内容を追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"features": [
"tunnel",
"controlledAccessHighway"
]
}
}
]
エリアの回避
-
areas
- ツアー中に訪問しないことが望ましい、特定のエリアの配列。 boundingBox
タイプで指定 - 2 つの緯度と 2 つの経度の値のカンマ区切りリストで定義される長方形領域: -
north
- 数値 [-90..90]- ボックスの北の境界線からWGS 84 で示される緯度 。 -
south
- 数値 [-90..90]- ボックスの南の境界線から WGS 84で示される緯度 。 -
west
-数値[-180..180]- ボックスの西の境界線からWGS 84で示される軽度。 -
east
-数値[-180..180]- ボックスの東の境界線から WGS 84で示される軽度
たとえば、地図上の特定のエリアを避けてルートを作成するには、問題の運行管理 部分の車両制約に次のものを追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"areas": [
{
"type": "boundingBox",
"north": 52.523425044655696,
"south": 52.432243159759814,
"east": 13.435039860200588,
"west": 12.990627124745892
}
]
}
}
]
マップセグメントを回避
-
segments
- 回避する特定の地図セグメント。 各セグメント識別子エントリの構造は次のとおりです。 {segmentId}(#{direction})?
個々のパートは次のとおりです。 -
segmentId
- 次のような形式 domain:system:type:id
で、カタログ内で参照されるトポロジセグメントの識別子。here:cm:segment:207551710
。 このプロパティは、カタログ内で一意です。 特定の道路セグメントの segmentId
を検索するには、道路 - ナビゲーション属性または道路 - ADAS 属性などを使用します。 -
direction
( 任意 )- 双方向 ( デフォルト ) *
、 正の方向+
、または 負の方向-
のいずれかです。
たとえば、マップ上の 2 つのセグメントを回避するルートを作成するには、問題の運行管理部分の車両の制約条件に次の情報を追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"segments": [
{
"here:cm:segment:207551710#+",
"here:cm:segment:76771992#*"
}
]
}
}
]
1 つのリクエストでペナルティを受けるセグメントの最大量は 250 を超えてはいけないことに注意してください。「ペナルティを受けるセグメント」とは、maxSpeedOnSegment
での最大値 baseSpeed
または回避数 avoid[segments]
に制限があるセグメントを指します。
ゾーン ID の回避
-
zoneIdentifiers
- 回避する特定のマップゾーン。 domain:system:type:id
ルートが通過しないようにする、その形式のルーティングゾーン ID の配列。 たとえば、 ID here:cm:envzone:2
は Berlin Umweltzone 環境ゾーンを参照しています。
回避するゾーン ID を取得する 1 つの方法は 、レスポンスメッセージのブロック routingZone
から取得することです。 ゾーン IDの取得方法の詳細についてはこちらを参照してください。
一般的に、さまざまなマップゾーンに関する情報は、platform.here.com の各カタログから取得され、こちらで見つけることができます。 プラットフォーム カタログへのアクセス権がない場合は、上記のルーティングレスポンスを使用できます。
たとえば、マップ上の特定のゾーンを回避するルートを作成するには、問題の運行管理 部分の車両の制約条件に以下を追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"zoneIdentifiers": [
"here:cm:envzone:2"
]
}
}
]
トラックタイプルートの回避
-
truckRoadTypes
- トラックが回避する大型車両の通行に関する追加規制が適用される特定の道路タイプたとえば、スウェーデンの BK Bearing Class 規制、メキシコの ET カテゴリなどです サポートされているトラックの道路タイプの識別子は、 こちらで見つけることができます。
たとえば、 3 つの特定の道路を避けてルートを作成するには、問題の運行管理 部分の車両の制約条件に次のものを追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"truckRoadTypes": [
"BK1",
"BK2",
"BK3"
]
}
}
]
ゾーンカテゴリの回避
-
zoneCategories
- 回避する特定のマップゾーンカテゴリおよびマップゾーン。 回避するゾーンカテゴリの評価に反映されないゾーン識別子の配列。 -
categories
- 回避するルーティングゾーンカテゴリの配列。 -
exceptZoneIds
- ゾーン識別子の配列。回避するゾーンカテゴリの評価には反映されません。
たとえば、 3 つの特定のゾーンカテゴリを回避するルートを作成するには、問題の運行管理 部分の車両制約に次の項目を追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"zoneCategories": [
"category1",
"category2",
"category3"
]
}
}
]
回避されたゾーンカテゴリ内の一部のゾーンへのアクセス権が付与されている場合、domain:system:type:id
の形式でルーティングゾーン ID の配列を持つ任意の exceptZoneIds
カテゴリを使用して、ルートを計画できます。 ゾーン IDの取得方法の詳細については こちら、を参照してください。
たとえば、特定のゾーンカテゴリを避けてルートを作成し、回避オプションから一部のゾーンを除外するには、問題の運行管理 部分の車両制約に次の項目を追加します。
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"zoneCategories": [
"category1"
]
"exceptZoneIds" [
"here:cm:envzone:2",
"here:cm:envzone:261"
]
}
}
]
avoid
このオプションを使用しても、車両が特定のエリアまたは道路を訪問することは完全には防止されませんが、回避されていないエリアを通るルートが優先されます。
以下では、ツアー計画時に、 areas
と features
の回避の 2 つの異なる例を考えています。
回避エリアの例
以下では、 4 つのジョブを実行する車両の簡単な例を考えてみましょう。 ツアーに参加する際には、弊社の制約 boundingBox
により、問題の運行管理 部に追加された座標 52.52342504655696 、 52.432243159759814 、 13.435039860200588 、 12.990627124745892 内にある特定のエリアを避けてください。
plan
のパートからわかるよう に、ジョブの場所はboundingBox
内に直接ありませんが、ジョブ間のルートはこの領域を完全に横断します。 そのため、以下の方法で問題を解決するには、車両がその特定のエリアを回避できるように代替ルートを作成する必要があります。
Problems
{
"fleet": {
"types": [
{
"id": "2759a4c35b01",
"profile": "truck_1",
"costs": {
"fixed": 9.0,
"distance": 0.002,
"time": 0.009
},
"shifts": [
{
"start": {
"time": "2022-07-22T08:49:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2022-07-22T19:49:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
}
}
],
"capacity": [
50
],
"amount": 1
}
],
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"areas": [
{
"type": "boundingBox",
"north": 52.523425044655696,
"south": 52.432243159759814,
"east": 13.435039860200588,
"west": 12.990627124745892
}
]
}
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.61233361982292,
"lng": 13.378211244312677
},
"duration": 135
}
],
"demand": [
14
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.396871659783336,
"lng": 13.05446681343765
},
"duration": 516
}
],
"demand": [
7
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.39394204075849,
"lng": 13.082571195347363
},
"duration": 571
}
],
"demand": [
9
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.387946983417116,
"lng": 13.066284687565254
},
"duration": 378
}
],
"demand": [
6
]
}
]
}
}
]
}
}
Solution
ジョブが割り当てられ、ルートが作成されたときに、総コスト、距離、所要時間などのツアーの全体的な統計情報を確認できます。 ここで このデータは、回避オプションに含まれている領域を回避した後のより長いツアーを考慮して計算されたものであることに注意してください。
{
"statistic": {
"cost": 464.185,
"distance": 157451,
"duration": 15587,
"times": {
"driving": 13987,
"serving": 1600,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "2759a4c35b01_1",
"typeId": "2759a4c35b01",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-07-22T08:49:00Z",
"departure": "2022-07-22T08:49:00Z"
},
"load": [
36
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.39394204075849,
"lng": 13.082571195347365
},
"time": {
"arrival": "2022-07-22T10:11:47Z",
"departure": "2022-07-22T10:21:18Z"
},
"load": [
27
],
"activities": [
{
"jobId": "job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.38794698341712,
"lng": 13.066284687565254
},
"time": {
"arrival": "2022-07-22T10:28:36Z",
"departure": "2022-07-22T10:34:54Z"
},
"load": [
21
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.396871659783336,
"lng": 13.05446681343765
},
"time": {
"arrival": "2022-07-22T10:41:27Z",
"departure": "2022-07-22T10:50:03Z"
},
"load": [
14
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.61233361982292,
"lng": 13.378211244312675
},
"time": {
"arrival": "2022-07-22T12:29:14Z",
"departure": "2022-07-22T12:31:29Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-07-22T13:08:47Z",
"departure": "2022-07-22T13:08:47Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 464.185,
"distance": 157451,
"duration": 15587,
"times": {
"driving": 13987,
"serving": 1600,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
回避オプションの不使用
上記の結果を avoid
、同様の問題でオプションを使用しない状況と比較してみましょう。 同じ問題を解決しようとしても、fleet
のパートから オプションavoid
が削除された場合、ルートはエリアの制約なしに作成されることを想定しているため、ツアーの全体的な統計情報は異なるものにする必要があります。
Problems
{
"fleet": {
"types": [
{
"id": "2759a4c35b01",
"profile": "truck_1",
"costs": {
"fixed": 9.0,
"distance": 0.002,
"time": 0.009
},
"shifts": [
{
"start": {
"time": "2022-07-22T08:49:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
},
"end": {
"time": "2022-07-22T19:49:00Z",
"location": {
"lat": 52.530971,
"lng": 13.384915
}
}
}
],
"capacity": [
50
],
"amount": 1
}
],
"profiles": [
{
"type": "truck",
"name": "truck_1"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.61233361982292,
"lng": 13.378211244312677
},
"duration": 135
}
],
"demand": [
14
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.396871659783336,
"lng": 13.05446681343765
},
"duration": 516
}
],
"demand": [
7
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.39394204075849,
"lng": 13.082571195347363
},
"duration": 571
}
],
"demand": [
9
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.387946983417116,
"lng": 13.066284687565254
},
"duration": 378
}
],
"demand": [
6
]
}
]
}
}
]
}
}
Solution
以下の解決策からわかるよう avoid
に、ツアーの総距離は 97776 m になりました。これは、オプションが使用された前のソリューションの 157451 m と比較したものです。 そのため、ツアーの所要時間と費用も削減されました。 つまり、特定のエリアを訪問する車両を制限せずにツアーが作成され、アルゴリズムによりジョブを処理する最適なルートを選択しました。
{
"statistic": {
"cost": 301.95,
"distance": 97776,
"duration": 10822,
"times": {
"driving": 9222,
"serving": 1600,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "2759a4c35b01_1",
"typeId": "2759a4c35b01",
"stops": [
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-07-22T08:49:00Z",
"departure": "2022-07-22T08:49:00Z"
},
"load": [
36
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.39394204075849,
"lng": 13.082571195347365
},
"time": {
"arrival": "2022-07-22T09:32:23Z",
"departure": "2022-07-22T09:41:54Z"
},
"load": [
27
],
"activities": [
{
"jobId": "job_3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.38794698341712,
"lng": 13.066284687565254
},
"time": {
"arrival": "2022-07-22T09:49:12Z",
"departure": "2022-07-22T09:55:30Z"
},
"load": [
21
],
"activities": [
{
"jobId": "job_4",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.396871659783336,
"lng": 13.05446681343765
},
"time": {
"arrival": "2022-07-22T10:02:03Z",
"departure": "2022-07-22T10:10:39Z"
},
"load": [
14
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.61233361982292,
"lng": 13.378211244312675
},
"time": {
"arrival": "2022-07-22T11:09:49Z",
"departure": "2022-07-22T11:12:04Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.530971,
"lng": 13.384915
},
"time": {
"arrival": "2022-07-22T11:49:22Z",
"departure": "2022-07-22T11:49:22Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 301.95,
"distance": 97776,
"duration": 10822,
"times": {
"driving": 9222,
"serving": 1600,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
回避フィーチャーの例
2 つのジョブを処理するときにトンネルを避けるために車両が必要な場合の簡単な例を考えてみましょう。 以下の問題の運行管理 部分では、車両truck_1
に オプションavoid
を追加し、features
で tunnel
を指定しました。 ここで、最も近い方法はトンネルを使用することになりますが、車両はジョブ間の代替方法を選択すると予想されます。
Problems
{
"fleet": {
"types": [
{
"id": "2759a4c35b01",
"profile": "truck_1",
"costs": {
"fixed": 9.0,
"distance": 0.002,
"time": 0.009
},
"shifts": [
{
"start": {
"time": "2022-07-22T08:49:00Z",
"location": {
"lat": 52.524021669858236,
"lng": 13.346234778981403
}
},
"end": {
"time": "2022-07-22T19:49:00Z",
"location": {
"lat": 52.524021669858236,
"lng": 13.346234778981403
}
}
}
],
"capacity": [
50
],
"amount": 1
}
],
"profiles": [
{
"type": "truck",
"name": "truck_1",
"avoid": {
"features": [
"tunnel"
]
}
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.534591259017255,
"lng": 13.368714336895204
},
"duration": 215
}
],
"demand": [
11
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.48682246237135,
"lng": 13.373210248775834
},
"duration": 135
}
],
"demand": [
14
]
}
]
}
}
]
}
}
Solution
ジョブが割り当てられ、ルートが作成されると、総コスト、距離、所要時間を含むツアーの全体的な統計情報を確認できます。 回避オプションに含まれているトンネルを回避した後のより長いツアーを考慮して、これらのデータが計算されたことに注意してください。 オプションavoid
を削除した後、以下の例で解決策を比較してください。
{
"statistic": {
"cost": 84.50899999999999,
"distance": 18202,
"duration": 4345,
"times": {
"driving": 3995,
"serving": 350,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "2759a4c35b01_1",
"typeId": "2759a4c35b01",
"stops": [
{
"location": {
"lat": 52.52402166985824,
"lng": 13.346234778981405
},
"time": {
"arrival": "2022-07-22T08:49:00Z",
"departure": "2022-07-22T08:49:00Z"
},
"load": [
25
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.534591259017255,
"lng": 13.368714336895204
},
"time": {
"arrival": "2022-07-22T09:05:29Z",
"departure": "2022-07-22T09:09:04Z"
},
"load": [
14
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.48682246237135,
"lng": 13.373210248775834
},
"time": {
"arrival": "2022-07-22T09:37:12Z",
"departure": "2022-07-22T09:39:27Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.52402166985824,
"lng": 13.346234778981405
},
"time": {
"arrival": "2022-07-22T10:01:25Z",
"departure": "2022-07-22T10:01:25Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 84.50899999999999,
"distance": 18202,
"duration": 4345,
"times": {
"driving": 3995,
"serving": 350,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}
回避フィーチャーの不使用
上記の結果を 、同じ問題でオプションavoid
を使用しない状況と比較してみましょう。 同じ問題を解決しようとして も 、オプションavoid
をfleet
のパートから除外した場合、ルートは制限なく作成され、車両がトンネルを通過できるようになり、ツアーの全体的な統計情報が異なっている必要があります。
Problems
{
"fleet": {
"types": [
{
"id": "2759a4c35b01",
"profile": "truck_1",
"costs": {
"fixed": 9.0,
"distance": 0.002,
"time": 0.009
},
"shifts": [
{
"start": {
"time": "2022-07-22T08:49:00Z",
"location": {
"lat": 52.524021669858236,
"lng": 13.346234778981403
}
},
"end": {
"time": "2022-07-22T19:49:00Z",
"location": {
"lat": 52.524021669858236,
"lng": 13.346234778981403
}
}
}
],
"capacity": [
50
],
"amount": 1
}
],
"profiles": [
{
"type": "truck",
"name": "truck_1"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.534591259017255,
"lng": 13.368714336895204
},
"duration": 215
}
],
"demand": [
11
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.48682246237135,
"lng": 13.373210248775834
},
"duration": 135
}
],
"demand": [
14
]
}
]
}
}
]
}
}
Solution
以下の解決策からわかるように、ルートがトンネルを避けて構築されたときの以前のソリューションの 18202 m に比べて、ツアーの総距離は 17017 m になりました。 そのため、ツアーの所要時間と費用も削減されました。
{
"statistic": {
"cost": 77.918,
"distance": 17017,
"duration": 3876,
"times": {
"driving": 3526,
"serving": 350,
"waiting": 0,
"break": 0
}
},
"tours": [
{
"vehicleId": "2759a4c35b01_1",
"typeId": "2759a4c35b01",
"stops": [
{
"location": {
"lat": 52.52402166985824,
"lng": 13.346234778981405
},
"time": {
"arrival": "2022-07-22T08:49:00Z",
"departure": "2022-07-22T08:49:00Z"
},
"load": [
25
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.534591259017255,
"lng": 13.368714336895204
},
"time": {
"arrival": "2022-07-22T09:05:29Z",
"departure": "2022-07-22T09:09:04Z"
},
"load": [
14
],
"activities": [
{
"jobId": "job_1",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.48682246237135,
"lng": 13.373210248775834
},
"time": {
"arrival": "2022-07-22T09:29:23Z",
"departure": "2022-07-22T09:31:38Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.52402166985824,
"lng": 13.346234778981405
},
"time": {
"arrival": "2022-07-22T09:53:36Z",
"departure": "2022-07-22T09:53:36Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 77.918,
"distance": 17017,
"duration": 3876,
"times": {
"driving": 3526,
"serving": 350,
"waiting": 0,
"break": 0
}
},
"shiftIndex": 0
}
]
}