Tải nhu cầu và giới hạn

Hướng dẫn này mô tả loadDemandsloadLimits, cũng như mối liên hệ giữa chúng và chúng.

Như đã đề cập trong Giới hạn về cửa sổ thời gian nhận hàng và giao hàng, thông báo OptimizeToursRequest (REST, gRPC) chứa một số thuộc tính chỉ định các điều kiện ràng buộc đối với vấn đề đang được tối ưu hoá. Một số thuộc tính OptimizeToursRequest biểu thị các giới hạn tải.

Xe và phương tiện vận chuyển có các thuộc tính thực tế phải được xem xét khi lên kế hoạch cho tuyến đường.

  • Xe: Thuộc tính loadLimits nêu cụ thể tải trọng tối đa mà xe có thể xử lý. Xem tài liệu (REST, gRPC) của thông báo Vehicle.
  • Lô hàng: Thuộc tính loadDemands xác định mức tải mà một lô hàng cụ thể tiêu thụ. Xem tài liệu (REST, gRPC) của thông báo Shipment.

Hai điều kiện ràng buộc này giúp trình tối ưu hoá có thể chỉ định chính xác các lô hàng cho xe theo cách phù hợp nhất với sức chứa của nhóm thiết bị và nhu cầu vận chuyển.

Phần còn lại của tài liệu này sẽ thảo luận chi tiết về loadLimitsloadDemands.

Nhu cầu và giới hạn tải: loại

Bạn thể hiện từng nhu cầu tải và giới hạn giới hạn theo một loại.

Bạn có thể cung cấp nhóm các loại tải của riêng mình, chẳng hạn như các ví dụ sau:

  • cân nặng
  • thể tích
  • phép đo tuyến tính
  • tên của mặt hàng hoặc thiết bị được vận chuyển

Hướng dẫn này dùng weightKg làm loại ví dụ.

Cả Shipment.loadDemandsVehicle.loadLimits đều dùng loại Vùng đệm giao thức map, với khoá string thể hiện các loại tải.

Giá trị Shipment.loadDemands sử dụng thông báo Load (REST, gRPC). Thông báo Load có một thuộc tính amount duy nhất biểu thị dung lượng cần thiết để hoàn tất việc vận chuyển theo loại đã chỉ định.

Giá trị Vehicle.loadLimits sử dụng thông báo LoadLimit (REST, gRPC). Thông báo LoadLimit có một số thuộc tính, trong đó maxLoad thể hiện khả năng tải tối đa của xe theo kiểu được chỉ định.

loadDemands của một lô hàng chỉ sử dụng loadLimits của xe được chỉ định nếu cả hai có khoá loại tải trùng khớp. Ví dụ: một lô hàng có loadDemands là:

"loadDemands": {
  "weightKg": {
    "amount": 50
  }
}

cần có 50 đơn vị tải thuộc loại weightKg để hoàn tất quá trình vận chuyển. Một chiếc xe có loadLimits trong số:

"loadLimits": {
  "weightKg": {
    "maxLoad": 100
  }
}

có thể hoàn tất quá trình vận chuyển, vì maxLoad của xe trong loại weightKg lớn hơn hoặc bằng loadDemands của lô hàng trong loại weightKg. Tuy nhiên, xe có loadLimits trong số:

"loadLimits": {
  "equipmentRackStorage": {
    "maxLoad": 10
  }
}

ngầm ẩn có dung lượng weightKg không giới hạn do không có giới hạn tải weightKg, vì vậy, xe không bị hạn chế bởi nhu cầu trọng lượng của lô hàng.

Di chuyển tải giữa các lô hàng và phương tiện vận tải

Khi hàng được vận chuyển bằng phương tiện vận chuyển, loadDemand của lô hàng sẽ chuyển giữa phương tiện vận chuyển và phương tiện vận chuyển. Bạn có thể xem tải của xe trong mục nhập của thông báo OptimizeToursResponse (REST, gRPC)routes.transitions cho một chiếc xe cụ thể. Trình tự như sau:

  1. Tải trọng cần thiết được xác định cho lô hàng là loadDemand.
  2. Lô hàng được lấy trên xe được chỉ định và vehicleLoads của xe tăng theo số lượng loadDemand của lô hàng. Quá trình chuyển này được biểu thị bằng visits.loadDemands tích cực trong thông báo phản hồi.
  3. Xe sẽ giao hàng và vehicleLoads của xe giảm theo số tiền loadDemand của lô hàng đã giao. Quá trình chuyển này được biểu thị bằng visits.loadDemands âm trong thông báo phản hồi.

vehicleLoads của xe không được vượt quá loadLimits đã chỉ định tại bất kỳ thời điểm nào trên tuyến đường.

Một ví dụ hoàn chỉnh về nhu cầu và giới hạn tải

Xem một yêu cầu mẫu có các giới hạn và nhu cầu tải

{
  "populatePolylines": false,
  "populateTransitionPolylines": false,
  "model": {
    "globalStartTime": "2023-01-13T16:00:00Z",
    "globalEndTime": "2023-01-14T16:00:00Z",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": 50
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 15.0,
        "loadDemands": {
          "weightKg": {
            "amount": 10
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": 80
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": 100
          }
        }
      }
    ]
  }
}
    

