ข้อจํากัดของกรอบเวลาการรับสินค้าและการนำส่ง

OptimizeToursRequest นำข้อจำกัดไปใช้กับรายการต่อไปนี้

  • การจัดส่ง ซึ่งส่งผลต่อวิธีดำเนินการจัดส่ง
  • ยานพาหนะ ซึ่งส่งผลต่อวิธีคำนวณเส้นทางยานพาหนะ
  • ทั่วโลก ซึ่งส่งผลกระทบต่อทั้งยานพาหนะและการจัดส่ง

คู่มือนี้มุ่งเน้นที่ข้อจำกัดที่สำคัญในการจัดส่ง ซึ่งก็คือกรอบเวลา

กรอบเวลาเป็นข้อจำกัดประเภทหนึ่งที่คุณระบุในOptimizeToursRequestข้อความ (REST, gRPC) เพื่อระบุขีดจำกัดตามเวลาสำหรับกิจกรรมการจัดส่ง ข้อจำกัดประเภทนี้มีผลต่อ ทั้งเวลาและวิธีการจัดส่ง รวมถึงการกำหนดยานพาหนะ สำหรับการจัดส่ง ด้วยข้อจำกัดเหล่านี้ เครื่องมือเพิ่มประสิทธิภาพจะให้ความสำคัญกับ ยานพาหนะที่สามารถตอบสนองข้อจำกัดด้านเวลาในการจัดส่งได้ดีที่สุด

ข้อจำกัดการจัดส่ง: กรอบเวลา

คุณระบุว่าจะให้บริการรับสินค้าหรือจัดส่งได้เมื่อใดในShipment.VisitRequest ดังนี้

  • ใช้พร็อพเพอร์ตี้ timeWindows ในข้อความ (REST, gRPC)
  • ระบุเวลาเริ่มต้นและสิ้นสุดในข้อความ TimeWindow (REST, gRPC)

ตัวอย่างคำขอที่มีข้อจำกัดด้านกรอบเวลา

ตัวอย่างนี้แสดงการจัดส่งที่แตกต่างกัน 3 รายการ โดยแต่ละรายการจะมีการจัดส่งแยกกัน ในกรอบเวลาการจัดส่ง ตัวอย่างนี้จะกำหนดกรอบเวลาสำหรับ deliveries เท่านั้นเพื่อความง่าย แต่คุณใช้กรอบเวลากับการรับสินค้าได้ด้วย กรอบเวลาหลายช่วง แม้ว่าตัวอย่างนี้จะใช้เพียง 1 ครั้งต่อการนำส่ง VisitRequest

ดูตัวอย่างคำขอที่มีกรอบเวลา

{
  "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
      }
    ]
  }
}
    

ตัวอย่างคำตอบที่มีข้อจำกัดด้านกรอบเวลา

ในตัวอย่างนี้ เวลาเริ่มต้นและสิ้นสุดของยานพาหนะคือ 17:35:50 และ 18:17:24 ตามลำดับ เวลาเหล่านี้แสดงถึงเครื่องมือเพิ่มประสิทธิภาพที่ประหยัดเวลา ที่จำเป็นต่อการใช้งานยานพาหนะที่ระบุไว้ในคำขอเป็น costPerHour ขณะที่ ตรงตามข้อจำกัดด้านเวลาทั้งหมด การใช้ 17:35:50 เป็นเวลาเริ่มต้นจะทำให้ยานพาหนะไม่ต้องรอที่สถานที่เข้าชมจนกว่าช่วงเวลาเข้าชมจะเริ่มขึ้น ข้อความนี้ปรากฏในคำตอบเป็น 0 waitDuration

ดูการตอบกลับคําขอตัวอย่างที่มีกรอบเวลา

{
  "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
    }
  }
}
    

กรอบเวลามีการจัดเรียง visits ของยานพาหนะเพื่อให้นำส่งการจัดส่งที่มีกรอบเวลาเร็วที่สุดก่อน

  1. shipments[2] นำส่งแล้วเวลา 17:50 น.
  2. shipments[1] นำส่งแล้วเมื่อ 18:00 น.
  3. shipments[0] จะนำส่งเวลา 18.07 น.

