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
ของยานพาหนะเพื่อให้นำส่งการจัดส่งที่มีกรอบเวลาเร็วที่สุดก่อน
shipments[2]
นำส่งแล้วเวลา 17:50 น.shipments[1]
นำส่งแล้วเมื่อ 18:00 น.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 เครื่องมือเพิ่มประสิทธิภาพพบว่าการจัดส่งสินค้าก่อนกำหนดคุ้มค่ากว่าการข้ามการจัดส่ง