Hạn chế của thời gian đến lấy hàng và giao hàng

OptimizeToursRequest áp dụng các điều kiện ràng buộc trên những phần sau:

  • Lô hàng, ảnh hưởng đến hiệu suất vận chuyển
  • Phương tiện di chuyển, ảnh hưởng đến cách tính toán tuyến đường của xe
  • Trên toàn cầu, ảnh hưởng đến cả xe ô tô và quá trình vận chuyển.

Hướng dẫn này tập trung vào một quy tắc ràng buộc thiết yếu trong quá trình vận chuyển: cửa sổ thời gian.

Khoảng thời gian là một loại quy tắc ràng buộc mà bạn cung cấp trong thông báo OptimizeToursRequest (REST, gRPC) để chỉ định giới hạn dựa trên thời gian cho hoạt động vận chuyển. Loại quy tắc ràng buộc này ảnh hưởng đến cả thời điểm và cách thức thực hiện lô hàng, cũng như việc chỉ định xe cho lô hàng. Với những ràng buộc này, trình tối ưu hoá ưu tiên những xe có thể đáp ứng tốt nhất các giới hạn về thời gian của lô hàng.

Giới hạn của việc giao hàng: khung thời gian

Bạn chỉ định thời điểm có thể đến lấy hàng hoặc giao hàng trong thông báo Shipment.VisitRequest như sau:

  • Sử dụng thuộc tính timeWindows trong thông báo (REST, gRPC)
  • Chỉ định thời gian bắt đầu và kết thúc trong thông báo TimeWindow (REST, gRPC).

Yêu cầu mẫu có các giới hạn về khoảng thời gian

Ví dụ ở đây minh hoạ ba lô hàng khác nhau, mỗi lô hàng có khung thời gian giao hàng riêng. Để đơn giản, ví dụ này chỉ đặt khoảng thời gian trên deliveries, nhưng bạn cũng có thể áp dụng khung thời gian cho dịch vụ đến lấy hàng. Bạn có thể chỉ định nhiều khoảng thời gian, mặc dù ví dụ này chỉ sử dụng một khoảng thời gian cho mỗi VisitRequest phân phối.

Xem một yêu cầu mẫu có khung thời gian

{
  "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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T18:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Ví dụ về phản hồi có các giới hạn về khoảng thời gian

Trong phản hồi mẫu, thời gian bắt đầu và kết thúc của xe lần lượt là 17:35:50 và 18:17:24. Số lần này phản ánh việc trình tối ưu hoá giảm thiểu thời gian cần thiết để vận hành xe được chỉ định trong yêu cầu dưới dạng costPerHour trong khi đáp ứng tất cả các giới hạn về khung thời gian. Nếu bạn sử dụng 17:35:50 làm thời gian bắt đầu, bạn sẽ không cần phải đợi xe tại vị trí ghé thăm cho đến khi khoảng thời gian ghé thăm bắt đầu. Giá trị này xuất hiện trong phản hồi dưới dạng giá trị waitDuration bằng 0.

Xem phản hồi cho yêu cầu mẫu với khung thời gian

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:35:50Z",
      "vehicleEndTime": "2023-01-13T18:17:24Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:35:50Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:38:20Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:50Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:50:09Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "796s"
        },
        {
          "startTime": "2023-01-13T18:07:35Z",
          "detour": "1520s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:35:50Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:38:20Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:50Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:43:20Z"
        },
        {
          "travelDuration": "341s",
          "travelDistanceMeters": 1312,
          "waitDuration": "0s",
          "totalDuration": "341s",
          "startTime": "2023-01-13T17:54:19Z"
        },
        {
          "travelDuration": "205s",
          "travelDistanceMeters": 636,
          "waitDuration": "0s",
          "totalDuration": "205s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:11:45Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "1294s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2494s",
        "travelDistanceMeters": 4595
      },
      "routeCosts": {
        "model.vehicles.cost_per_hour": 27.711111111111112,
        "model.vehicles.cost_per_kilometer": 45.95
      },
      "routeTotalCost": 73.661111111111111
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "1294s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2494s",
      "travelDistanceMeters": 4595
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:35:50Z",
    "latestVehicleEndTime": "2023-01-13T18:17:24Z",
    "totalCost": 73.661111111111111,
    "costs": {
      "model.vehicles.cost_per_hour": 27.711111111111112,
      "model.vehicles.cost_per_kilometer": 45.95
    }
  }
}
    

Khung thời gian đã đặt hàng visits của xe để các lô hàng có khung thời gian sớm nhất sẽ được giao trước.

  1. shipments[2] được giao lúc 17:50
  2. shipments[1] được giao lúc 18:00
  3. shipments[0] được giao lúc 18:07

