수령 및 배달에 관한 기본적인 주문 중단 주문 최적화

이 시나리오는 간단한 비용 매개변수를 사용하여 차량에 할당된 정류장 순서를 최적화합니다. 이것은 경로 최적화 작업의 가장 간단한 모드입니다. 지정된 기간 내에 모든 정류장이 방문되도록 합니다.

다음 예는 차량 한 대와 세 대의 차량이 있는 기본 시나리오를 보여줍니다. 모든 배송이 depot라고 하는 단일 위치에서 배송됩니다.

요청 예 보기

      {
        "populatePolylines": true,
        "populateTransitionPolylines": true,
        "model": {
          "globalStartTime": "2023-01-13T16:00:00-08:00",
          "globalEndTime": "2023-01-14T16:00:00-08:00",
          "shipments": [
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789456,
                    "longitude": -122.390192
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789116,
                    "longitude": -122.395080
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.795242,
                    "longitude": -122.399347
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            }
          ],
          "vehicles": [
            {
              "endLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "startLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "costPerKilometer": 10.0,
              "costPerHour": 40.0
            }
          ]
        }
      }
    

경로 최적화 요청 필드

개요의 설명대로, 가장 중요한 경로 최적화 요청은 속성은 vehiclesshipments입니다.

차량 및 배송 외에도 요청에는 다음이 포함됩니다. 필드:

다중선

populatePolylinespopulateTransitionPolylines는 Routes 최적화 시 다중선을 반환해야 합니다.

이 서비스는 바이너리 폴리라인 데이터를 사용합니다. 이 대화형 폴리라인 인코더 유틸리티를 사용하면 경로 최적화. 이 가이드의 예는 populatePolylinespopulateTransitionPolylines를 true로 설정했지만 다른 가이드에서는 이를 false로 설정했습니다. 응답 크기를 줄입니다

인코딩 형식에 대한 설명은 인코딩된 폴리라인 알고리즘 형식을 참고하세요.

전 세계 시간 제한

model.globalStartTimemodel.globalEndTime가 임의의 24로 설정됩니다. 1시간 단위입니다. 이렇게 하면 출력 타임스탬프를 더 쉽게 해석할 수 있습니다.

매장 방문

요청 예에서는 model.shipments[].pickups[].arrivalLocationmodel.shipments[].deliveries[].arrivalLocation입니다. 또한 차량이 다음 위치에서 출발하는 상황의 departureLocation 속성 입구가 있는 주차장 단지처럼 목적지가 도착하는 곳과 다른 지점 다른 쪽에는 출구가 있습니다 이번 및 이후 도착 지점과 출발 지점은 동일한 것으로 가정합니다.

latLng 대신 도착 및 출발 waypoint도 이용할 수 있습니다. Waypoint 필드는 LatLng 대신 Google 장소 ID를 사용할 수 있도록 지원합니다. 차량 제목을 지정할 수도 있습니다. 참조 문서 보기 (REST, gRPC)를 참조하세요.

예시의 제약조건

이 시나리오에서는 여러 가지 방법으로 옵티마이저를 제한합니다.

  1. 모든 활동은 전역 시작 시간과 종료 시간 사이에 완료되어야 합니다. 이 시나리오에서는 시작 시간과 종료 시간이 매우 느슨합니다. 글로벌 배송 기간을 크게 단축할 수 있습니다.
  2. 모든 배송이 완료되어야 합니다. 이것은 shipments에 위약금 비용이 지정되지 않았습니다.
  3. 차량에 costPerKilometercostPerHour가 설정되어 있습니다.

비용은 비용 모델 매개변수에서 다룹니다.

경로 최적화 응답 속성

