यह उदाहरण, आसान लागत पैरामीटर वाले वाहन को असाइन किए गए स्टॉप के क्रम को ऑप्टिमाइज़ करता है. यह रूट ऑप्टिमाइज़ेशन का सबसे आसान मोड है. इससे यह पक्का किया जाता है कि सभी स्टॉप पर एक तय समयसीमा के दौरान पहुंचा जाए.
नीचे दिए गए उदाहरण में, एक ऐसी बुनियादी स्थिति के बारे में बताया गया है जिसमें एक वाहन और तीन शिपमेंट हैं, जो एक ही जगह से डिपो नाम से शुरू होते हैं.
अनुरोध का एक उदाहरण देखें
{ "populatePolylines": true, "populateTransitionPolylines": true, "model": { "globalStartTime": "2023-01-13T16:00:00-08:00", "globalEndTime": "2023-01-14T16:00:00-08:00", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ] } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerKilometer": 10.0, "costPerHour": 40.0 } ] } }
रूट के ऑप्टिमाइज़ेशन के अनुरोध वाले फ़ील्ड
जैसा कि खास जानकारी में बताया गया है, रूट ऑप्टिमाइज़ेशन के अनुरोध की सबसे अहम प्रॉपर्टी vehicles
और shipments
हैं.
वाहन और शिपमेंट के अलावा, अनुरोध में ये फ़ील्ड भी शामिल होते हैं:
पॉलीलाइन
populatePolylines
और populateTransitionPolylines
तय करते हैं कि रूट ऑप्टिमाइज़ेशन से
पॉलीलाइन मिलने चाहिए या नहीं.
यह सेवा, Maps के JS पॉलीलाइन कोडेक का इस्तेमाल करके पॉलीलाइन को कोड में बदलता है. यह प्रिंट होने वाले ASCII वर्णों की मदद से, बाइनरी पॉलीलाइन डेटा को दिखाता है. रूट ऑप्टिमाइज़ेशन से कैलकुलेट किए गए पाथ को विज़ुअलाइज़ करने के लिए, इंटरैक्टिव पॉलीलाइन एन्कोडर यूटिलिटी का इस्तेमाल किया जा सकता है. इस गाइड में दिए गए उदाहरण में, populatePolylines
और populateTransitionPolylines
को 'सही' पर सेट किया गया है. हालांकि, अन्य गाइड ने रिस्पॉन्स साइज़ को कम करने के लिए, उन्हें 'गलत' पर सेट किया है.
कोड में बदलने के फ़ॉर्मैट की जानकारी के लिए, कोड में बदला गया पॉलीलाइन एल्गोरिदम फ़ॉर्मैट देखें.
वैश्विक समय की सीमाएं
model.globalStartTime
और model.globalEndTime
को 24 घंटे के हिसाब से सेट किया गया है. इससे आउटपुट टाइमस्टैंप को आसानी से समझा जा सकता है.
विज़िट की गई जगहें
उदाहरण के तौर पर दिए गए अनुरोध में, सिर्फ़ model.shipments[].pickups[].arrivalLocation
और
model.shipments[].deliveries[].arrivalLocation
का इस्तेमाल किया जाता है. ऐसी स्थितियों के लिए भी departureLocation
प्रॉपर्टी है जहां वाहन अपनी मंज़िल के बजाय किसी दूसरी जगह से जाता है. जैसे, पार्किंग कॉम्प्लेक्स, जहां जाने के लिए अंदर जाने का रास्ता इमारत के एक तरफ़ होता है और बाहर निकलने का रास्ता दूसरी जगह से होता है. इस और इसके बाद की गाइड में, आने और जाने की जगह को एक ही माना जाता है.
आने और जाने वाली फ़्लाइट waypoint
भी latLng
के विकल्प के तौर पर उपलब्ध हैं.
Waypoint
फ़ील्ड में, LatLng
के विकल्प के तौर पर Google के प्लेस आईडी इस्तेमाल किए जा सकते हैं. साथ ही, इनमें वाहन के टाइटल की जानकारी भी दी जा सकती है. ज़्यादा जानकारी के लिए, रेफ़रंस दस्तावेज़
(REST, gRPC) देखें.
उदाहरण में पाबंदियां
यह स्थिति ऑप्टिमाइज़र को कई तरीकों से सीमित करती है:
- सभी गतिविधियां ग्लोबल शुरू और खत्म होने के समय के बीच पूरी होनी चाहिए. ऐसी स्थिति में, शिपिंग की शुरुआत और खत्म होने के समय में रुकावट नहीं आती.
- सभी शिपमेंट पूरे होने चाहिए. यह डिफ़ॉल्ट तरीका है, जब
shipments
पर पेनल्टी शुल्क की जानकारी नहीं दी जाती है. - वाहन पर
costPerKilometer
औरcostPerHour
सेट किए गए हैं.
लागत मॉडल पैरामीटर में लागत का पता लगाया जाता है.
रूट ऑप्टिमाइज़ेशन रिस्पॉन्स प्रॉपर्टी
उदाहरण के तौर पर दिए गए अनुरोध का जवाब देखें
{ "routes": [ { "vehicleStartTime": "2023-01-14T00:00:00Z", "vehicleEndTime": "2023-01-14T00:36:41Z", "visits": [ { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-14T00:00:00Z", "detour": "0s" }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-14T00:02:30Z", "detour": "150s" }, { "isPickup": true, "startTime": "2023-01-14T00:05:00Z", "detour": "300s" }, { "startTime": "2023-01-14T00:11:25Z", "detour": "0s" }, { "shipmentIndex": 1, "startTime": "2023-01-14T00:19:29Z", "detour": "503s" }, { "shipmentIndex": 2, "startTime": "2023-01-14T00:29:02Z", "detour": "1324s" } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:00:00Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:02:30Z", "routePolyline": {} }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-14T00:05:00Z", "routePolyline": {} }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-14T00:07:30Z", "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "travelDuration": "234s", "travelDistanceMeters": 793, "waitDuration": "0s", "totalDuration": "234s", "startTime": "2023-01-14T00:15:35Z", "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "travelDuration": "323s", "travelDistanceMeters": 1204, "waitDuration": "0s", "totalDuration": "323s", "startTime": "2023-01-14T00:23:39Z", "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "travelDuration": "209s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "209s", "startTime": "2023-01-14T00:33:12Z", "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" }, "metrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "travelSteps": [ { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "0s", "routePolyline": {} }, { "duration": "227s", "distanceMeters": 794, "routePolyline": { "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@" } }, { "duration": "233s", "distanceMeters": 791, "routePolyline": { "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@" } }, { "duration": "322s", "distanceMeters": 1205, "routePolyline": { "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@" } }, { "duration": "208s", "distanceMeters": 666, "routePolyline": { "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A" } } ], "vehicleDetour": "2201s", "routeCosts": { "model.vehicles.cost_per_hour": 24.455555555555556, "model.vehicles.cost_per_kilometer": 34.57 }, "routeTotalCost": 59.025555555555556 } ], "totalCost": 59.025555555555556, "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1001s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2201s", "travelDistanceMeters": 3457 }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-14T00:00:00Z", "latestVehicleEndTime": "2023-01-14T00:36:41Z", "totalCost": 59.025555555555556, "costs": { "model.vehicles.cost_per_kilometer": 34.57, "model.vehicles.cost_per_hour": 24.455555555555556 } } }
रास्ते के ऑप्टिमाइज़ेशन के अनुरोध में एक टॉप लेवल routes
फ़ील्ड शामिल होता है, जो सुझाए गए रास्तों को दिखाता है. इसमें एक वाहन के लिए एक ही रास्ता बताया जाता है. इस गाइड में दिए गए उदाहरण में, सिर्फ़ एक वाहन के बारे में बताया गया है. इसलिए, routes
में एक ShipmentRoute
मैसेज शामिल है.
ShipmentRoute
प्रॉपर्टी
ShipmentRoute
मैसेज टाइप के लिए दो सबसे अहम प्रॉपर्टी,
visits
और transitions
हैं.
हर Visit
, अनुरोध किए गए मैसेज के VisitRequest
से पिक अप या डिलीवरी की प्रक्रिया पूरी होने के बारे में बताता है. विज़िट का मतलब है, वह काम जिसे वाहन से किसी जगह और समय पर पूरा करना है.
हर Transition
, एक जगह से अगली जगह जाने वाले वाहन के बारे में बताता है. ट्रांज़िशन, वाहन के चालू होने की जगह, विज़िट की जगह, और वाहन के एंडपॉइंट के बीच हो सकता है.
वाहन के पूरे रास्ते को फिर से बनाने के लिए, ShipmentRoute
के visits
और
transitions
को आपस में जोड़ना होगा. फ़ील्ड के कॉम्बिनेशन, वाहन की गतिविधि के हिसाब से कुछ इस तरह दिखते हैं:
request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation
ShipmentRoute
में visits
के मुकाबले हमेशा एक transitions
ज़्यादा होता है. ऐसा इसलिए होता है, क्योंकि वाहन को इसकी शुरुआती जगह से लेकर, रास्ते की शुरुआत में अपनी आखिरी जगह तक जाना चाहिए. साथ ही, रास्ते के आखिर में आखिरी जगह तक जाना चाहिए. अगर वाहन के शुरू या खत्म होने की जगह मौजूद नहीं है, तो visits
के मुकाबले transitions
ज़्यादा होगा. इसकी वजह यह है कि वाहन के शुरू या खत्म होने की जगह को पहली या आखिरी जगह के तौर पर इस्तेमाल किया गया है.
इस उदाहरण में, पिकअप की पहली तीन विज़िट के बीच ट्रांज़िशन की कोई दूरी और अवधि नहीं है. इसकी वजह यह है कि तीनों पिकअप की जगह, अनुरोध में एक ही है.
ज़्यादा जानकारी के लिए, ShipmentRoute
रेफ़रंस दस्तावेज़ (REST, gRPC) देखें.
वेपॉइंट ऑर्डर का आसान ऑप्टिमाइज़ेशन
जैसा कि इस उदाहरण में दिखाया गया है, रूट ऑप्टिमाइज़ेशन मॉडल विज़िट को शिपमेंट की प्रॉपर्टी के तौर पर दिखाता है. इसमें वेपॉइंट या स्टॉप को अलग इकाई के तौर पर शामिल नहीं किया जाता. हालांकि, स्टॉप या वेपॉइंट को शिपमेंट के तौर पर दिखाया जा सकता है. इसमें पिकअप या डिलीवरी के तौर पर सिर्फ़ एक VisitRequest
दिया जा सकता है. हालांकि, वाहन को अब भी costPerHour
या costPerKilometer
असाइन किया जाना चाहिए, ताकि ऑप्टिमाइज़र को सबसे बेहतर रास्ता मिल सके. इससे, किसी बेहतर रास्ते को ढूंढने में आसानी होगी.