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

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 phương tiện vận chuyển 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ó hai cấp cao nhất chính thuộc tính:

  • routes[] là tuyến đường của mỗi chiếc xe có lô hàng được chỉ định. Một Route chứa các chỉ số phản ánh thuộc tính của tuyến đường riêng lẻ đó.
  • metrics là 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ố tài sản 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á:

  1. skippedShipments[] liệt kê các lô hàng không do bất kỳ loại xe nào thực hiện. Một kiện hàng có thể bị bỏ qua nếu không thể thực hiện trong quy định hoặc nếu chi phí để thực hiện việc vận chuyển vượt quá chi phí phạt. Ví dụ: nếu phạm vi nhận hàng hoặc giao hàng của một gói hàng rất hẹp timeWindow có thể không phù hợp hoặc không tiết kiệm chi phí cho một phương tiện di chuyển để thực hiện lượt truy cập trong khoảng thời gian yêu cầu.
  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 được 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 thông báo lỗi thay vì nội dung phản hồi. Lưu ý rằng Chế độ giải quyết của VALIDATE_ONLY có thể báo cáo nhiều lỗi cùng lúc, đó là rất hữu ích để giúp các yêu cầu gỡ lỗi 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ột ShipmentRoute biểu thị việc chỉ định tuyến đường cho một chiếc xe cụ thể từ yêu cầu. Các thuộc tính ShipmentRoute quan trọng liên quan đến tương ứng Vehicle bao gồm:

  • vehicleIndex là chỉ số từ 0 của Vehicle trong giá trị thuộc tính tương ứng tin nhắn yêu cầu. Phản hồi REST sẽ bỏ thuộc tính này khi giá trị bằng 0.
  • vehicleStartTime là thời điểm xe phải bắt đầu tuyến đường.
  • vehicleEndTime là thời điểm xe dự kiến sẽ chạy xong 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 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. Visit quan trọng thuộc tính bao gồm:

  • shipmentIndex là chỉ số từ 0 của lô hàng chứa chuyến ghé thăm này trong yêu cầu tương ứng.
  • isPickup là đúng khi một lượt ghé thăm là đến lấy hàng và sai khi lượt ghé thăm là một lượt ghé thăm của bạn. Các phản hồi REST sẽ 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 biểu thị. Phản hồi REST bỏ thuộc tính này khi có giá trị bằng 0.
  • startTime là thời gian dự kiến bắt đầu lượt truy cập.
  • loadDemands liên kết loại tải với tải cần thiết để hoàn thành Visit. Số lượng tải là số âm đối với số lượt truy cập phân phối, thể hiện tải bị lấy ra 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 được sắp xếp theo thứ tự đại diện cho di chuyển trong khoảng visits cho một chiếc xe cụ thể. Thông báo quan trọng Transition Thuộc tính (REST, gRPC) bao gồm:

  • startTime là thời điểm mà xe sẽ bắt đầu thực hiện chuyển đổi.
  • travelDuration là khoảng thời gian mà xe phải đi đến hoàn tất quá trình chuyển đổi.
  • travelDistanceMeters là khoảng cách tính bằng mét mà xe phải đi để hoàn tất quá trình chuyển đổi.
  • trafficInfoUnavailable cho 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.
  • waitDuration biểu thị thời gian xe không hoạt động đang chờ trước khi có thể bắt đầu Visit tiếp theo. Việc này có thể phát sinh do start_time của đang theo dõi Visit.
  • totalDuration là tổng thời gian của quá trình chuyển đổi, bao gồm cả việc đi lại, thời gian chờ, ngắt kết nối và hoãn.
  • vehicleLoads liên kết loại tải trọng với tải trọng xe đã chở trong khoảng thời gian hiệu ứng 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 Tối ưu hoá đơn đặt hàng tự đến lấy và ngừng giao hàng, cũng như trong Tài liệu tham khảo 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 giới thiệu về chi phí trong Thông số mô hình chi phí.
  • usedVehicleCount là tổng số phương tiện được sử 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 xe là không cần thiết.
  • skippedMandatoryShipmentCount là số lượng gói hàng đã bỏ qua "bắt buộc". Một lô hàng bắt buộc không chỉ định penaltyCost phá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 quy tắ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 ShipmentRoute.metrics tài sản Metrics.aggregatedRouteMetrics chứa các chỉ số được tổng hợp trên tất cả ShipmentRoute trong OptimizeToursResponse. Mỗi ShipmentRoute.metrics thuộc tính này 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 hàng vận chuyển do phương tiện vận chuyển thực hiện trên toàn bộ tuyến đường của họ.
  • travelDuration là tổng thời gian xe di chuyển trong khi hoàn thành tuyến đường.
  • waitDuration là tổng thời gian mà xe chờ hoàn tất tuyến đường của mình.
  • delayDuration là tổng thời gian trễ của các phương tiện. Việc này thường 0 trừ phi sử dụng TransitionAttributes trong yêu cầu.
  • breakDuration là tổng thời gian xe nghỉ giải lao trong khi hoàn thành tuyến đường của mình.
  • visitDuration là tổng thời gian mà xe dành để thực hiện các lượt ghé thăm trong khi hoàn thành tuyến đường của mình. Đây thực sự 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 để chạy xong một chiếc xe tuyến đường.
  • travelDistanceMeters là tổng quãng đường xe đã đi được trong khi hoàn thành tuyến đường của mình.
  • maxLoads liên kết các loại tải với tải trọng tối đa mà xe tại bất kỳ thời điểm nào trên tuyến đường của họ.

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

Một phản hồi mẫu hoàn chỉnh cho yêu cầu từ Tạo yêu cầu sẽ có vẻ như:

{
  "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
    }
  }
}