예시 요청에 대한 응답 보기

    {
      "routes": [
        {
          "vehicleStartTime": "2023-01-14T00:00:00Z",
          "vehicleEndTime": "2023-01-14T00:36:41Z",
          "visits": [
            {
              "shipmentIndex": 2,
              "isPickup": true,
              "startTime": "2023-01-14T00:00:00Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "isPickup": true,
              "startTime": "2023-01-14T00:02:30Z",
              "detour": "150s"
            },
            {
              "isPickup": true,
              "startTime": "2023-01-14T00:05:00Z",
              "detour": "300s"
            },
            {
              "startTime": "2023-01-14T00:11:25Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "startTime": "2023-01-14T00:19:29Z",
              "detour": "503s"
            },
            {
              "shipmentIndex": 2,
              "startTime": "2023-01-14T00:29:02Z",
              "detour": "1324s"
            }
          ],
          "transitions": [
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:00:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:02:30Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:05:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "235s",
              "travelDistanceMeters": 795,
              "waitDuration": "0s",
              "totalDuration": "235s",
              "startTime": "2023-01-14T00:07:30Z",
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "travelDuration": "234s",
              "travelDistanceMeters": 793,
              "waitDuration": "0s",
              "totalDuration": "234s",
              "startTime": "2023-01-14T00:15:35Z",
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "travelDuration": "323s",
              "travelDistanceMeters": 1204,
              "waitDuration": "0s",
              "totalDuration": "323s",
              "startTime": "2023-01-14T00:23:39Z",
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "travelDuration": "209s",
              "travelDistanceMeters": 665,
              "waitDuration": "0s",
              "totalDuration": "209s",
              "startTime": "2023-01-14T00:33:12Z",
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "routePolyline": {
            "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
          },
          "metrics": {
            "performedShipmentCount": 3,
            "travelDuration": "1001s",
            "waitDuration": "0s",
            "delayDuration": "0s",
            "breakDuration": "0s",
            "visitDuration": "1200s",
            "totalDuration": "2201s",
            "travelDistanceMeters": 3457
          },
          "travelSteps": [
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "227s",
              "distanceMeters": 794,
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "duration": "233s",
              "distanceMeters": 791,
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "duration": "322s",
              "distanceMeters": 1205,
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "duration": "208s",
              "distanceMeters": 666,
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "vehicleDetour": "2201s",
          "routeCosts": {
            "model.vehicles.cost_per_hour": 24.455555555555556,
            "model.vehicles.cost_per_kilometer": 34.57
          },
          "routeTotalCost": 59.025555555555556
        }
      ],
      "totalCost": 59.025555555555556,
      "metrics": {
        "aggregatedRouteMetrics": {
          "performedShipmentCount": 3,
          "travelDuration": "1001s",
          "waitDuration": "0s",
          "delayDuration": "0s",
          "breakDuration": "0s",
          "visitDuration": "1200s",
          "totalDuration": "2201s",
          "travelDistanceMeters": 3457
        },
        "usedVehicleCount": 1,
        "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
        "latestVehicleEndTime": "2023-01-14T00:36:41Z",
        "totalCost": 59.025555555555556,
        "costs": {
          "model.vehicles.cost_per_kilometer": 34.57,
          "model.vehicles.cost_per_hour": 24.455555555555556
        }
      }
    }
    

경로 최적화 응답에는routes 차량당 하나의 경로가 포함된 제안된 경로를 나타냅니다. 예를 들어 요청의 요청은 하나의 차량만 지정합니다. routes에는 하나의 차량이 포함됩니다. ShipmentRoute 메시지

숙박 시설 ShipmentRoute

ShipmentRoute 메시지 유형의 가장 중요한 두 가지 속성은 visitstransitions입니다.

Visit는 다음 위치에서의 수령 또는 배달 완료를 나타냅니다. 요청 메시지의 VisitRequest입니다. 방문은 실질적으로 업무가 할당된 특정 장소와 시간에 차량으로 완료하는 것입니다.

Transition는 한 위치에서 다음 위치로 이동하는 차량을 나타냅니다. 있습니다. 전환은 한 쌍의 차량이 출발 지점인 도착한 후 위치, 차량의 종점입니다.

차량의 전체 경로를 재구성하려면 ShipmentRoutevisitstransitions를 결합해야 합니다. 차량 활동의 진행 중인 필드 조합은 다음과 같습니다.

request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation

ShipmentRoute에는 항상 visits보다 하나 이상의 transitions가 있습니다. 차량이 시작 위치에서 첫 번째 방문 지점까지 이동해야 합니다. 마지막 방문에서 출발하여 도착 지점까지 있습니다. 차량에 시작 위치 또는 종료 위치가 없는 경우에도 visits보다 transitions가 하나 더 많습니다. 첫 번째 또는 마지막 방문 위치가 차량의 시작 위치 또는 종료 위치로 각각 사용되기 때문입니다.

이 예에서는 처음 3회의 수령 방문과 그 사이에 전환이 발생합니다. 세 개의 승차 위치가 모두 요청할 때 동일한 위치를 공유합니다.

자세한 내용은 ShipmentRoute 참조 문서 (REST, gRPC)를 확인하세요. 자세히 알아보세요.

간단한 경유지 순서 최적화

이 예에서 볼 수 있듯이 경로 최적화 모델은 방문을 배송의 속성으로 모델링하며 독립된 항목으로 중간 지점 또는 정류장을 포함하지 않습니다. 하지만 VisitRequest을 픽업 또는 배송으로 정확히 하나만 사용하여 중간 정류장 또는 중간 지점을 배송으로 나타낼 수 있습니다. 차량이 여전히 옵티마이저가 costPerHour 또는 costPerKilometer를 할당해야 합니다. 최적의 경로를 찾습니다.