Yêu cầu mẫu chứa một vài tham số liên quan đến tải:

  • shipments[0] có nhu cầu tải là 50 weightKg.
  • shipments[1] có nhu cầu tải là 10 weightKg.
  • shipments[2] có nhu cầu tải là 80 weightKg.
  • vehicles[0] có giới hạn tải là 100 weightKg.

Xem phản hồi cho yêu cầu kèm theo yêu cầu và giới hạn tải

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T16:00:00Z",
      "vehicleEndTime": "2023-01-13T16:43:27Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T16:00:00Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T16:02:30Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "startTime": "2023-01-13T16:08:55Z",
          "detour": "150s",
          "loadDemands": {
            "weightKg": {
              "amount": "-50"
            }
          }
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T16:16:37Z",
          "detour": "343s",
          "loadDemands": {
            "weightKg": {
              "amount": "-10"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T16:27:07Z",
          "detour": "1627s",
          "loadDemands": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T16:36:26Z",
          "detour": "0s",
          "loadDemands": {
            "weightKg": {
              "amount": "-80"
            }
          }
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:00:00Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T16:02:30Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "50"
            }
          }
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T16:05:00Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "60"
            }
          }
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T16:13:05Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "10"
            }
          }
        },
        {
          "travelDuration": "380s",
          "travelDistanceMeters": 1190,
          "waitDuration": "0s",
          "totalDuration": "380s",
          "startTime": "2023-01-13T16:20:47Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T16:29:37Z",
          "vehicleLoads": {
            "weightKg": {
              "amount": "80"
            }
          }
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T16:40:36Z",
          "vehicleLoads": {
            "weightKg": {}
          }
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1407s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2607s",
        "travelDistanceMeters": 4812,
        "maxLoads": {
          "weightKg": {
            "amount": "80"
          }
        }
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 48.12,
        "model.vehicles.cost_per_hour": 28.966666666666665
      },
      "routeTotalCost": 77.086666666666659
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1407s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2607s",
      "travelDistanceMeters": 4812,
      "maxLoads": {
        "weightKg": {
          "amount": "80"
        }
      }
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T16:00:00Z",
    "latestVehicleEndTime": "2023-01-13T16:43:27Z",
    "totalCost": 77.086666666666659,
    "costs": {
      "model.vehicles.cost_per_hour": 28.966666666666665,
      "model.vehicles.cost_per_kilometer": 48.12
    }
  }
}
    

Các điều kiện ràng buộc tải thêm sẽ ảnh hưởng đến thứ tự của visits:

  1. Đã nhận shipment[0]
  2. Đã nhận shipment[1]
  3. Đã giao shipment[0]
  4. Đã giao shipment[1]
  5. Đã nhận shipment[2]
  6. Đã giao shipment[2]

Đơn đặt hàng này phản ánh rằng xe không thể hoàn tất 3 gói hàng cùng một lúc vì tổng loadDemands của các gói hàng đó vượt quá loadLimits của xe.

Mỗi mục visits bao gồm sự thay đổi về tải trọng xe do hoàn tất Visit. Giá trị tải dương biểu thị việc bốc hàng, còn giá trị âm biểu thị việc dỡ hàng.

Mỗi mục transitions bao gồm tổng tải trọng xe trong Transition. Ví dụ: transitions[2] có tải weightKg là 60, đại diện cho tải tổng hợp của shipment[0]shipment[1].

Các đối tượng chỉ số routes[0].metricsmetrics.aggregatedRouteMetrics bao gồm thuộc tính maxLoads. Giá trị của loại weightKg là 80, thể hiện phần tuyến đường của phương tiện đã vận chuyển shipments[2] đến vị trí giao hàng.

Các hạn chế đối với giới hạn tải mềm

Như với khoảng thời gian được mô tả trong Giới hạn về khoảng thời gian đến lấy hàng và giao hàng, các giới hạn giới hạn tải có các biến thể cứng và mềm. Thuộc tính maxLoad của thông báo LoadLimit thể hiện một quy tắc ràng buộc cố định: xe không được mang tải vượt quá giá trị maxLoad trong loại đã chỉ định. Các thuộc tính softMaxLoadcostPerUnitAboveSoftMax thể hiện một quy tắc ràng buộc mềm, trong đó mỗi đơn vị vượt quá softMaxLoad sẽ làm phát sinh chi phí costPerUnitAboveSoftMax.

Các ràng buộc đối với giới hạn tải mềm có một số công dụng, chẳng hạn như:

  • cân bằng các lô hàng trên nhiều xe hơn số lượng tối thiểu cần thiết khi tiết kiệm chi phí để thực hiện điều đó
  • thể hiện mong muốn của người lái xe về số lượng mặt hàng mà họ có thể nhận hàng thoải mái và giao trên một tuyến đường nhất định
  • tải xe dưới sức chứa tối đa để hạn chế hao mòn và giảm chi phí bảo trì

Bạn có thể sử dụng đồng thời các giới hạn đối với tải cứng và tải mềm. Ví dụ: giới hạn tải cứng có thể cho biết trọng lượng tối đa của hàng hoá mà một phương tiện có thể mang theo một cách an toàn hoặc số lượng vật dụng tối đa vừa vặn trên xe tại một thời điểm, trong khi giới hạn tải nhẹ có thể là trọng lượng hoặc số lượng đồ vật tối đa ảnh hưởng đến khả năng phù hợp với mọi thứ trong xe của người lái xe.