Yêu cầu mẫu chỉ định các giới hạn thời gian cố định, đòi hỏi việc phân phối phải được hoàn tất trong các cửa sổ đó. Nếu việc hoàn tất VisitRequests của lô hàng trong bất kỳ khoảng thời gian nào là không khả thi hoặc không hiệu quả về chi phí, thì trình tối ưu hoá sẽ bỏ qua việc chuyển hàng. Nếu lô hàng có penaltyCost, thì trình tối ưu hoá sẽ thêm giao dịch đó vào chi phí được báo cáo trong phản hồi metrics. Nếu không, thuộc tính skippedMandatoryShipmentCount của thông báo OptimizeToursResponse (REST, gRPC) sẽ tăng lên.

Nếu bạn thay đổi cửa sổ thời gian bằng cách dịch chuyển cửa sổ của shipment[1] vài giờ sau đó (từ 18:00 sang 21:00), kết quả sẽ khác như minh hoạ trong các ví dụ sau.

Xem một yêu cầu mẫu có khoảng thời gian không thể đáp ứng

{
  "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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "endTime": "2023-01-13T19:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "endTime": "2023-01-13T18:00:00Z"
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Xem phản hồi cho yêu cầu mẫu thứ hai có khung thời gian khi lô hàng bị bỏ qua

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:37:49Z",
      "vehicleEndTime": "2023-01-13T18:09:49Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:37:49Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:40:19Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T17:49:38Z",
          "detour": "0s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "946s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:37:49Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:40:19Z"
        },
        {
          "travelDuration": "409s",
          "travelDistanceMeters": 1371,
          "waitDuration": "0s",
          "totalDuration": "409s",
          "startTime": "2023-01-13T17:42:49Z"
        },
        {
          "travelDuration": "372s",
          "travelDistanceMeters": 1348,
          "waitDuration": "0s",
          "totalDuration": "372s",
          "startTime": "2023-01-13T17:53:48Z"
        },
        {
          "travelDuration": "339s",
          "travelDistanceMeters": 1276,
          "waitDuration": "0s",
          "totalDuration": "339s",
          "startTime": "2023-01-13T18:04:10Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "1120s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1920s",
        "travelDistanceMeters": 3995
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 39.95,
        "model.vehicles.cost_per_hour": 21.333333333333332
      },
      "routeTotalCost": 61.283333333333331
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "1120s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1920s",
      "travelDistanceMeters": 3995
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:37:49Z",
    "latestVehicleEndTime": "2023-01-13T18:09:49Z",
    "totalCost": 81.283333333333331,
    "costs": {
      "model.shipments.penalty_cost": 20,
      "model.vehicles.cost_per_hour": 21.333333333333332,
      "model.vehicles.cost_per_kilometer": 39.95
    }
  }
}
    

Trong ví dụ này, khoảng thời gian giao hàng muộn hơn đã khiến shipment[1] bị bỏ qua, vì thời gian vận hành xe thêm vào cần thiết để hoàn tất việc giao hàng trong khoảng thời gian quy định vượt quá chi phí phạt của lô hàng. Chi phí phạt cho shipment[1] xuất hiện trong metrics.costs và chỉ mục của thuộc tính này xuất hiện trong skippedShipments.

Các ràng buộc về khoảng thời gian tạm thời

Như đã đề cập ngắn gọn trong Tham số mô hình chi phí, khoảng thời gian có thể được áp dụng dưới dạng các quy tắc ràng buộc mềm. Ràng buộc mềm khác với ràng buộc cứng như sau:

  • Hạn chế khó: Không thể bị vi phạm và trình tối ưu hoá không cung cấp giải pháp vi phạm quy tắc ràng buộc đó, ngay cả khi điều đó có nghĩa là bỏ qua quá trình phân phối.
  • Hạn chế mềm: Có thể bị vi phạm, nghĩa là trình tối ưu hoá có thể cung cấp giải pháp vi phạm quy tắc ràng buộc mềm. Tuy nhiên, trình tối ưu hoá cũng áp dụng chi phí cho mọi lỗi vi phạm. Bạn cung cấp chi phí này dưới dạng thuộc tính bổ sung trong khoảng thời gian, thường là chi phí mỗi giờ cho từng giờ trước hoặc sau khoảng thời gian hoạt động xảy ra.

Khoảng thời gian được làm dịu bằng cách sử dụng softStartTime hoặc softEndTime thay vì startTime hoặc endTime tương ứng, và bằng cách đặt costPerHourBeforeSoftStartTime hoặc costPerHourAfterSoftEndTime.

Sử dụng các quy tắc ràng buộc về khoảng thời gian ngắn khi đến lấy hàng hoặc giao hàng nên diễn ra trong một khoảng thời gian cụ thể, nhưng bạn không nhất thiết phải đến lấy hàng hoặc giao hàng trong khoảng thời gian đó. Bạn có thể sử dụng kết hợp các giới hạn về khoảng thời gian cố định và tạm thời để thể hiện mục tiêu kinh doanh. Ví dụ:

  • Khoảng thời gian cố định: Cho biết giờ làm việc của khách hàng, chẳng hạn như từ 9:00 đến 17:00.
  • Khung thời gian mềm: Cho biết khung thời gian để giao hàng hoặc đến lấy hàng khớp với thông báo gửi cho khách hàng, chẳng hạn như từ 9 giờ sáng đến 1 giờ chiều.