คำขอตัวอย่างระบุข้อจำกัดของกรอบเวลายาก ซึ่งต้องใช้ ที่จะดำเนินการภายในกรอบเวลาเหล่านั้น หากการทำให้VisitRequestsของการจัดส่งเสร็จสมบูรณ์ภายในกรอบเวลาใดก็ตามไม่สามารถทำได้หรือคุ้มค่าทางต้นทุน เครื่องมือเพิ่มประสิทธิภาพจะข้ามการจัดส่งนั้น หากการจัดส่งมี penaltyCost เครื่องมือเพิ่มประสิทธิภาพจะเพิ่มเครื่องมือเพิ่มประสิทธิภาพนั้นลงในค่าใช้จ่ายที่รายงานในการตอบกลับ metrics มิฉะนั้น พร็อพเพอร์ตี้ skippedMandatoryShipmentCount ของ ข้อความ OptimizeToursResponse (REST, gRPC) เพิ่มขึ้น

หากคุณเปลี่ยนกรอบเวลาโดยการเลื่อนกรอบเวลาของ shipment[1] ไปหลายชั่วโมง (เป็น 21:00 น. จาก 18:00 น.) ผลลัพธ์จะแตกต่างออกไปตามที่แสดงในตัวอย่างต่อไปนี้

ดูตัวอย่างคำขอที่มีกรอบเวลาซึ่งไม่สามารถตอบสนองได้

{
  "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
      }
    ]
  }
}
    

ดูการตอบกลับคำขอตัวอย่างที่ 2 พร้อมกรอบเวลาที่มีการข้ามการจัดส่ง

{
  "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
    }
  }
}
    

ในตัวอย่างนี้ กรอบเวลาภายหลังทำให้ shipment[1] ถูกข้าม เนื่องจากต้องใช้เวลาเพิ่มเติมในการดำเนินการจัดส่งยานพาหนะ ในการจัดส่งภายในกรอบเวลาที่กำหนดเกินค่าปรับในการจัดส่งแล้ว ค่าปรับสำหรับ shipment[1] จะปรากฏใน metrics.costs และดัชนีของ shipment[1] จะปรากฏใน skippedShipments

ข้อจำกัดกรอบเวลาแบบไม่บังคับ

ดังที่ได้กล่าวไว้สั้นๆ ในพารามิเตอร์รูปแบบต้นทุน กรอบเวลาสามารถใช้เป็นข้อจำกัดแบบยืดหยุ่นได้ ข้อจำกัดแบบอ่อนต่างจากข้อจำกัดแบบแข็งดังนี้

  • ข้อจํากัดที่เปลี่ยนแปลงไม่ได้: ต้องไม่ละเมิด และเครื่องมือเพิ่มประสิทธิภาพจะไม่เสนอโซลูชันที่ละเมิดข้อจํากัด แม้ว่าจะหมายถึงการข้ามการจัดส่งก็ตาม
  • ข้อจํากัดแบบยืดหยุ่น: อาจมีการละเมิด ซึ่งหมายความว่าเครื่องมือเพิ่มประสิทธิภาพอาจให้โซลูชันที่ละเมิดข้อจํากัดแบบยืดหยุ่น อย่างไรก็ตาม เครื่องมือเพิ่มประสิทธิภาพจะใช้ต้นทุนกับการละเมิดด้วย คุณจะระบุค่าใช้จ่ายนี้เป็นพร็อพเพอร์ตี้เพิ่มเติมในกรอบเวลา โดยปกติจะเป็นค่าใช้จ่ายต่อชั่วโมงสําหรับแต่ละชั่วโมงก่อนหรือหลังกรอบเวลาที่เกิดกิจกรรม

กรอบเวลาจะมีความยืดหยุ่นมากขึ้นเมื่อใช้ softStartTime หรือ softEndTime แทน startTime หรือ endTime ตามลำดับ และการตั้งค่า costPerHourBeforeSoftStartTime หรือ costPerHourAfterSoftEndTime

