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]
, 18:00 बजे डिलीवर किया जाता हैshipments[0]
18:07 पर डिलीवर होता है
उदाहरण के अनुरोध में टाइम विंडो की हार्ड कंस्ट्रेंट के बारे में बताया गया है, जिसमें डिलीवरी को उन विंडो में पूरा करना ज़रूरी है. अगर किसी शिपमेंट के VisitRequests
को उसकी किसी भी टाइम विंडो में भरना संभव या किफ़ायती नहीं है, तो ऑप्टिमाइज़र शिपमेंट को स्किप कर देगा. अगर शिपमेंट में penaltyCost
है, तो ऑप्टिमाइज़र इसे जवाब में बताई गई लागत में जोड़ देता है, metrics
. ऐसा न करने पर, OptimizeToursResponse
मैसेज (REST, gRPC) की skippedMandatoryShipmentCount
प्रॉपर्टी बढ़ जाती है.
अगर shipment[1]
की विंडो को कई घंटों के बाद (18:00 से 21: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
प्रॉपर्टी में एक नई कुंजी भी शामिल की जाती है. इसकी मदद से, कंस्ट्रेंट के प्रॉडक्ट के आधार पर लगने वाली असल लागत और डिलीवरी विंडो के छूटे हुए समय की जानकारी दी जाती है. यानी:
- 2.0 में से
costPerHourBeforeSoftStartTime
और - वास्तविक डिलीवरी और समय विंडो के शुरू होने के बीच का समय: 2.83583 घंटे
नतीजा:
model.shipments.deliveries.time_windows.cost_per_hour_before_soft_start_time
:
5.6716666666666669.
इन मेट्रिक की मदद से, लागत का विश्लेषण करके यह पता किया जा सकता है कि
मुश्किल कंस्ट्रेंट और सॉफ़्ट कंस्ट्रेंट के बीच क्या फ़र्क़ है. इस मामले में, कुल लागत 20.0 से shipment[1].penalty_cost
से कम है. ऑप्टिमाइज़र ने पाया है कि शिपमेंट को स्किप करने के बजाय, उसे जल्दी डिलीवर करना ज़्यादा किफ़ायती है.