Trong ví dụ này, lô hàng trước đó đã bị bỏ qua vì khoảng thời gian bắt đầu quá muộn nên giới hạn thời gian bắt đầu đã được làm dịu. Các chuyến hàng khác có khung thời gian kết thúc giảm bớt.

Xem một yêu cầu mẫu có khung thời gian cố định và tạm thờ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",
            "timeWindows": [
              {
                "startTime": "2023-01-13T18:00:00Z",
                "softEndTime": "2023-01-13T19:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s",
            "timeWindows": [
              {
                "softStartTime": "2023-01-13T21:00:00Z",
                "endTime": "2023-01-13T21:30:00Z",
                "costPerHourBeforeSoftStartTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 20.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s",
            "timeWindows": [
              {
                "startTime": "2023-01-13T17:30:00Z",
                "softEndTime": "2023-01-13T18:00:00Z",
                "costPerHourAfterSoftEndTime": 2.0
              }
            ]
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Xem phản hồi cho yêu cầu mẫu với khoảng thời gian cố định và tạm thời

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-13T17:48:35Z",
      "vehicleEndTime": "2023-01-13T18:24:28Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-13T17:48:35Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 1,
          "isPickup": true,
          "startTime": "2023-01-13T17:51:05Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-13T17:53:35Z",
          "detour": "300s"
        },
        {
          "startTime": "2023-01-13T18:00:00Z",
          "detour": "300s"
        },
        {
          "shipmentIndex": 1,
          "startTime": "2023-01-13T18:07:42Z",
          "detour": "493s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-13T18:17:27Z",
          "detour": "873s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:48:35Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:51:05Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-13T17:53:35Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-13T17:56:05Z"
        },
        {
          "travelDuration": "212s",
          "travelDistanceMeters": 791,
          "waitDuration": "0s",
          "totalDuration": "212s",
          "startTime": "2023-01-13T18:04:10Z"
        },
        {
          "travelDuration": "335s",
          "travelDistanceMeters": 1204,
          "waitDuration": "0s",
          "totalDuration": "335s",
          "startTime": "2023-01-13T18:11:52Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-13T18:21:37Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 3,
        "travelDuration": "953s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "1200s",
        "totalDuration": "2153s",
        "travelDistanceMeters": 3455
      },
      "routeCosts": {
        "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
        "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
        "model.vehicles.cost_per_hour": 23.922222222222221,
        "model.vehicles.cost_per_kilometer": 34.55
      },
      "routeTotalCost": 64.797222222222217
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 3,
      "travelDuration": "953s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "1200s",
      "totalDuration": "2153s",
      "travelDistanceMeters": 3455
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-13T17:48:35Z",
    "latestVehicleEndTime": "2023-01-13T18:24:28Z",
    "totalCost": 64.797222222222217,
    "costs": {
      "model.vehicles.cost_per_kilometer": 34.55,
      "model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time": 5.7433333333333332,
      "model.shipments.deliveries.time_windows.cost_per_hour_after_soft_end_time": 0.58166666666666667,
      "model.vehicles.cost_per_hour": 23.922222222222221
    }
  }
}
    

Trong trường hợp ví dụ chỉ có các điều kiện ràng buộc về khung thời gian cứng bị bỏ qua hoàn toàn shipment[1], việc làm giảm khoảng thời gian phân phối sẽ khiến khung được phân phối trước thời gian bắt đầu khung thời gian. Tương tự, việc làm dịu thời gian kết thúc của các lô hàng khác cho phép phân phối shipment[2] sau khi khoảng thời gian kết thúc.

Đồng thời, cả chi phí và tổng số lô hàng đều đã thay đổi:

  • totalCost: giảm từ 81,283 xuống 64,797
  • tổng số lô hàng đã hoàn tất: tăng từ 2 lên 3

Trình tối ưu hoá đã tìm thấy một giải pháp ít tốn kém hơn vì giới hạn về khung thời gian đã được nới lỏng so với ví dụ trước.

Cuối cùng, thuộc tính metrics.costs cũng bao gồm một khoá mới để cho biết chi phí thực tế phát sinh dựa trên tích của giới hạn và khoảng thời gian mà khung thời gian phân phối đã bị bỏ lỡ. Đó là:

  • costPerHourBeforeSoftStartTime trên 2 và
  • thời gian từ khi phân phối thực tế đến khi bắt đầu khung thời gian này: 2,83583 giờ

Kết quả:

model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time: 5,6716666666666669.

Các chỉ số này cho phép bạn phân tích chi phí để biết được sự đánh đổi giữa ràng buộc cứng và ràng buộc mềm. Bạn có thể sử dụng những chỉ số này để điều chỉnh các quy tắc ràng buộc sao cho phù hợp hơn với quy tắc kinh doanh cụ thể của mình. Trong trường hợp này, tổng chi phí nhỏ hơnshipment[1].penalty_cost là 20. Trình tối ưu hoá đã xác định rằng việc phân phối giao hàng sớm sẽ tiết kiệm chi phí hơn so với việc bỏ qua lô hàng.