Route Optimization API trả về các tuyến đường cho xe trong yêu cầu tương ứng. Các lô hàng được chỉ định cho xe hoặc có thể bị bỏ qua tuỳ thuộc vào các thuộc tính của yêu cầu.
Tin nhắn OptimizeToursResponse (REST, gRPC) có hai thuộc tính cấp cao nhất chính:
routes[]là các tuyến đường cho mỗi xe với các lô hàng được chỉ định. MỗiRoutechứa các chỉ số phản ánh các thuộc tính của tuyến đường riêng lẻ đó.metricslà các chỉ số tổng hợp cho toàn bộ phản hồi, trên tất cả các xe và kế hoạch tuyến. Các chỉ số cấp cao nhất chứa các thuộc tính giống như các chỉ số trên mỗi Tuyến, với các giá trị được tổng hợp trên tất cả các Tuyến.
Một số thuộc tính có thể không phải lúc nào cũng được điền sẵn, tuỳ thuộc vào kết quả tối ưu hoá:
skippedShipments[]liệt kê các lô hàng không do bất kỳ phương tiện nào thực hiện. Bạn có thể bỏ qua một lô hàng nếu không thể thực hiện lô hàng đó trong các giới hạn đã chỉ định hoặc nếu chi phí thực hiện lô hàng đó vượt quá chi phí phạt. Ví dụ: nếu một lô hàng được lấy hàng hoặc giao hàng cótimeWindowrất hẹp, thì có thể xe không thể thực hiện chuyến thăm trong khung thời gian bắt buộc hoặc không hiệu quả về chi phí.validationErrors[]chỉ định các lỗi khiến yêu cầu không hợp lệ hoặc không thể giải quyết khisolvingModecủa yêu cầu được đặt thànhVALIDATE_ONLY. Ở chế độDEFAULT_SOLVEthông thường, lỗi xác thực sẽ xuất hiện trong thông báo lỗi thay vì nội dung phản hồi. Xin lưu ý rằng chế độ giải quyếtVALIDATE_ONLYcó thể báo cáo nhiều lỗi cùng một lúc, điều này rất hữu ích để gỡ lỗi nhanh các yêu cầu.
Thuộc tính tuyến đường
Mỗi mục nhập routes[] là một thông báo ShipmentRoute (REST, gRPC). Mỗi ShipmentRoute đại diện cho việc chỉ định tuyến cho một xe cụ thể từ yêu cầu. Các thuộc tính ShipmentRoute quan trọng liên quan đến Vehicle tương ứng bao gồm:
vehicleIndexlà chỉ mục dựa trên 0 củaVehicletrong thông báo yêu cầu tương ứng. Các phản hồi REST sẽ bỏ qua thuộc tính này khi giá trị là 0.vehicleStartTimelà thời điểm xe phải bắt đầu hành trình.vehicleEndTimelà thời điểm dự kiến xe hoàn thành chặng đường.
Trong phản hồi, routes sẽ có dạng như sau:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
Mỗi ShipmentRoute bao gồm một danh sách visits theo thứ tự mà xe sẽ hoàn thành. Mỗi Visit (REST, gRPC) đại diện cho một VisitRequest (REST, gRPC) từ yêu cầu tương ứng. Các thuộc tính Visit quan trọng bao gồm:
shipmentIndexlà chỉ mục bắt đầu từ 0 của lô hàng mà lượt truy cập này thuộc về trong yêu cầu tương ứng.isPickuplà true khi lượt truy cập là lượt đến lấy hàng và là false khi lượt truy cập là lượt giao hàng. Các phản hồi REST sẽ bỏ qua thuộc tính này khi giá trị là false.visitRequestIndexlà chỉ mục dựa trên 0 củaVisitRequesttừShipment.pickupshoặcShipment.deliveriestrong yêu cầu tương ứng màVisitđại diện. Các phản hồi REST bỏ qua thuộc tính này khi giá trị bằng 0.startTimelà thời gian dự kiến bắt đầu lượt truy cập.loadDemandsliên kết loại tải với lượng tải cần thiết để hoàn tấtVisit. Số lượng tải là số âm đối với các lượt ghé thăm giao hàng, thể hiện tải đang được lấy ra khỏi xe.
Ví dụ về Visit:
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
Mỗi ShipmentRoute bao gồm một danh sách transitions theo thứ tự đại diện cho hành trình giữa visits cho một xe nhất định. Các thuộc tính quan trọng của thông báo Transition (REST, gRPC) bao gồm:
startTimelà thời điểm xe bắt đầu thực hiện quá trình chuyển đổi.travelDurationlà thời lượng mà xe phải di chuyển để hoàn tất quá trình chuyển đổi.travelDistanceMeterslà quãng đường tính bằng mét mà xe phải di chuyển để hoàn tất quá trình chuyển đổi.trafficInfoUnavailablecho biết liệu có dữ liệu lưu lượng truy cập cho quá trình chuyển đổi hay không.waitDurationthể hiện thời gian rảnh mà xe dành để chờ trước khi có thể khởi độngVisittiếp theo. Điều này có thể xảy ra dostart_timecủaVisitsau đây.totalDurationlà tổng thời lượng của quá trình chuyển đổi, bao gồm cả thời gian di chuyển, thời gian chờ, thời gian nghỉ và thời gian trễ.vehicleLoadsliên kết loại tải với lượng tải mà xe mang theo trong quá trình chuyển đổi này.
Ví dụ về Transition:
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
Để biết thêm thông tin về mối quan hệ giữa vists và transitions, hãy xem phần Tối ưu hoá đơn đặt hàng tại điểm đến lấy hàng và giao hàng và tài liệu tham khảo về ShipmentRoute (REST, gRPC). Để biết thêm thông tin về các thuộc tính routePolyline và routeToken của thông báo Transition, hãy xem phần Đường đa tuyến chuyển đổi và mã thông báo tuyến.
Thuộc tính chỉ số
Thông báo Metrics (REST, gRPC) tóm tắt toàn bộ giải pháp.
Một số thuộc tính Metrics quan trọng bao gồm:
totalCostlà tổng chi phí phát sinh khi hoàn tất các tuyến. Đọc thêm về chi phí trong phần Thông số mô hình chi phí.usedVehicleCountlà tổng số xe được sử dụng trong giải pháp. Xe có thể có tuyến trống khi trình tối ưu hoá xác định rằng không cần sử dụng xe.skippedMandatoryShipmentCountlà số lượng đơn hàng bị bỏ qua là "bắt buộc". Một lô hàng bắt buộc không chỉ địnhpenaltyCostphát sinh nếu lô hàng bị bỏ qua. Bạn vẫn có thể bỏ qua các lô hàng bắt buộc nếu hiệu suất của lô hàng không khả thi trong các điều kiện ràng buộc đã chỉ định. Hãy đọc thêm về chi phí trong phần Thông số mô hình chi phí.
Các chỉ số bổ sung được báo cáo dưới dạng thông báo AggregatedMetrics (REST, gRPC). Loại thông báo AggregatedMetrics được dùng cho thuộc tính Metrics.aggregatedRouteMetrics và cho thuộc tính ShipmentRoute.metrics. Metrics.aggregatedRouteMetrics chứa các chỉ số được tổng hợp trên tất cả ShipmentRoute trong OptimizeToursResponse. Mỗi thuộc tính ShipmentRoute.metrics chứa các chỉ số cho ShipmentRoute cụ thể đó.
Các thuộc tính AggregatedMetrics quan trọng bao gồm:
performedShipmentCountlà số lượng chuyến hàng do xe thực hiện trên toàn bộ tuyến đường.travelDurationlà tổng thời gian xe di chuyển trong khi hoàn thành tuyến đường.waitDurationlà tổng thời gian xe chờ trong khi hoàn thành các tuyến đường.delayDurationlà tổng thời gian trễ của các phương tiện. Giá trị này thường là 0 trừ phiTransitionAttributesđược sử dụng trong yêu cầu.breakDurationlà tổng thời gian xe nghỉ trong khi hoàn thành tuyến đường.visitDurationlà tổng thời gian xe thực hiện các lượt ghé thăm trong khi hoàn thành tuyến đường. Đây thực sự là tổng của tất cả giá trịVisitRequest.durationchoVisitRequesttương ứng vớiVisitđược chỉ định cho xe hiện hành.totalDurationlà tổng thời lượng cần thiết để hoàn tất các tuyến của xe.travelDistanceMeterslà tổng quãng đường mà các phương tiện đã đi trong khi hoàn thành tuyến đường.maxLoadsliên kết các loại tải với lượng tải tối đa mà xe chở tại bất kỳ điểm nào trên tuyến đường của chúng.
Ví dụ về thông báo Metrics:
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
Ví dụ đầy đủ
Ví dụ về phản hồi đầy đủ cho yêu cầu từ phần Tạo yêu cầu có dạng như sau:
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}