複数日の長距離旅程を計画する
dutyRule機能を使用すると、ドライバーが勤務期間中に業務に従事できる最大時間を指定できます。これには、連続する停車地点間で運転に費やされる時間、商品の積み込みや積み下ろし、その他の業務関連の作業を行う時間が含まれます。さらに、睡眠、休息、個人的な活動など、仕事に関連する活動以外の時間として、あらかじめ定められた非勤務休憩期間をスケジュールすることができます。
この機能は、1日を超える旅程を計画する際に、米国の連邦自動車運送安全局 (FMCSA) や欧州委員会輸送総局 (DG MOVE) などの規制機関の規則に準拠することを強制し、ドライバーが十分な休息と回復時間を確保できるようにします。たとえば、ドライバーの勤務が1勤務期間あたり運転時間10時間および作業時間14時間を超える場合、次の勤務期間の前に、現地の規制に準拠するために義務的な10時間の勤務休憩をスケジュールすることができます。
さらに、dutyRule機能はworkingおよびdrivingrestTimesの両方と統合されており、勤務中の運転、作業時間、業務中の休憩を管理する規制に完全に準拠することができます。たとえば、ドライバーの勤務中に運転時間を4時間または作業時間6時間ごとに30分間の休憩を設けることを義務付けることができます。dutyRuleとworking/driving``restTimesを整合させることで、幅広い規制要件に準拠することができます。
注
これはアルファ機能 (新規またはテスト段階であり、現在開発中) です。アルファ機能は、テストおよびフィードバックの目的で提供されています。これらは大幅に変更されたり、一般に入手できなくなったりする可能性があります。
詳細については、「テスト段階の機能の詳細」を参照してください。
次の図は、dutyRuleが他のrestTimes機能とどのように統合され、長距離運行中のドライバーの安全に関するさまざまな規制に準拠するのかを示しています。
前の図は、長距離ドライバーが日中に業務 (運転、および商品の取り扱いや事務処理などのその他の活動) を完了する一般的なシナリオを行い、夕方に勤務休憩が割り当てられるという一般的なシナリオを示しています。または、特定の使用ケースの要件に応じて、夜勤と日中の休憩時間に対応できるようにシフト構成をカスタマイズすることも可能です。
長距離旅程の所要時間を管理する時間枠は、シフトの開始日と終了日によって定義され、複数日にまたがることがよくあります。
勤務ルール設定を理解する
車両のルート検索に問題がある場合は、fleet.types.shift.restTimesオブジェクトの一部としてdutyRuleオブジェクトを配置します。dutyRuleオブジェクトには次の設定があります。
type(必須):常時fixedDuration。minOffTime(必須):連続する勤務または勤務日の間に必要な時間 (非勤務休憩期間) であり、秒単位で表されます。maxDrivingTime:勤務期間あたりの最大許容運転時間であり、秒単位で表されます。maxWorkingTime:勤務期間あたりに許容される最大作業時間 (運転に加え商品の集荷や配送などの業務関連の活動を含む) であり、秒単位で表されます。
詳細については、「APIリファレンス」を参照してください。
次のスニペットはrestTimesオブジェクトの例を示しています。これには、長距離旅程の最適化のために調整された問題におけるdutyRuleオブジェクトが含まれます。
{
"restTimes": {
"working": {
"type": "fixedDuration",
"interval": 21600, // 6 hours
"breakDuration": 1800 // 30 minutes
},
"driving": {
"type": "fixedDuration",
"interval": 14400, // 4 hours
"breakDuration": 1800 // 30 minutes
},
"dutyRule": {
"type": "fixedDuration",
"minOffTime": 36000, // 10 hours
"maxDrivingTime": 36000, // 10 hours
"maxWorkingTime": 50400 // 14 hours
}
}
}この設定では、旅程中のトラック運転手の休憩時間、運転時間、作業時間のルールと制限を定義されています。次のリストは、前の例で示された設定の簡単な概要を示したものです。
- 勤務時間:ドライバーは、6時間勤務するごとに30分間の休憩を取る必要があります。
- 運転時間:4時間の運転ごとに、ドライバーは30分間の休憩を取る必要があります。
- 勤務ルール:
- 最小休憩時間:ドライバーは、連続した2つの勤務期間の間に少なくとも10時間の非勤務休憩時間が必要です。
- 最大運転時間:ドライバーは、所定の勤務期間内に最大10時間運転することができます。
- 最大勤務時間:ドライバーは、所定の勤務期間内で最大14時間の作業 (運転、積み込みや積み下ろし、その他の活動を含む) しか許可されていません。
例:数日にわたる長距離旅程を最適化する
次のサンプル問題は、ドイツ全土に広がる15のジョブで構成されています。単一車両の運行管理は、シフト開始値とシフト終了値で示されるように、最大8日間で旅程を完了する必要があります。
問題
次のセクションでは、問題設定の全体について説明します。
注
この場合、
shifts.start.timeおよびshift.end.time値により旅程の最大期間は8日に制限されます。この時間枠が短すぎて問題ファイル内のすべてのジョブを完了できない場合、サービスは一部のジョブを未割り当てのままにすることがあります。
Click to expand/collapse the sample JSON
{
"fleet": {
"types": [
{
"id": "vehicle_1",
"profile": "vehicle",
"costs": {
"fixed": 10.0,
"distance": 1.0,
"time": 5.5
},
"shifts": [
{
"start": {
"time": "2025-05-20T08:00:00Z",
"location": {
"lat": 52.531,
"lng": 13.38461
}
},
"end": {
"time": "2025-05-28T18:00:00Z",
"location": {
"lat": 52.531,
"lng": 13.38461
}
},
"restTimes": {
"working": {
"type": "fixedDuration",
"interval": 21600,
"breakDuration": 1800
},
"driving": {
"type": "fixedDuration",
"interval": 14400,
"breakDuration": 1800
},
"dutyRule": {
"type": "fixedDuration",
"minOffTime": 36000,
"maxDrivingTime": 36000,
"maxWorkingTime": 50400
}
}
}
],
"capacity": [
40
],
"amount": 1
}
],
"profiles": [
{
"type": "car",
"name": "vehicle"
}
]
},
"plan": {
"jobs": [
{
"id": "job_1",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 48.20729,
"lng": 11.56141
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_2",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 53.13704,
"lng": 8.75297
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_3",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 53.55504,
"lng": 10.04741
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_4",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 50.84549,
"lng": 12.90079
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_5",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 49.46332,
"lng": 11.16261
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_6",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 50.98323,
"lng": 7.03591
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_7",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 51.33373,
"lng": 12.39848
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_8",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.2927,
"lng": 13.62112
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_9",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 48.77252,
"lng": 9.15553
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_10",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 54.11691,
"lng": 12.2034
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_11",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 50.14514,
"lng": 8.57765
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_12",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 51.97059892253276,
"lng": 7.618889808654785
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_13",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 49.31378,
"lng": 7.073
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_14",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 51.05983,
"lng": 13.74968
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
},
{
"id": "job_15",
"tasks": {
"deliveries": [
{
"places": [
{
"location": {
"lat": 48.17069,
"lng": 8.61222
},
"duration": 1200
}
],
"demand": [
1
]
}
]
}
}
]
},
"configuration": {
"experimentalFeatures": [
"restTimes"
]
}
}ソリューション
以下のスニペットには、前述の車両ルーティング問題の完全なソリューションが含まれており、driving、working、dutyRuleの時間が、指定された制約に準拠するようにスケジュールが設定されています。
Click to expand/collapse the sample JSON
{
"statistic": {
"cost": 12.71385188888889,
"distance": 2607783,
"duration": 190924,
"times": {
"driving": 91924,
"serving": 18000,
"waiting": 0,
"stopping": 0,
"break": 81000
}
},
"tours": [
{
"vehicleId": "vehicle_1_1",
"typeId": "vehicle_1",
"stops": [
{
"time": {
"arrival": "2025-05-20T08:00:00Z",
"departure": "2025-05-20T08:00:00Z"
},
"load": [
15
],
"activities": [
{
"jobId": "departure",
"type": "departure",
"location": {
"lat": 52.531,
"lng": 13.38461
},
"time": {
"start": "2025-05-20T08:00:00Z",
"end": "2025-05-20T08:00:00Z"
}
}
],
"location": {
"lat": 52.531,
"lng": 13.38461
},
"distance": 0
},
{
"time": {
"arrival": "2025-05-20T08:39:08Z",
"departure": "2025-05-20T08:59:08Z"
},
"load": [
14
],
"activities": [
{
"jobId": "job_8",
"type": "delivery",
"location": {
"lat": 52.2927,
"lng": 13.62112
},
"time": {
"start": "2025-05-20T08:39:08Z",
"end": "2025-05-20T08:59:08Z"
}
}
],
"location": {
"lat": 52.2927,
"lng": 13.62112
},
"distance": 38586
},
{
"time": {
"arrival": "2025-05-20T10:30:26Z",
"departure": "2025-05-20T10:50:26Z"
},
"load": [
13
],
"activities": [
{
"jobId": "job_14",
"type": "delivery",
"location": {
"lat": 51.05983,
"lng": 13.74968
},
"time": {
"start": "2025-05-20T10:30:26Z",
"end": "2025-05-20T10:50:26Z"
}
}
],
"location": {
"lat": 51.05983,
"lng": 13.74968
},
"distance": 198173
},
{
"time": {
"arrival": "2025-05-20T12:04:22Z",
"departure": "2025-05-20T12:24:22Z"
},
"load": [
12
],
"activities": [
{
"jobId": "job_7",
"type": "delivery",
"location": {
"lat": 51.33373,
"lng": 12.39848
},
"time": {
"start": "2025-05-20T12:04:22Z",
"end": "2025-05-20T12:24:22Z"
}
}
],
"location": {
"lat": 51.33373,
"lng": 12.39848
},
"distance": 311718
},
{
"time": {
"arrival": "2025-05-20T13:00:00Z",
"departure": "2025-05-20T13:30:00Z"
},
"load": [
12
],
"activities": [
{
"jobId": "drivingRestTime",
"type": "drivingRestTime",
"time": {
"start": "2025-05-20T13:00:00Z",
"end": "2025-05-20T13:30:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-20T13:47:05Z",
"departure": "2025-05-20T14:07:05Z"
},
"load": [
11
],
"activities": [
{
"jobId": "job_4",
"type": "delivery",
"location": {
"lat": 50.84549,
"lng": 12.90079
},
"time": {
"start": "2025-05-20T13:47:05Z",
"end": "2025-05-20T14:07:05Z"
}
}
],
"location": {
"lat": 50.84549,
"lng": 12.90079
},
"distance": 392833
},
{
"time": {
"arrival": "2025-05-20T16:13:23Z",
"departure": "2025-05-20T16:33:23Z"
},
"load": [
10
],
"activities": [
{
"jobId": "job_5",
"type": "delivery",
"location": {
"lat": 49.46332,
"lng": 11.16261
},
"time": {
"start": "2025-05-20T16:13:23Z",
"end": "2025-05-20T16:33:23Z"
}
}
],
"location": {
"lat": 49.46332,
"lng": 11.16261
},
"distance": 626293
},
{
"time": {
"arrival": "2025-05-20T18:03:53Z",
"departure": "2025-05-20T18:23:53Z"
},
"load": [
9
],
"activities": [
{
"jobId": "job_1",
"type": "delivery",
"location": {
"lat": 48.20729,
"lng": 11.56141
},
"time": {
"start": "2025-05-20T18:03:53Z",
"end": "2025-05-20T18:23:53Z"
}
}
],
"location": {
"lat": 48.20729,
"lng": 11.56141
},
"distance": 791650
},
{
"time": {
"arrival": "2025-05-20T18:30:00Z",
"departure": "2025-05-20T19:00:00Z"
},
"load": [
9
],
"activities": [
{
"jobId": "drivingRestTime",
"type": "drivingRestTime",
"time": {
"start": "2025-05-20T18:30:00Z",
"end": "2025-05-20T19:00:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-20T20:55:19Z",
"departure": "2025-05-20T21:15:19Z"
},
"load": [
8
],
"activities": [
{
"jobId": "job_9",
"type": "delivery",
"location": {
"lat": 48.77252,
"lng": 9.15553
},
"time": {
"start": "2025-05-20T20:55:19Z",
"end": "2025-05-20T21:15:19Z"
}
}
],
"location": {
"lat": 48.77252,
"lng": 9.15553
},
"distance": 1012947
},
{
"time": {
"arrival": "2025-05-20T21:20:00Z",
"departure": "2025-05-21T07:20:00Z"
},
"load": [
8
],
"activities": [
{
"jobId": "dutyDrivingRestTime",
"type": "dutyDrivingRestTime",
"time": {
"start": "2025-05-20T21:20:00Z",
"end": "2025-05-21T07:20:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-21T08:14:41Z",
"departure": "2025-05-21T08:34:41Z"
},
"load": [
7
],
"activities": [
{
"jobId": "job_15",
"type": "delivery",
"location": {
"lat": 48.17069,
"lng": 8.61222
},
"time": {
"start": "2025-05-21T08:14:41Z",
"end": "2025-05-21T08:34:41Z"
}
}
],
"location": {
"lat": 48.17069,
"lng": 8.61222
},
"distance": 1108358
},
{
"time": {
"arrival": "2025-05-21T11:25:03Z",
"departure": "2025-05-21T11:45:03Z"
},
"load": [
6
],
"activities": [
{
"jobId": "job_13",
"type": "delivery",
"location": {
"lat": 49.31378,
"lng": 7.073
},
"time": {
"start": "2025-05-21T11:25:03Z",
"end": "2025-05-21T11:45:03Z"
}
}
],
"location": {
"lat": 49.31378,
"lng": 7.073
},
"distance": 1385790
},
{
"time": {
"arrival": "2025-05-21T12:00:00Z",
"departure": "2025-05-21T12:30:00Z"
},
"load": [
6
],
"activities": [
{
"jobId": "drivingRestTime",
"type": "drivingRestTime",
"time": {
"start": "2025-05-21T12:00:00Z",
"end": "2025-05-21T12:30:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-21T13:54:26Z",
"departure": "2025-05-21T14:14:26Z"
},
"load": [
5
],
"activities": [
{
"jobId": "job_11",
"type": "delivery",
"location": {
"lat": 50.14514,
"lng": 8.57765
},
"time": {
"start": "2025-05-21T13:54:26Z",
"end": "2025-05-21T14:14:26Z"
}
}
],
"location": {
"lat": 50.14514,
"lng": 8.57765
},
"distance": 1561522
},
{
"time": {
"arrival": "2025-05-21T15:57:24Z",
"departure": "2025-05-21T16:17:24Z"
},
"load": [
4
],
"activities": [
{
"jobId": "job_6",
"type": "delivery",
"location": {
"lat": 50.98323,
"lng": 7.03591
},
"time": {
"start": "2025-05-21T15:57:24Z",
"end": "2025-05-21T16:17:24Z"
}
}
],
"location": {
"lat": 50.98323,
"lng": 7.03591
},
"distance": 1743220
},
{
"time": {
"arrival": "2025-05-21T17:10:00Z",
"departure": "2025-05-21T17:40:00Z"
},
"load": [
4
],
"activities": [
{
"jobId": "drivingRestTime",
"type": "drivingRestTime",
"time": {
"start": "2025-05-21T17:10:00Z",
"end": "2025-05-21T17:40:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-21T18:17:06Z",
"departure": "2025-05-21T18:37:06Z"
},
"load": [
3
],
"activities": [
{
"jobId": "job_12",
"type": "delivery",
"location": {
"lat": 51.97059892253276,
"lng": 7.618889808654785
},
"time": {
"start": "2025-05-21T18:17:06Z",
"end": "2025-05-21T18:37:06Z"
}
}
],
"location": {
"lat": 51.97059892253276,
"lng": 7.618889808654785
},
"distance": 1886871
},
{
"time": {
"arrival": "2025-05-21T20:00:00Z",
"departure": "2025-05-22T06:00:00Z"
},
"load": [
3
],
"activities": [
{
"jobId": "dutyDrivingRestTime",
"type": "dutyDrivingRestTime",
"time": {
"start": "2025-05-21T20:00:00Z",
"end": "2025-05-22T06:00:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-22T06:27:01Z",
"departure": "2025-05-22T06:47:01Z"
},
"load": [
2
],
"activities": [
{
"jobId": "job_2",
"type": "delivery",
"location": {
"lat": 53.13704,
"lng": 8.75297
},
"time": {
"start": "2025-05-22T06:27:01Z",
"end": "2025-05-22T06:47:01Z"
}
}
],
"location": {
"lat": 53.13704,
"lng": 8.75297
},
"distance": 2064222
},
{
"time": {
"arrival": "2025-05-22T08:06:39Z",
"departure": "2025-05-22T08:26:39Z"
},
"load": [
1
],
"activities": [
{
"jobId": "job_3",
"type": "delivery",
"location": {
"lat": 53.55504,
"lng": 10.04741
},
"time": {
"start": "2025-05-22T08:06:39Z",
"end": "2025-05-22T08:26:39Z"
}
}
],
"location": {
"lat": 53.55504,
"lng": 10.04741
},
"distance": 2196590
},
{
"time": {
"arrival": "2025-05-22T10:07:23Z",
"departure": "2025-05-22T10:27:23Z"
},
"load": [
0
],
"activities": [
{
"jobId": "job_10",
"type": "delivery",
"location": {
"lat": 54.11691,
"lng": 12.2034
},
"time": {
"start": "2025-05-22T10:07:23Z",
"end": "2025-05-22T10:27:23Z"
}
}
],
"location": {
"lat": 54.11691,
"lng": 12.2034
},
"distance": 2384002
},
{
"time": {
"arrival": "2025-05-22T11:00:00Z",
"departure": "2025-05-22T11:30:00Z"
},
"load": [
0
],
"activities": [
{
"jobId": "drivingRestTime",
"type": "drivingRestTime",
"time": {
"start": "2025-05-22T11:00:00Z",
"end": "2025-05-22T11:30:00Z"
}
}
]
},
{
"time": {
"arrival": "2025-05-22T13:02:04Z",
"departure": "2025-05-22T13:02:04Z"
},
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival",
"location": {
"lat": 52.531,
"lng": 13.38461
},
"time": {
"start": "2025-05-22T13:02:04Z",
"end": "2025-05-22T13:02:04Z"
}
}
],
"location": {
"lat": 52.531,
"lng": 13.38461
},
"distance": 2607783
}
],
"statistic": {
"cost": 12.71385188888889,
"distance": 2607783,
"duration": 190924,
"times": {
"driving": 91924,
"serving": 18000,
"waiting": 0,
"stopping": 0,
"break": 81000
}
},
"shiftIndex": 0
}
]
}次の図は、旅程を地図上で視覚化したものです。各予定休憩時刻は、その種類に応じてマークされています。
注
HERE Tour Planning APIでは、
restTimes休憩の場所を提供しません。その結果、以前の地図では、各休憩が直前の停車場所で発生するものとして表示されます。実際には、停止場所からの出発時間とスケジュールされた休憩の開始時間の間で、ドライバーが休憩に適した場所を選択することになります。
ソリューションの内訳
この最適化では、3日間の旅程旅程が実施され、各10時間の勤務休憩が2回含まれています。これらの期間は夕方に始まり、翌朝に終了するため、ドライバーは次の勤務時間に旅程を再開することができます。
これらの休憩期間に加えて、サービスは勤務休憩の要件に準拠するため、4時間運転するごとに30分間の休憩時間をスケジュールします。問題の制約により、旅程は勤務休憩時間を予定するための条件を満たしていないため、最適化には休憩時間が含まれていません。
HERE Tour Planning APIがどのように休憩をスケジュールしたかを理解するために、旅程内の1勤務日について出発から最初の勤務休憩までを分析しましょう。次の図に示すように、運転の休憩時間によって3つのセグメントに分割されています。
次の表は、スケジュールされた運転休憩時間を挟んで3つの明確なセグメントに分けられた、勤務日の詳細な内訳を示しています。次の各セグメントには、運転に費やした合計時間、オンサイト作業 (商品の積み込み/積み下ろしなど) に割り当てられた時間、およびそれらを合わせた合計勤務時間が含まれています。
| セグメント | 時間範囲 | 運転時間 | 作業停止時間 | 合計作業時間 |
|---|---|---|---|---|
| セグメント1 | 午前8:00~午後1:00 | 4時間 (240分) | 1時間 (60分) | 5時間 (300分) |
| セグメント2 | 午後1:30~午後6:30 | 4時間 (240分) | 1時間 (60分) | 5時間 (300分) |
| セグメント3 | 午後7:00~午後9:20 | 2時間 (120分) | 20分 | 2時間20分 (140分) |
| 合計 | 午前8:00~午後9:20 | 10時間 (600分) | 2時間20分 (140分) | 12時間20分 (740分) |
| 休憩 (運転休憩時間) | 午後1:00~1:30、午後6:30~7:00 | – | – | – |
表の日付に基づいて、次の点を考慮してください。
- サービスは
restTimes.driving.interval設定に従い、セグメント2およびセグメント3の開始前に4時間の運転後にdriving休憩時間を予定しました。 driving休憩時間の間隔制約が常に先に満たされていたため、サービスはworking休憩をスケジュールしませんでした。- セグメント3の時間は、勤務期間に許容される運転時間の合計 (10時間) に制限されました。
- セグメント3の終了時点で、旅程が1勤務期間あたりに許容される最大運転時間の制約に達したため、サービスは翌日にかけて最初の10時間の勤務休憩をスケジュールしました。
次のステップ
詳細については、以下を参照してください。
26 日前の更新