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.

Như đã đề cập trong phần Giới hạn thời gian nhận hàng và thời gian giao hàng, thông báo OptimizeToursRequest (REST, gRPC) chứa một số thuộc tính chỉ định quy tắc ràng buộc đố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 điều kiện ràng buộc về tải.

Phương tiện vận chuyển có những đặc điểm thực tế mà bạn phải xem xét khi lên kế hoạch cho tuyến đường.

  • Xe: Thuộc tính loadLimits quy định cụ thể về tải trọng tối đa mà xe có thể xử lý. Hãy xem tài liệu về thông báo Vehicle (REST, gRPC).
  • Lô hàng: Thuộc tính loadDemands chỉ định tải trọng mà một lô hàng tiêu thụ. Hãy xem tài liệu về thông báo Shipment (REST, gRPC).

Cùng với nhau, hai điều kiện ràng buộc này giúp trình tối ưu hoá có thể chỉ định phù hợp việc giao hàng cho các xe theo cách phù hợp nhất với năng lực đội xe và nhu cầu vận chuyển của bạ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 theo 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 sử dụng weightKg làm loại mẫu.

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 thể hiện dung lượng cần thiết để hoàn thành lô hàng theo kiểu dữ liệu được 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 sức tải tối đa của xe theo loại được chỉ định.

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

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

yêu cầu 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:

"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, một chiếc xe có loadLimits:

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

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

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

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

  1. Tải trọng yêu cầu được xác định cho lô hàng dưới dạng loadDemand.
  2. Lô hàng này được đến bằng xe được chỉ định và vehicleLoads của xe tăng lên theo số lượng loadDemand của lô hàng. Sự 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 lô hàng và vehicleLoads của xe giảm theo loadDemand của lô hàng đã giao. Sự chuyển đổi 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 được 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ó nhu cầu và giới hạn 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 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 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 bổ sung sẽ ảnh hưởng đến thứ tự của visits:

  1. Đã đến lấy shipment[0]
  2. Đã đến lấy shipment[1]
  3. Đã giao shipment[0]
  4. Đã giao shipment[1]
  5. Đã đến lấy shipment[2]
  6. Đã giao shipment[2]

Đơn đặt hàng này cho biết xe không thể hoàn thành ba lô hàng cùng lúc vì tổng loadDemands của các hàng đó vượt quá loadLimits của xe.

Mỗi mục nhập visits sẽ bao gồm sự thay đổi về tải trọng xe sau khi hoàn thành Visit. Giá trị tải dương đại diện cho hoạt động tải hàng đi, còn giá trị âm biểu thị hoạt động dỡ hàng.

Mỗi mục nhập transitions sẽ bao gồm tổng tải trọng của xe trong Transition. Ví dụ: transitions[2] có tải weightKg là 60, thể hiện 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ị của loại weightKg là 80, thể hiện phần tuyến đường của xe đã vận chuyển shipments[2] đến vị trí giao hàng.

Các điều kiện ràng buộc đối với giới hạn tải mềm

Giống như khoảng thời gian được mô tả trong Giới hạn thời gian nhận hàng và thời gian giao hàng, giới hạn tải 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ứng: xe không được chở quá tải vượt quá giá trị maxLoad trong loại được 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ẽ phải chịu chi phí costPerUnitAboveSoftMax.

Các điều kiện ràng buộc đối với giới hạn tải mềm có một số mục đích sử 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 phương pháp này hiệu quả về chi phí
  • thể hiện sự ư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 đến lấy và giao trên một tuyến đường nhất định
  • tải xe dưới sức chứa tối đa của xe để hạn chế hao mòn và giảm chi phí bảo dưỡng

Bạn có thể sử dụng các điều kiện ràng buộc giới hạn tải cứng và tải mềm cùng nhau. Ví dụ: giới hạn tải trọng cứng có thể biểu thị trọng lượng tối đa của hàng hoá mà một phương tiện có thể chở một cách an toàn hoặc số lượng vật phẩm tối đa có thể vừa với xe cùng một lúc, 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 vật dụng sẽ đánh thuế khả năng vận chuyển của người lái xe cho phù hợp với mọi thứ trên xe.