ใช้ข้อจำกัดด้านกรอบเวลาชั่วคราวเมื่อรับสินค้าหรือจัดส่งควรเกิดขึ้น ภายในกรอบเวลาที่กำหนด แต่ไม่ได้รับสินค้าหรือจัดส่งภายในกรอบเวลาที่กำหนด ที่จำเป็นอย่างยิ่ง คุณสามารถใช้ข้อจำกัดกรอบเวลาแบบบังคับและแบบไม่บังคับร่วมกันเพื่อแสดงวัตถุประสงค์ทางธุรกิจได้ เช่น

  • กรอบเวลาถาวร: ระบุเวลาทำการของลูกค้า เช่น ตั้งแต่ 9.00 น. - 17.00 น.
  • กรอบเวลาชั่วคราว: ระบุกรอบเวลาสำหรับการจัดส่งหรือรับสินค้า ตรงกับการแจ้งเตือนที่ส่งถึงลูกค้า เช่น 9.00 น. ถึง 13.00 น.

ในตัวอย่างนี้ การจัดส่งถูกข้ามก่อนหน้านี้เนื่องจากเวลาของการจัดส่ง กรอบเวลาที่เริ่มช้าเกินไปทำให้ข้อจำกัดด้านเวลาเริ่มต้นลดลง อื่นๆ การจัดส่งมีกรอบเวลาที่แตกต่างกัน เวลาสิ้นสุดที่น้อยลงด้วย

ดูตัวอย่างคำขอที่มีเวลาที่เข้มงวดและชั่วคราว หน้าต่าง

{
  "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
      }
    ]
  }
}
    

ดูการตอบสนองต่อคําขอตัวอย่างที่มีกรอบเวลาแบบบังคับและแบบไม่บังคับ

{
  "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
    }
  }
}
    

ตัวอย่างที่มีข้อจำกัดเฉพาะกรอบเวลาแบบเข้มงวดจะข้ามกรอบเวลาดังกล่าวไปเลย shipment[1] การทำให้กรอบเวลาการนำส่งอ่อนลงจะทำให้เนื้อหาได้รับการนำส่งก่อนเวลาเริ่มต้นของกรอบเวลา ในทำนองเดียวกัน การทำให้เวลาสิ้นสุดของการจัดส่งอื่นๆ ยืดหยุ่นขึ้นจะช่วยให้นำส่ง shipment[2] ได้หลังจากกรอบเวลาสิ้นสุดลง

ขณะเดียวกัน ทั้งค่าใช้จ่ายและการจัดส่งทั้งหมดก็เปลี่ยนแปลงไปเช่นกัน

  • totalCost: ลดลงจาก 81.283 เป็น 64.797
  • การจัดส่งที่เสร็จสมบูรณ์ทั้งหมด: เพิ่มขึ้นจาก 2 เป็น 3

เครื่องมือเพิ่มประสิทธิภาพพบวิธีแก้ปัญหาที่ประหยัดกว่าเนื่องจากมีการผ่อนคลายข้อจํากัดของกรอบเวลาเมื่อเทียบกับตัวอย่างก่อนหน้านี้

สุดท้าย พร็อพเพอร์ตี้ metrics.costs ยังมีคีย์ใหม่เพื่อระบุ ต้นทุนจริงที่เกิดขึ้นตามผลคูณของข้อจำกัดและความยาวของ เวลาที่พลาดกรอบเวลาการนำส่ง โดยการ

  • costPerHourBeforeSoftStartTime จาก 2.0 ขึ้นไป
  • เวลาระหว่างการนำส่งจริงจนถึงจุดเริ่มต้นของกรอบเวลา 2.83583 ชั่วโมง

ผลลัพธ์:

model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time: 5.6716666666666669

เมตริกเหล่านี้ช่วยให้คุณทําการวิเคราะห์ต้นทุนเพื่อดูการแลกเปลี่ยนระหว่างข้อจํากัดแบบบังคับและแบบไม่บังคับ ซึ่งคุณใช้เพื่อปรับข้อจํากัดให้เหมาะกับกฎทางธุรกิจที่เฉพาะเจาะจงได้ดีขึ้น ในกรณีนี้ ค่าใช้จ่ายรวมจะเท่ากับ น้อยกว่า shipment[1].penalty_cost ของ 20.0 เครื่องมือเพิ่มประสิทธิภาพพบว่าการจัดส่งสินค้าก่อนกำหนดคุ้มค่ากว่าการข้ามการจัดส่ง