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

Hướng dẫn này mô tả về loadDemandsloadLimits, cũng như mối liên hệ giữa các thành phần này khác.

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

Xe và gói hàng có những đặc điểm thực tế phải được xem xét khi lên kế hoạch cho một tuyến đường.

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

Đồng thời, hai điều kiện ràng buộc này giúp trình tối ưu hoá có thể chỉ định lô hàng cho xe theo cách phù hợp nhất sức chứa của đội xe cũng như 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 tập hợp các loại tải của riêng mình, 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 sử dụng loại Vùng đệm giao thức map, với các khoá string đại diện cho 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 phải hoàn tất lô hàng theo loại đã chỉ định.

Các 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 đại diện cho tải trọng tối đa của xe trong loại đã chỉ định.

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

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

cần 50 đơn vị tải thuộc loại weightKg thì lô hàng mới đã hoàn tất. Một chiếc xe có loadLimits trong số:

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

có thể hoàn tất lô hàng giao hàng, vì maxLoad của chiếc xe trong Loại weightKg lớn hơn hoặc bằng loadDemands của lô hàng tính theo loại weightKg. Tuy nhiên, một xe có loadLimits là:

"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 trọng của xe là weightKg để xe không bị hạn chế về thông tin vận chuyển nhu cầu cân nặng.

Chuyển tải giữa các lô hàng và xe

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

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

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

Ví dụ đầy đủ về các yêu cầu và giới hạn tải

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

{
  "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 số 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 có nhu cầu tải và giới hạn

{
  "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. shipment[0] được nhận
  2. Đã nhận shipment[1]
  3. Đã giao shipment[0]
  4. Đã giao shipment[1]
  5. Đã nhận shipment[2]
  6. shipment[2] được phân phối

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

Mỗi mục nhập visits bao gồm sự thay đổi về tải xe do việc hoàn tất Visit. Giá trị số lượng dương thể hiện mức tải hàng trong khi vận chuyển giá trị âm thể hiện việc dỡ hàng.

Mỗi mục transitions bao gồm tổng tải trọng xe trong thời gian diễn ra Transition. Ví dụ: transitions[2] có tải weightKg là 60, biểu thị tổng tải của shipment[0]shipment[1].

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

Quy tắc ràng buộc giới hạn tải mềm

Cũng như các khoảng thời gian được mô tả trong phần Hạn chế về khoảng thời gian lấy hàng và giao hàng, các quy tắc hạn chế về tải có các biến thể cứng và mềm. Chiến lược phát hành đĩa đơn 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 tải trọng vượt quá giá trị maxLoad trong thuộc tính được chỉ định loại. Các thuộc tính softMaxLoadcostPerUnitAboveSoftMax thể hiện mềm ràng buộc, với mỗi đơn vị vượt quá softMaxLoad sẽ gây ra một Chi phí là 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 việc này có hiệu quả về chi phí
  • thể hiện sự lựa chọn ưu tiên của người lái xe đối với số lượng mặt hàng mà họ có thể thoải mái chọn đến lấy hàng và giao hàng theo một tuyến đường cụ thể
  • tải xe dưới mức trọng tải vật lý tối đa để hạn chế hao mòn và giảm chi phí bảo trì

Bạn có thể sử dụng cùng lúc các điều kiện ràng buộc giới hạn tải cứng và mềm. Ví dụ: một chế độ cài đặt khó giới hạn tải có thể biểu thị trọng lượng tối đa của hàng hoá mà xe có thể chuyên chở an toàn hoặc số lượng tối đa có thể cho vào một chiếc xe tại một thời điểm, trong khi giới hạn tải mềm có thể là trọng lượng tối đa hoặc số lượng mặt hàng cần chịu thuế khả năng bố trí mọi thứ trong xe.