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ể được bỏ qua tuỳ thuộc vào các thuộc tính của yêu cầu.
Thông báo OptimizeToursResponse (REST, gRPC) có 2 thuộc tính chính ở cấp cao nhất:
routes[]là các tuyến đường của từng xe có lô hàng được chỉ định. MỗiRoutechứa các chỉ số phản ánh thuộc tính của từng 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 phương tiện và kế hoạch tuyến đường. Các chỉ số cấp cao nhất có cùng thuộc tính với các chỉ số theo Tuyến đường, với các giá trị được tổng hợp trên tất cả các Tuyến đường.
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ê những lô hàng không được vận chuyển bằng bất kỳ phương tiện nào. Bạn có thể bỏ qua một lô hàng nếu không thể thực hiện trong các ràng buộc đã 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ó thời giantimeWindownhận hoặc giao hàng rất ngắn, thì có thể xe không thể thực hiện chuyến ghé thăm trong khung thời gian bắt buộc hoặc không hiệu quả về chi phí.validationErrors[]chỉ định những 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 hữu ích cho việc 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 đường cho một chiếc xe cụ thể trong 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ị bằng 0.vehicleStartTimelà thời gian mà xe phải bắt đầu hành trình.vehicleEndTimelà thời gian dự kiến xe sẽ hoàn thành tuyến đường.
Trong câu trả lờ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 có thứ tự các visits 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 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 và 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.loadDemandsánh xạ loại tải với lượng tải cần thiết để hoàn thànhVisit. Số lượng hàng hoá được tải là số âm đối với các lượt ghé thăm để giao hàng, thể hiện số lượng hàng hoá được dỡ 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 có thứ tự gồm các transitions đại diện cho hành trình giữa visits của một chiếc 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 gian mà xe sẽ bắt đầu thực hiện quá trình chuyển đổi.travelDurationlà khoảng thời gian mà xe phải di chuyển để hoàn tất quá trình chuyển đổi.travelDistanceMeterslà khoảng cách 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 giao thông cho quá trình chuyển đổi hay không.waitDurationbiểu thị thời gian chờ mà xe phải trải qua trước khi có thể bắt đầuVisittiế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, chờ đợi, nghỉ ngơi và trễ.vehicleLoadsánh xạ loại tải để tải số lượng 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 bài viết Tối ưu hoá thứ tự điểm dừng nhận 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 bài viết Đường nhiều đoạn chuyển tiếp và mã thông báo tuyến đường.
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 thành các tuyến đường. Đọc thêm về chi phí trong Tham số mô hình chi phí.usedVehicleCountlà tổng số xe được sử dụng trong giải pháp. Xe có thể có các tuyến đường trống khi trình tối ưu hoá xác định rằng không cần thiết phải sử dụng các tuyến đường đó.skippedMandatoryShipmentCountlà số lượng lô hàng bị bỏ qua là "bắt buộc". Lô hàng bắt buộc không chỉ địnhpenaltyCostsẽ phát sinh nếu lô hàng bị bỏ qua. Các lô hàng bắt buộc vẫn có thể bị bỏ qua nếu hiệu suất của chúng không khả thi theo các ràng buộc đã chỉ định. Đọc thêm về chi phí trong phần Tham 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 số liệu 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 được xe thực hiện trên toàn bộ tuyến đường của chúng.travelDurationlà tổng thời gian các xe di chuyển trong quá trình hoàn thành tuyến đường.waitDurationlà tổng thời gian các xe chờ đợi 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 dùng trong yêu cầu.breakDurationlà tổng thời gian các xe dừng nghỉ trong khi hoàn thành tuyến đường.visitDurationlà tổng thời gian các xe dành ra để thực hiện các lượt ghé thăm trong khi hoàn thành tuyến đường. Đây là tổng của tất cả các giá trịVisitRequest.durationchoVisitRequesttương ứng vớiVisitđược chỉ định cho xe áp dụng.totalDurationlà tổng thời gian cần thiết để hoàn thành các tuyến đường của xe.travelDistanceMeterslà tổng quãng đường mà các xe đã đi trong khi hoàn thành tuyến đường.maxLoadsánh xạ các loại tải trọng với lượng tải trọng tối đa mà xe có thể chở tại bất kỳ thời điểm nào trên tuyến đườ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 đủ
Một phản hồi mẫu hoàn chỉnh cho yêu cầu từ 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
}
}
}