OptimizeToursRequest इन पर पाबंदियां लागू करता है:
- शिपमेंट, जिससे शिपमेंट करने के तरीके पर असर पड़ता है
- वाहन, जिससे वाहन के रास्तों का हिसाब लगाने के तरीके पर असर पड़ता है
- दुनिया भर में, वाहनों और शिपमेंट दोनों पर असर डालता है.
इस गाइड में, शिपिंग से जुड़ी एक ज़रूरी शर्त पर फ़ोकस किया गया है: समयसीमा.
टाइम विंडो, एक तरह की पाबंदी होती है. इसे OptimizeToursRequest मैसेज (REST, gRPC) में दिया जाता है, ताकि शिपमेंट की गतिविधियों के लिए समयसीमा तय की जा सके. इस तरह की पाबंदी से, शिपमेंट कब और कैसे किया जा सकता है, इस पर असर पड़ता है. साथ ही, इससे शिपमेंट के लिए वाहन असाइन करने पर भी असर पड़ता है. इन पाबंदियों के साथ, ऑप्टिमाइज़र उन वाहनों को प्राथमिकता देता है जो शिपमेंट के समय से जुड़ी पाबंदियों को सबसे अच्छी तरह से पूरा कर सकते हैं.
शिपमेंट से जुड़ी पाबंदियां: समयसीमा
Shipment.VisitRequest मैसेज में, पिकअप या डिलीवरी का समय इस तरह बताया जा सकता है:
- मैसेज में
timeWindowsप्रॉपर्टी का इस्तेमाल करना (REST, gRPC) TimeWindowमैसेज (REST, gRPC) में, शुरू और खत्म होने का समय बताएं.
समयसीमा से जुड़ी पाबंदियों के साथ अनुरोध का उदाहरण
यहां दिए गए उदाहरण में, तीन अलग-अलग शिपमेंट दिखाए गए हैं. हर शिपमेंट के लिए डिलीवरी का समय अलग-अलग है. आसानी से समझने के लिए, इस उदाहरण में सिर्फ़ deliveries के लिए समयसीमा सेट की गई है. हालांकि, पिकअप के लिए भी समयसीमा सेट की जा सकती है. एक से ज़्यादा टाइम विंडो तय की जा सकती हैं. हालांकि, इस उदाहरण में हर डिलीवरी के लिए सिर्फ़ एक टाइम विंडो का इस्तेमाल किया गया है 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 के तौर पर इस्तेमाल करने से, वाहन को विज़िट की जगह पर तब तक इंतज़ार नहीं करना पड़ता, जब तक विज़िट की टाइम विंडो शुरू नहीं हो जाती. यह जवाब में शून्य 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]को शाम 6 बजे डिलीवर किया जाता हैshipments[0]को 18:07 पर डिलीवर किया गया
अनुरोध के इस उदाहरण में, समयसीमा से जुड़ी सख्त शर्तें दी गई हैं. इसके मुताबिक, डिलीवरी को तय समयसीमा के अंदर पूरा करना ज़रूरी है. अगर किसी शिपमेंट के VisitRequests को किसी भी समयावधि में पूरा करना मुमकिन नहीं है या यह किफ़ायती नहीं है, तो ऑप्टिमाइज़र उस शिपमेंट को छोड़ देता है. अगर शिपमेंट में penaltyCost है, तो ऑप्टिमाइज़र इसे जवाब में बताई गई कीमतों में जोड़ देता है metrics. ऐसा न करने पर, skippedMandatoryShipmentCount मैसेज (REST, gRPC) की skippedMandatoryShipmentCount प्रॉपर्टी बढ़ जाती है.OptimizeToursResponse
अगर shipment[1] की विंडो को कई घंटे बाद (शाम 6:00 बजे से बदलकर रात 9: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 } ] } }
समयसीमाओं के साथ, अनुरोध के दूसरे उदाहरण का जवाब देखें. इसमें शिपमेंट को स्किप किया गया है
{ "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 में दिखती है. साथ ही, इसका इंडेक्स skippedShipments में दिखता है.
टाइम विंडो से जुड़ी सामान्य पाबंदियां
लागत मॉडल के पैरामीटर में बताए गए समय के मुताबिक, टाइम विंडो को सॉफ़्ट कंस्ट्रेंट के तौर पर लागू किया जा सकता है. सॉफ़्ट कंस्ट्रेंट, हार्ड कंस्ट्रेंट से इस तरह अलग होते हैं:
- सख्त शर्तें: इनका उल्लंघन नहीं किया जा सकता. ऑप्टिमाइज़र, ऐसी कोई भी सुविधा नहीं देता है जिससे इन शर्तों का उल्लंघन होता हो. भले ही, इसका मतलब शिपमेंट को छोड़ना हो.
- सॉफ़्ट कंस्ट्रेंट: इनका उल्लंघन किया जा सकता है. इसका मतलब है कि ऑप्टिमाइज़र, ऐसा समाधान दे सकता है जो सॉफ़्ट कंस्ट्रेंट का उल्लंघन करता हो. हालांकि, ऑप्टिमाइज़र किसी भी उल्लंघन पर लागत भी लागू करता है. इस लागत को, समयसीमा के दौरान अतिरिक्त प्रॉपर्टी के तौर पर उपलब्ध कराया जाता है. आम तौर पर, यह लागत, गतिविधि होने की समयसीमा से पहले या बाद के हर घंटे के लिए, प्रति घंटे के हिसाब से तय की जाती है.
startTime या endTime के बजाय softStartTime या softEndTime का इस्तेमाल करके, टाइम विंडो को कम किया जाता है. साथ ही, costPerHourBeforeSoftStartTime या costPerHourAfterSoftEndTime सेट करके भी ऐसा किया जाता है.
पिकअप या डिलीवरी के लिए, समयसीमा से जुड़ी सामान्य शर्तों का इस्तेमाल तब करें, जब पिकअप या डिलीवरी तय की गई समयसीमा के अंदर होनी चाहिए. हालांकि, उस समयसीमा के अंदर पिकअप या डिलीवरी होना ज़रूरी नहीं है. कारोबार के लक्ष्यों को पूरा करने के लिए, टाइम विंडो की हार्ड और सॉफ़्ट कंस्ट्रेंट, दोनों का एक साथ इस्तेमाल किया जा सकता है. उदाहरण के लिए:
- कारोबार के खुले रहने का समय: इससे पता चलता है कि कारोबार किस समय खुला रहता है. जैसे, सुबह 9 बजे से शाम 5 बजे तक.
- डिलीवरी या पिकअप के लिए तय की गई समयावधि: इससे डिलीवरी या पिकअप के लिए तय की गई समयावधि का पता चलता है. यह समयावधि, खरीदार को भेजी गई सूचना में दी गई समयावधि से मेल खाती है. जैसे, सुबह 9 बजे से दोपहर 1 बजे तक.
इस उदाहरण में, जिस शिपमेंट को पहले इसलिए स्किप कर दिया गया था, क्योंकि उसके लिए समयसीमा बहुत देर से शुरू हुई थी उसके लिए, शुरू होने के समय की पाबंदी को कम कर दिया गया है. अन्य शिपमेंट के लिए भी, डिलीवरी के समयसीमा को थोड़ा बढ़ा दिया गया है.
हार्ड और सॉफ़्ट टाइम विंडो के साथ अनुरोध का उदाहरण देखें
{ "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 प्रॉपर्टी में एक नई कुंजी भी शामिल है. इससे यह पता चलता है कि डिलीवरी की समयसीमा पूरी न होने की वजह से, खरीदार को कितना शुल्क देना पड़ा. यह शुल्क, प्रॉडक्ट की कीमत और डिलीवरी की समयसीमा पूरी न होने की अवधि के हिसाब से तय होता है. यानी:
costPerHourBeforeSoftStartTimeof 2.0 and- डिलीवरी के असल समय और समयसीमा के शुरू होने के बीच का समय: 2.83583 घंटे
नतीजा:
model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time:
5.6716666666666669.
इन मेट्रिक की मदद से, लागत का विश्लेषण किया जा सकता है. इससे आपको हार्ड कंस्ट्रेंट और सॉफ्ट कंस्ट्रेंट के बीच के ट्रेडऑफ़ के बारे में पता चलता है. इसका इस्तेमाल करके, कंस्ट्रेंट को अपने कारोबार के नियमों के हिसाब से बेहतर बनाया जा सकता है. इस मामले में, कुल लागत 20.0 के shipment[1].penalty_cost से कम है. ऑप्टिमाइज़र ने यह पता लगाया है कि शिपमेंट को स्किप करने के बजाय, उसे जल्दी डिलीवर करना ज़्यादा किफ़ायती है.