इस गाइड में loadDemands
और loadLimits
के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि ये दोनों एक-दूसरे से कैसे जुड़े हैं.
पिकअप और डिलीवरी के समय की विंडो से जुड़ी पाबंदियां में बताए गए तरीके के मुताबिक, OptimizeToursRequest
मैसेज (REST, gRPC) में कई ऐसी प्रॉपर्टी होती हैं जो ऑप्टिमाइज़ की जा रही समस्या पर पाबंदियां तय करती हैं. कई OptimizeToursRequest
प्रॉपर्टी, लोड की सीमाओं को दिखाती हैं.
वाहनों और शिपमेंट की कुछ ऐसी प्रॉपर्टी होती हैं जिन्हें रास्ते का प्लान बनाते समय ध्यान में रखना ज़रूरी होता है.
- वाहन:
loadLimits
प्रॉपर्टी से पता चलता है कि वाहन ज़्यादा से ज़्यादा कितना लोड ले जा सकता है.Vehicle
मैसेज (REST, gRPC) से जुड़े दस्तावेज़ देखें. - शिपमेंट:
loadDemands
प्रॉपर्टी से पता चलता है कि किसी शिपमेंट में कितना लोड है.Shipment
मैसेज (REST, gRPC) से जुड़े दस्तावेज़ देखें.
इन दोनों शर्तों की वजह से, ऑप्टिमाइज़र के लिए यह मुमकिन हो पाता है कि वह वाहनों को शिपमेंट इस तरह से असाइन करे कि वे आपकी फ्लीट की क्षमता और शिपमेंट की मांगों के हिसाब से सबसे सही हों.
इस दस्तावेज़ के बाकी हिस्से में, loadLimits
और loadDemands
के बारे में विस्तार से बताया गया है.
लोड की मांग और सीमाएं: टाइप
लोड की हर मांग और सीमा की शर्त को type के हिसाब से तय किया जाता है.
आपके पास लोड टाइप का अपना सेट देने का विकल्प होता है. जैसे, यहां दिए गए उदाहरण:
- वज़न का डेटा
- आवाज़
- लीनियर मेज़रमेंट
- परिवहन किए जा रहे सामान या उपकरण के नाम
इस गाइड में, weightKg
को उदाहरण के तौर पर इस्तेमाल किया गया है.
Shipment.loadDemands
और Vehicle.loadLimits
, दोनों प्रोटोकॉल बफ़र map
टाइप का इस्तेमाल करते हैं. इनमें string
कुंजियां होती हैं, जो लोड के टाइप को दिखाती हैं.
Shipment.loadDemands
वैल्यू, Load
मैसेज (REST, gRPC) का इस्तेमाल करती हैं.
Load
मैसेज में एक amount
प्रॉपर्टी होती है. इससे पता चलता है कि तय किए गए टाइप में शिपमेंट पूरा करने के लिए कितनी क्षमता की ज़रूरत है.
Vehicle.loadLimits
वैल्यू, LoadLimit
मैसेज (REST,
gRPC) का इस्तेमाल करती हैं. LoadLimit
मैसेज में कई प्रॉपर्टी होती हैं. इनमें से maxLoad
, तय किए गए टाइप के हिसाब से वाहन की ज़्यादा से ज़्यादा लोड क्षमता को दिखाता है.
किसी शिपमेंट का loadDemands
, असाइन किए गए वाहन के loadLimits
का इस्तेमाल सिर्फ़ तब करता है, जब दोनों के लोड टाइप की कुंजियां मेल खाती हों. उदाहरण के लिए, loadDemands
वाले शिपमेंट:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
शिपमेंट पूरा करने के लिए, weightKg
टाइप में 50 लोड यूनिट की ज़रूरत होती है. loadLimits
वाला वाहन:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
ऐसा हो सकता है कि वाहन से सामान की शिपिंग पूरी की जा सके. ऐसा इसलिए, क्योंकि weightKg
टाइप के वाहन की maxLoad
, weightKg
टाइप के सामान की loadDemands
से ज़्यादा या इसके बराबर है. हालांकि, loadLimits
वाले वाहन के लिए:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
weightKg
की लोड लिमिट न होने की वजह से, इसमें अनलिमिटेड weightKg
क्षमता होती है. इसलिए, वाहन पर शिपमेंट के वज़न का कोई असर नहीं पड़ता.
शिपमेंट और वाहनों के बीच लोड ट्रांसफ़र करना
शिपमेंट को वाहनों से पिक अप और डिलीवर किया जाता है. इसलिए, शिपमेंट का loadDemand
, शिपमेंट और वाहन के बीच ट्रांसफ़र होता है. किसी वाहन के लिए, OptimizeToursResponse
मैसेज (REST, gRPC)routes.transitions
एंट्री में वाहन के लोड देखे जा सकते हैं. क्रम इस तरह है:
- शिपमेंट के लिए ज़रूरी लोड क्षमता को
loadDemand
के तौर पर तय किया जाता है. - शिपमेंट को असाइन किया गया वाहन उसे पिक अप करता है. इसके बाद, वाहन का
vehicleLoads
, शिपमेंट केloadDemand
के हिसाब से बढ़ जाता है. इस ट्रांसफ़र को जवाब के मैसेज में positivevisits.loadDemands
के तौर पर दिखाया जाता है. - वाहन, शिपमेंट डिलीवर करता है. इसके बाद, वाहन के
vehicleLoads
में डिलीवर किए गए शिपमेंट केloadDemand
के बराबर कमी आ जाती है. इस ट्रांसफ़र को जवाब के मैसेज में नेगेटिवvisits.loadDemands
के तौर पर दिखाया जाता है.
किसी वाहन का vehicleLoads
, उसके रास्ते में किसी भी जगह पर तय किए गए loadLimits
से ज़्यादा नहीं होना चाहिए.
लोड करने की मांगों और सीमाओं के साथ पूरा उदाहरण
लोड करने की मांगों और सीमाओं के साथ अनुरोध का उदाहरण देखें
{ "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" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": 50 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 15.0, "loadDemands": { "weightKg": { "amount": 10 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": 80 } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": 100 } } } ] } }
अनुरोध के इस उदाहरण में, लोड से जुड़े कई पैरामीटर शामिल हैं:
shipments[0]
में 50weightKg
लोड करने की मांग है.shipments[1]
को 10weightKg
की लोड डिमांड है.shipments[2]
में 80weightKg
लोड करने की मांग है.vehicles[0]
में 100weightKg
लोड करने की सीमा है.
लोड की मांगों और सीमाओं के साथ अनुरोध का जवाब देखना
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:43:27Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T16:00:00Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "50" } } }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T16:02:30Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "10" } } }, { "startTime": "2023-01-13T16:08:55Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "-50" } } }, { "shipmentIndex": 1, "startTime": "2023-01-13T16:16:37Z", "detour": "343s", "loadDemands": { "weightKg": { "amount": "-10" } } }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T16:27:07Z", "detour": "1627s", "loadDemands": { "weightKg": { "amount": "80" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:36:26Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-80" } } } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:02:30Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T16:05:00Z", "vehicleLoads": { "weightKg": { "amount": "60" } } }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T16:13:05Z", "vehicleLoads": { "weightKg": { "amount": "10" } } }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-13T16:20:47Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T16:29:37Z", "vehicleLoads": { "weightKg": { "amount": "80" } } }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T16:40:36Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 48.12, "model.vehicles.cost_per_hour": 28.966666666666665 }, "routeTotalCost": 77.086666666666659 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:43:27Z", "totalCost": 77.086666666666659, "costs": { "model.vehicles.cost_per_hour": 28.966666666666665, "model.vehicles.cost_per_kilometer": 48.12 } } }
वज़न की सीमाएं जोड़ने से, visits
के क्रम पर असर पड़ता है:
shipment[0]
को पिक अप कर लिया गया हैshipment[1]
को पिक अप कर लिया गया हैshipment[0]
डिलीवर कर दिया गया हैshipment[1]
डिलीवर कर दिया गया हैshipment[2]
को पिक अप कर लिया गया हैshipment[2]
डिलीवर कर दिया गया है
इस ऑर्डर से पता चलता है कि वाहन एक साथ तीन शिपमेंट नहीं कर सकता, क्योंकि उनका कुल loadDemands
, वाहन के loadLimits
से ज़्यादा है.
हर visits
एंट्री में, Visit
पूरा होने के बाद वाहन के लोड में हुए बदलाव की जानकारी शामिल होती है. पॉज़िटिव लोड वैल्यू से शिपमेंट लोड होने का पता चलता है. वहीं, नेगेटिव वैल्यू से शिपमेंट अनलोड होने का पता चलता है.
हर transitions
एंट्री में, Transition
के दौरान वाहन पर मौजूद कुल लोड की जानकारी शामिल होती है. उदाहरण के लिए, transitions[2]
का लोड 60 है. यह shipment[0]
और shipment[1]
के कुल लोड को दिखाता है.weightKg
मेट्रिक ऑब्जेक्ट routes[0].metrics
और metrics.aggregatedRouteMetrics
में maxLoads
प्रॉपर्टी शामिल होती है. टाइप weightKg
की वैल्यू 80 है. इससे पता चलता है कि वाहन के रूट का वह हिस्सा जहां shipments[2]
को डिलीवरी की जगह पर ले जाया गया.
सॉफ़्ट लोड की सीमा से जुड़ी शर्तें
पिकअप और डिलीवरी के समय की विंडो से जुड़ी पाबंदियों में बताई गई समय की विंडो की तरह ही, लोड की सीमा से जुड़ी पाबंदियों के भी हार्ड और सॉफ्ट वैरिएंट होते हैं. LoadLimit
मैसेज की maxLoad
प्रॉपर्टी, एक ज़रूरी शर्त के बारे में बताती है: वाहन को कभी भी तय किए गए maxLoad
वैल्यू से ज़्यादा लोड नहीं ले जाना चाहिए. softMaxLoad
और costPerUnitAboveSoftMax
प्रॉपर्टी, एक सामान्य शर्त को दिखाती हैं. softMaxLoad
से ज़्यादा हर यूनिट के लिए, costPerUnitAboveSoftMax
लागत लगती है.
सॉफ़्ट लोड की सीमा से जुड़ी पाबंदियों का इस्तेमाल कई कामों के लिए किया जा सकता है. जैसे:
- शिपमेंट को ज़रूरी संख्या से ज़्यादा वाहनों में बांटना जब ऐसा करना किफ़ायती हो
- ड्राइवर की पसंद के मुताबिक, किसी रास्ते पर पिकअप और डिलीवरी किए जा सकने वाले आइटम की संख्या
- वाहनों को उनकी क्षमता से कम लोड करना, ताकि वे कम घिसें और रखरखाव की लागत कम हो
हार्ड और सॉफ़्ट लोड लिमिट की शर्तों का इस्तेमाल एक साथ किया जा सकता है. उदाहरण के लिए, हार्ड लोड लिमिट से यह पता चल सकता है कि कोई वाहन ज़्यादा से ज़्यादा कितना वज़न ले जा सकता है या उसमें एक बार में ज़्यादा से ज़्यादा कितने आइटम रखे जा सकते हैं. वहीं, सॉफ्ट लोड लिमिट से यह पता चल सकता है कि ज़्यादा से ज़्यादा कितना वज़न या कितने आइटम ले जाने पर, ड्राइवर को वाहन में सामान रखने में मुश्किल हो सकती है.