Diễn giải câu trả lời

API Tối ưu hoá tuyến đường trả về tuyến đường cho xe theo yêu cầu tương ứng. Lô hàng được chỉ định cho xe hoặc có thể bị bỏ qua tuỳ thuộc vào thuộc tính của yêu cầu.

Thông báo OptimizeToursResponse (REST, gRPC) có hai thuộc tính chính cấp cao nhất:

  • routes[] là tuyến đường của từng xe với các lô hàng được chỉ định. Mỗi Route chứa các chỉ số phản ánh các thuộc tính của tuyến riêng đó.
  • metrics là các chỉ số tổng hợp cho toàn bộ nội dung phản hồi trên tất cả các xe và kế hoạch tuyến đường. Chỉ số cấp cao nhất chứa các thuộc tính giống với chỉ số cho mỗi 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ố tài sản 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á:

  1. skippedShipments[] liệt kê các lô hàng không phải do bất kỳ phương tiện nào thực hiện. Lô hàng có thể bị bỏ qua nếu không thể thực hiện trong các điều kiện ràng buộc đã chỉ định hoặc nếu chi phí để thực hiện quá trình vận chuyển vượt quá chi phí phạt. Ví dụ: nếu quy trình đến lấy hàng hoặc giao hàng của một lô hàng có timeWindow rất hẹp, thì điều đó có thể không hiệu quả hoặc không hiệu quả về chi phí để xe thực hiện lượt ghé thăm trong khoảng thời gian bắt buộc.
  2. 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 khi solvingMode của yêu cầu được đặt thành VALIDATE_ONLY. Ở chế độ DEFAULT_SOLVE thông thường, lỗi xác thực sẽ xuất hiện trong một thông báo lỗi thay vì nội dung phản hồi. Xin lưu ý rằng chế độ phân giải VALIDATE_ONLY có thể báo cáo nhiều lỗi cùng một lúc. Điều này rất hữu ích trong việc gỡ lỗi các yêu cầu một cách nhanh chóng.

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 hoạt động chỉ định tuyến đường cho một xe cụ thể theo yêu cầu. Các thuộc tính ShipmentRoute quan trọng liên quan đến Vehicle tương ứng của nó bao gồm:

  • vehicleIndex là chỉ mục dựa trên 0 của Vehicle trong thông báo yêu cầu tương ứng. Phản hồi REST bỏ qua thuộc tính này khi giá trị bằng 0.
  • vehicleStartTime là thời gian khi xe phải bắt đầu tuyến đường.
  • vehicleEndTime là thời gian dự kiến xe sẽ hoàn thành tuyến đường.

Trong tin nhắn 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 sẽ bao gồm một danh sách visits theo thứ tự mà xe sẽ hoàn tất. Mỗi Visit (REST, gRPC) đại diện cho một VisitRequest (REST, gRPC) trong yêu cầu tương ứng. Các thuộc tính quan trọng của Visit bao gồm:

  • shipmentIndex là chỉ mục dựa trên 0 của lô hàng mà lượt truy cập này thuộc về yêu cầu tương ứng.
  • isPickup đúng khi lượt truy cập vào là một lượt đến lấy hàng và sai khi lượt truy cập là một lượt giao hàng. Phản hồi REST bỏ qua thuộc tính này khi giá trị là false.
  • visitRequestIndex là chỉ mục dựa trên 0 của VisitRequest từ Shipment.pickups hoặc Shipment.deliveries trong yêu cầu tương ứng mà Visit đại diện. Phản hồi REST bỏ qua thuộc tính này khi giá trị bằng 0.
  • startTime là thời gian dự kiến lượt ghé thăm sẽ bắt đầu.
  • loadDemands liên kết loại tải cần thiết để hoàn tất Visit. Số lượng tải là số âm đối với các lượt giao hàng, thể hiện tải trọng đang được loại bỏ khỏi xe.

Ví dụ về Visit sẽ có dạng như sau:

{
  "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ự thể hiện việc di chuyển giữa visits của một loại xe cụ thể. Các thuộc tính thông báo Transition quan trọng (REST, gRPC) bao gồm:

  • startTime là thời điểm mà xe sẽ bắt đầu thực hiện quá trình chuyển đổi.
  • travelDuration là khoảng thời gian mà xe phải di chuyển để hoàn tất quá trình chuyển đổi.
  • travelDistanceMeters là 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.
  • trafficInfoUnavailable cho biết liệu dữ liệu lưu lượng truy cập có sẵn để chuyển đổi hay không.
  • waitDuration thể hiện thời gian không hoạt động mà xe dành để chờ trước khi có thể bắt đầu Visit tiếp theo. Điều này có thể xảy ra do start_time của Visit sau.
  • totalDuration là tổng thời lượng của quá trình chuyển đổi, bao gồm thời gian di chuyển, chờ, nghỉ và trì hoãn.
  • vehicleLoads liên kết loại tải trọng với lượng tải mà xe mang theo trong quá trình chuyển đổi này.

Ví dụ về Transition sẽ có dạng như sau:

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

Mối quan hệ giữa viststransitions được mô tả trong phần Tối ưu hoá đơn đặt hàng đến lấy hàng và ngừng giao hàng, cũng như trong tài liệu tham khảo về ShipmentRoute (REST, gRPC).

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:

  • totalCost là 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í.
  • usedVehicleCount là tổng số xe được dùng trong giải pháp. Xe có thể có tuyến đường trống khi trình tối ưu hoá xác định rằng việc sử dụng của chúng là không cần thiết.
  • skippedMandatoryShipmentCount là số lượng lô hàng bị bỏ qua mang tính "bắt buộc". Lô hàng bắt buộc không chỉ định penaltyCost sẽ phải chịu nếu gói 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 không khả thi trong các điều kiện ràng buộc đã chỉ định. Đọc thêm về chi phí trong Các 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 sử 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ả cá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:

  • performedShipmentCount là số lượng chuyến hàng mà các phương tiện thực hiện trên toàn bộ tuyến đường của họ.
  • travelDuration là tổng thời gian mà xe dành cho quá trình di chuyển trong khi hoàn thành tuyến đường.
  • waitDuration là tổng thời gian mà các xe dành ra để chờ trong khi hoàn thành tuyến đường.
  • delayDuration là tổng thời gian trễ của các xe. Giá trị này thường bằng 0 trừ phi TransitionAttributes được dùng trong yêu cầu.
  • breakDuration là tổng thời gian mà các xe dành cho thời gian nghỉ giải lao trong khi hoàn thành tuyến đường.
  • visitDuration là tổng thời gian mà các xe dành để 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ả giá trị VisitRequest.duration cho VisitRequest tương ứng với Visit được chỉ định cho xe thích hợp.
  • totalDuration là tổng thời gian cần thiết để hoàn tất tuyến đường của xe.
  • travelDistanceMeters là tổng quãng đường mà xe đã đi trong khi hoàn thành tuyến đường.
  • maxLoads liên kết các loại tải trọng với tải trọng tối đa mà xe chở được tại bất kỳ điểm nào trên tuyến đường.

Thông báo Metrics mẫu sẽ có dạng như sau:

{
  "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 đủ

Phản hồi mẫu hoàn chỉnh cho yêu cầu từ Tạo yêu cầu sẽ 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
    }
  }
}