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

API Tối ưu hoá tuyến đường 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ó hai thuộc tính cấp cao nhất chính:

  • routes[] là tuyến đường của mỗi chiếc xe 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 đườ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 loại 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 như chỉ số mỗi Tuyến, 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 do bất kỳ loại xe 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 việc vận chuyển đó trong những điều kiện ràng buộc đã chỉ đị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 quy trình đến lấy hàng hoặc giao hàng của lô hàng có timeWindow rất hẹp thì có thể phương tiện vận chuyển sẽ không thể thực hiện việc ghé thăm trong khoảng thời gian cần thiết hoặc không tiết kiệm chi phí.
  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 thông báo lỗi thay vì nội dung phản hồi. Xin lưu ý rằng chế độ giải quyết VALIDATE_ONLY có thể báo cáo nhiều lỗi cùng lúc. Điều này rất hữu ích trong việc giúp nhanh chóng gỡ lỗi các yêu cầu.

Thuộc tính tuyến đường

Mỗi mục 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:

  • vehicleIndex là chỉ mục từ 0 của Vehicle trong thông báo yêu cầu tương ứng. 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 dự kiến mà 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 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:

  • 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à là false khi một lượt ghé thăm là giao hàng. Phản hồi REST sẽ bỏ thuộc tính này khi giá trị là false.
  • visitRequestIndex là chỉ mục từ 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 sẽ bỏ thuộc tính này khi 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 mức tải cần thiết để hoàn thành Visit. Số lượng tải là giá trị âm đối với lượt ghé thăm giao hàng, thể hiện rằng tải đ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ự, đại diện cho việc di chuyển trong khoảng thời gian từ 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:

  • startTime là thời điểm xe bắt đầu thực hiện quá trình chuyển đổi.
  • travelDuration là khoảng thời gian xe phải đi để 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 cho quá trình chuyển đổi hay không.
  • waitDuration biểu thị thời gian xe không hoạt động để 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 Visit sau đây.
  • totalDuration là 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ỉ giải lao và thời gian trễ.
  • vehicleLoads liên kết loại tải trọng với lượng tải mà xe mang trong 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 nội dung Tối ưu hoá đơn đặt hàng tại điểm đế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 bài viết Tham số mô hình chi phí.
  • usedVehicleCount là tổng số phương tiện được sử dụng trong giải pháp. Các xe có thể có các tuyến trống khi trình tối ưu hoá xác định rằng việc sử dụng chúng là không cần thiết.
  • skippedMandatoryShipmentCount là số lượng lô hàng đã bỏ qua "bắt buộc". Lô hàng bắt buộc không chỉ định penaltyCost sẽ phát sinh nếu việc vận chuyển 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 các lô hàng đó không khả thi theo các điều kiện ràng buộc đã chỉ định. Tìm hiểu thêm về chi phí trong bài viết 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ả các ShipmentRoute trong OptimizeToursResponse. Mỗi thuộc tính ShipmentRoute.metrics đều 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 mà phương tiện vận chuyển trong toàn bộ tuyến đường của chúng.
  • travelDuration là tổng thời gian mà phương tiện dành cho phương tiện công cộng trong khi hoàn thành các tuyến đường.
  • waitDuration là tổng thời gian mà các phương tiện chờ đợi trong khi hoàn thành tuyến đường.
  • delayDuration là tổng thời gian trễ của các phương tiện. Giá trị này thường là 0, trừ phi dùng TransitionAttributes trong yêu cầu.
  • breakDuration là tổng thời gian mà xe dành để nghỉ giải lao trong khi hoàn thành tuyến đường.
  • 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. Đây là tổng của tất cả giá trị VisitRequest.duration cho các VisitRequest tương ứng với Visit được chỉ định cho xe có liên quan.
  • totalDuration là tổng thời gian cần thiết để hoàn thành tuyến đường của phương tiện.
  • travelDistanceMeters là tổng quãng đường mà các xe đã đi trong khi hoàn thành tuyến đường của chú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 mang tại bất kỳ thời đ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
    }
  }
}