이 페이지에서는 라우팅 요구사항을 식별하는 것부터 시스템의 통합 경로 계획으로 마무리하는 것까지 경로 최적화 API를 사용하는 경로 계획의 수명 주기를 설명합니다.
경로 계획의 단계를 따르면 다음 목표를 달성할 수 있습니다.
- 차량 운영 매핑: 실제 차량, 복잡한 제약 조건, 비즈니스 목표를 API의 코드로 변환합니다.
- 비즈니스에 맞게 경로 계획 최적화: 목표를 달성하고 일상적인 운영을 개선할 수 있도록 경로 계획을 개선하는 방법을 이해합니다.
- 프로덕션에 배포: 일상적인 운영에 포함하여 경로 계획을 구현합니다.
다음 다이어그램은 경로 계획의 수명 주기를 보여줍니다.
경로 계획의 구현 단계 는 API를 처음 통합할 때 또는 비즈니스 요구사항이 크게 변경될 때 발생합니다. 1~5단계를 포함합니다.
일상적인 운영 단계 는 더 가볍고 개선이 최소화됩니다. 2~4단계를 포함합니다.
경로 단계의 수명은 다음과 같습니다.
- 문제 범위 지정: API를 사용하기 전에 운영을 완전히 파악할 수 있도록 목표, 리소스, 작업, 제약 조건을 식별하고 구성합니다.
- 데이터 매핑: 경로 계획이 차량 운영 방식을 반영하도록 비즈니스 현실을 API 매개변수로 변환합니다.
- 요청 생성 및 경로 계획 가져오기: API에 데이터를 입력하고 최적화된 경로 계획을 가져옵니다.
- 경로 계획 개선: 모든 요구사항을 충족하는지 확인하기 위해 제약 조건과 목표를 조정하여 경로 계획을 테스트하고 반복합니다.
- 경로 계획 통합: 실행 가능한 탐색을 제공하기 위해 경로 계획을 기존 시스템에 연결합니다.
문제 범위 지정
API를 사용하기 전에 일상적인 운영의 세부정보를 명확한 데이터 카테고리로 구성해야 합니다. 이렇게 하면 현재 리소스와 작업, 제약 조건, 차량으로 달성하려는 목표를 명확하게 파악하여 구현 프로세스를 시작할 수 있습니다.
리소스 및 작업 식별
경로 계획을 계획할 때 중요한 단계는 차량과 배송인 리소스와 작업을 식별하는 것입니다.
| 차량 | 배송 |
|---|---|
|
|
제약 조건 식별
제약 조건은 차량을 사용하는 방법과 배송을 처리하는 방법에 대한 한도 및 제한사항입니다. 대부분의 운영을 지시하며 최적화된 경로 계획을 만들 때 매우 중요합니다.
제약 조건은 일반적으로 다음 두 가지 카테고리로 분류됩니다.
| 엄격한 제약 조건 | 소프트 제약 조건 |
|---|---|
| 위반할 수 없는 한도입니다. 예를 들어 트럭은 최대 용량보다 더 많은 무게를 운반할 수 없으며 운전자는 상점이 문을 닫은 후 픽업할 수 없습니다. | **필요한 경우 위반할 수 있는** 환경설정으로, 일반적으로 벌금 비용이 발생합니다. 예를 들어 트럭을 80% 용량으로만 적재하거나 목표 시간 전에 배송하는 것이 좋지만 더 나은 경로를 얻기 위해 이러한 한도를 초과해도 괜찮습니다. |
일반적인 제약 조건은 다음과 같습니다.
- 용량 한도: 차량이 운반할 수 있는 최대 무게, 부피 또는 항목 수입니다.
- 기간: 위치를 방문할 수 있는 특정 시간 슬롯 또는 운전자의 특정 교대 근무 시간입니다.
- 비용: 차량을 운영하거나 배송을 건너뛰는 비용입니다. API의 주요 목표 중 하나는 비용 효율적인 경로 계획을 생성하는 것입니다.
- 운전자 휴식 시간: 특정 근무 시간 후 노동법에 따라 일반적으로 필요한 운전자 휴식 기간입니다.
비즈니스 목표 설정
리소스와 작업 및 제한사항을 설정한 후에는 비즈니스에 가장 중요한 측정항목을 설정할 차례입니다. 이러한 목표는 제약 조건과 밀접하게 관련되어 있으며 경로를 계획할 때 가장 중요한 사항을 결정하는 데 도움이 됩니다.
다음은 비즈니스 목표의 몇 가지 예입니다.
| 보유 중인 사업용 차량 대수 | 거리 | 시간 | 비용 |
|---|---|---|---|
| 사용하는 차량 수를 최소화하거나 전체 차량을 사용하여 근무일을 더 일찍 끝내고 싶으신가요? | 연료를 절약하기 위해 최단 경로를 원하시나요, 아니면 고속도로를 사용하여 더 길어질 수 있는 더 빠른 경로를 선호하시나요? | 총 근무 시간을 최소화하거나 경로에 소요되는 시간을 늘릴 수 있는 특정 시간에 도착하는 것을 우선시하고 싶으신가요? | 임금 및 연료와 같은 운영 비용을 최소화하거나 엄격한 마감일을 맞추기 위해 더 높은 비용을 감수하고 싶으신가요? |
데이터 매핑
데이터를 수집한 후 API의 속성과 일치하도록 매핑합니다. 이렇게 하면 최적화 도구에 비즈니스 현실을 고려하는 경로 계획을 반환하는 데 필요한 모든 정보가 제공됩니다.
다음 표의 매개변수를 사용하여 리소스, 작업, 제약 조건, 및 문제 범위 지정 섹션에서 매핑한 목표를 매핑합니다.
변수 매핑
| 실제 개념 | API 매개변수 | 설명 |
|---|---|---|
| 운전자 또는 차량 | model.vehicles[] |
차량의 단일 차량을 나타냅니다. |
| 차고 위치 |
vehicles[].startWaypointvehicles[].endWaypoint
|
차량이 경로를 시작하고 끝내는 위치입니다. |
| 영업시간 |
model.globalStartTimemodel.globalEndTime
|
전체 차량 운영의 가장 빠른 시작 시간과 가장 늦은 종료 시간입니다. |
| 작업 또는 패키지 | model.shipments[] |
작업을 나타냅니다. pickup 또는 delivery 또는 둘 다일 수 있습니다. |
| 작업 위치 |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
작업이 이루어지는 지리적 위치입니다. |
| 서비스 시간 |
pickups[].durationdeliveries[].duration
|
이동 시간을 제외하고 위치에서 작업을 완료하는 데 소요되는 시간 (예: 하차)입니다. |
제약 조건 매핑
| 실제 제약 조건 | API 매개변수 | 설명 |
|---|---|---|
| 차량 용량 | vehicles[].loadLimits |
차량 용량의 엄격한 한도 또는 소프트 한도를 설정합니다. 배송의 loadDemand가 남은 한도를 초과하면 할당되지 않습니다. |
| 패키지 크기 | shipments[].loadDemands |
배송이 소비하는 차량 용량입니다. |
| 차량 제한 | shipments[].allowedVehicleIndices |
특정 차량 또는 운전자만 배송을 픽업하거나 배송할 수 있도록 배송을 제한합니다. |
| 이용 가능한 시간 | shipments[].pickups[].timeWindows 또는 shipments[].deliveries[].timeWindows |
위치를 방문할 수 있는 시간을 설정합니다. 차량이 이 기간 내에 도착할 수 없는 경우 배송이 건너뛰어집니다. |
| 교대 근무 시간 한도 | vehicles[].routeDurationLimit |
전역 종료 시간과 관계없이 특정 운전자가 근무할 수 있는 시간 (예: 최대 8시간)에 엄격한 한도 또는 소프트 한도를 설정합니다. |
| 운전자 휴식 시간 | vehicles[].breakRule |
특정 근무 시간 후 의무 휴식과 같은 특정 휴식 규칙을 적용합니다. |
| 도로 제한 | vehicles[].travelMode |
이동 모드 (예: DRIVE 또는 BICYCLE)를 지정합니다. 이렇게 하면 경로가 합법적인 도로로 제한되고 이동 시간을 계산하는 데 사용되는 속도가 결정됩니다. |
목표 매핑
| 실제 목표 | API 매개변수 | 설명 |
|---|---|---|
| 차량 수 최소화 | vehicles[].fixedCost |
차량 사용에 일회성 비용을 적용합니다. 고정 비용이 높으면 경로에서 총 거리 또는 근무 시간을 늘리는 것보다 더 적은 차량을 사용하는 것을 우선시합니다. |
| 거리 최소화 | vehicles[].costPerKilometer |
이동한 모든 킬로미터에 비용을 적용합니다. 연료와 마모를 절약하기 위해 더 짧은 경로를 우선시합니다. |
| 총 시간 최소화 | vehicles[].costPerHour |
이동 시간 및 대기 시간을 포함하여 차량이 활성 상태인 모든 시간에 비용을 적용합니다. 더 빠른 완료를 우선시합니다. |
| 운전 시간 최소화 | vehicles[].costPerTraveledHour |
이동에 소요되는 시간에만 비용을 적용합니다. 이렇게 하면 교통 체증에 갇혀 있는 것 (비용이 많이 듦)과 정류장에서 대기하는 것(잠재적으로 더 저렴함)을 구분할 수 있습니다. |
| 특정 작업 우선순위 지정 | shipments[].penaltyCost |
특정 배송이 건너뛰어지면 비용을 적용합니다. 이 값을 높게 설정하면 선택사항보다 중요한 작업이 우선시됩니다. |
요청 생성 및 응답 가져오기
경로 최적화 API를 사용하여 경로 계획을 생성하는 데는 다음 단계가 포함됩니다.
- 환경 구성: Google Cloud 프로젝트를 설정하고 API를 사용 설정하고 인증을 구성합니다. 자세한 내용은 Getting started를 참고하세요. 이 단계는 한 번만 따라 하면 됩니다.
- 요청 전송: 이전 섹션에서 정의한 데이터 매핑을 사용하여 요청 본문을 구성합니다. 엔드포인트, 헤더, 요청 형식 지정에 관한 자세한 내용은 API 요청 만들기를 참고하세요.
- 응답 이해: API에서 응답을 받으면 경로 계획과 각 매개변수의 의미를 이해합니다. 응답 해석 을 참고하세요.
경로 계획 개선
실제 물류를 API 비용 및 제약 조건으로 변환하는 것은 복잡한 작업입니다. 초기 경로 계획이 비즈니스 목표 또는 운전자 기대치와 일치하지 않을 수 있습니다. 경로 계획 개선은 반환된 경로를 테스트하고 목표를 달성하는 설정을 찾을 때까지 매개변수를 조정하는 반복적인 프로세스입니다.
목표 및 제약 조건 조정
생성된 경로 계획이 요구사항을 충족하지 않는 경우 특정 매개변수를 수정하여 다른 결과를 얻을 수 있습니다. 매개변수를 강화하거나 완화하면 경로 계획에서 상충되는 목표가 해결되는 방식이 변경되며, 매개변수를 완화하는 것은 경로 계획에서 오류를 일으키는 매개변수를 찾는 효율적인 방법입니다.
다음 표에는 일반적인 라우팅 문제와 이를 해결하기 위해 조정할 수 있는 매개변수가 나와 있습니다.
| 시나리오 | 매개변수 | 조정 | 설명 |
|---|---|---|---|
| 중요한 배송이 건너뛰어짐 | shipments[].penaltyCost |
값을 늘리거나 다른 배송에 벌금 비용 추가 | 배송이 선택사항인 경우 벌금 비용을 늘려 우선순위를 지정합니다. 배송이 필수인 경우 (벌금 비용이 없음) 중요도가 낮은 다른 배송에 벌금 비용을 추가합니다. 이렇게 하면 선택사항이 되므로 중요한 배송을 위한 차량 시간과 용량이 확보됩니다. |
| 시간 때문에 배송이 건너뛰어짐 | softStartTime / softEndTime |
소프트 기간 추가 | 엄격한 기간은 1분이라도 늦은 작업을 삭제합니다. 소프트 기간을 사용하면 운전자가 과제를 실패하는 대신 '비용'을 지불하여 약간 늦게 도착할 수 있습니다. |
| 무게 때문에 배송이 건너뛰어짐 | loadLimits[].softMaxLoad 및 costPerUnitAbove |
소프트 부하 요구사항 추가 | 차량이 패키지를 남겨두는 대신 이상적인 용량을 약간 초과할 수 있습니다 (벌금). |
| 차량 과부하로 인해 배송이 건너뛰어짐 | model.vehicles[] 또는 shipments[].timeWindows |
차량 추가 또는 기간 완화 | 특히 피크 시간대에 현재 차량에 비해 배송이 너무 많은 경우 차량을 추가하거나 배송 기간을 넓혀 워크로드를 분산합니다. |
| 경로가 너무 길거나 비효율적임 | vehicles[].costPerKilometer / costPerHour |
비용 추가 또는 값 늘리기 | 이동 비용이 많이 든다고 API에 알리면 멀리 떨어진 격리된 정류장을 삭제하여 차량의 경로를 더 좁게 만들 수 있습니다. |
| 운전자 교대 근무가 너무 김 | vehicles[].routeDurationLimit 또는 model.vehicles[] |
기간 한도 추가 또는 차량 및 한도 추가 | 운전자가 도로에서 보내는 총 시간에 엄격한 한도 (예: 8시간)를 적용합니다. 차량만 추가하면 솔버가 더 큰 차량에 워크로드를 분산하도록 기간 한도를 적용하지 않는 한 경로가 단축되지 않습니다. |
경로 계획 업데이트
활성 운전자의 일정에 픽업을 추가하는 등 기본은 동일하게 유지하면서 경로 계획을 업데이트해야 하는 경우가 많습니다. 이렇게 하려면 이전 솔루션을 기반으로 API에 시작을 제공하여 처음부터 새로 계산하는 대신 기존 계획을 수정할 수 있는 삽입 매개변수를 사용합니다.
다음은 삽입 매개변수를 사용하여 경로 계획을 업데이트하는 여러 가지 방법입니다.
- 이전 응답 의 경로를 새 요청의
injectedFirstSolutionRoutes필드에 전달합니다. 이렇게 하면 최적화 검색 속도가 빨라지고 막바지 배송 통합과 같이 일상적인 운영이 시작되기 전에 다시 계획하는 데 유용합니다. injectedSolutionConstraint필드를 사용하여 변경 정도 를 제어합니다. 운영이 이미 진행 중일 때 유용하며 운전자의 현재 순서를 유지하거나 이미 실행된 계획의 일부를 수정할 수 있습니다.interpretInjectedSolutionsUsingLabels를true로 설정하여 업데이트된 경로가 올바른 차량 에 계속 할당되도록 합니다. 배송 및 차량을 추가하거나 삭제할 때 유용하며 색인 대신 라벨을 사용하여 경로를 일치시킵니다. 이렇게 하려면 모든 차량 및 배송 라벨이 고유해야 합니다.
경로 계획 통합
최종 경로 계획은 제약 조건과 목표를 따르면서 리소스와 작업을 최적화하여 관리하는 것을 나타내는 데이터 객체입니다. 시스템에 통합하여 일상적인 운영에서 이 경로 계획을 사용합니다. 일반적으로 차량 관리자를 위한 경로 계획을 시각화하고 운전자에게 세부 경로 안내를 전달하는 것이 포함됩니다.
시각화
차량 관리자가 경로 계획을 확인하고 모니터링할 수 있도록 다음과 같은 방법으로 경로 계획을 시각화할 수 있습니다.
차량 관리자가 경로 계획을 확인하고 모니터링할 수 있도록 대시보드 지도에 표시할 수 있습니다. 현재 개발 단계에 따라 다음과 같은 방법으로 경로 계획을 시각화할 수 있습니다.
- 코드 없이 탐색: 오픈소스 경로 최적화 앱을 사용하여 API가 데이터를 지도상의 실제 경로로 변환하는 방법을 확인할 수 있습니다. 이 웹 애플리케이션은 코드를 작성하기 전에 시나리오를 구성하고, 제약 조건 매개변수를 조정하고, 결과 경로 계획을 시각적으로 렌더링할 수 있는 탐색 도구 역할을 합니다.
- 방문 순서 표시: 지도에 방문 순서를 번호가 매겨진 점으로 표시하여 자체 시스템에서 최적화 및 배차 계획을 평가할 수 있습니다. 이렇게 하려면 API 응답의 각 경로 내에서
visits배열을 찾습니다. 이 배열의 항목은 운전자가 실행해야 하는 순서와 정확히 동일하게 정렬됩니다. 이 목록을 반복하고shipmentIndex를 사용하여 각 정류장의 위치 좌표를 가져오고 매핑 라이브러리를 사용하여 목록의 순서에 따라 지도에 번호가 매겨진 마커를 렌더링할 수 있습니다. - 실제 경로 그리기: 지도에서 정확한 계획된 경로를 시각화하여 최적화 도구가 특정 순서를 선택한 이유를 파악할 수 있습니다. 이 폴리라인은 운전자가 사용하는 실시간 경로가 아니라 계획 및 평가를 위한 의도된 경로를 나타냅니다. 요청에서
populatePolylines: true를 설정하여 각 경로의encodedPolyline필드를 가져오고google.maps.geometry.encoding.decodePath()메서드를 사용하여 Maps JavaScript API에서 디코딩합니다.
운전자에게 배차
Navigation SDK를 사용하여 세부 경로 안내를 운전자 애플리케이션에 통합하거나 Google 지도 소비자 앱에 딥 링크를 제공할 수 있습니다.
- Navigation SDK: 맞춤 운전자 애플리케이션이 있는 경우 인앱 세부 경로 안내를 위해
Android 또는
iOS용 Navigation SDK를 통합할 수 있습니다.
API 응답의 작업 정보를 시스템에 통합하고 탐색을 위해 SDK를 사용할 수 있습니다. API 응답의 경로를 SDK에 전달하려면 요청에서
populateTransitionPolylines: true를 설정합니다. 이렇게 하면 응답의 각 전환에routeToken이 생성됩니다. - Fleet Engine: 고급 차량 관리를 위해 API에서 생성된 경로 계획을 Fleet Engine으로 가져와 경로 실행을 실시간으로 모니터링할 수 있습니다. API는 평가를 위해 의도된 경로의 다중선을 제공하지만 Fleet Engine은 계획된 방문 순서를 실시간 차량 추적과 페어링합니다.