इस उदाहरण में, सामान्य लागत पैरामीटर वाले वाहन को असाइन किए गए स्टॉप के क्रम को ऑप्टिमाइज़ किया गया है. यह रास्ते के ऑप्टिमाइज़ेशन की कार्रवाई का सबसे आसान मोड है. इससे यह भी पक्का होता है कि सभी स्टॉप तय समयसीमा में देखे जा सकते हैं.
इस उदाहरण में, एक वाहन और तीन शिपमेंट के साथ एक बुनियादी स्थिति दिखाई गई है. ये सभी वाहन एक ही जगह से शुरू हुए हैं, जिसे डिपो कहा जाता है.
उदाहरण के लिए एक अनुरोध देखें
{ "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
प्रॉपर्टी होती है जहां वाहन, अपने आने की जगह के बजाय किसी दूसरे पॉइंट से चला जाता है. जैसे, पार्किंग कॉम्प्लेक्स, इमारत के एक तरफ़ प्रवेश और दूसरी ओर निकास. इस और इसके बाद की गाइड में, आने और जाने के समय को एक जैसा माना गया है.
latLng
के विकल्प के तौर पर, आने और जाने की फ़्लाइट waypoint
भी मौजूद है.
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
असाइन करना होगा, न कि कोई अच्छा रास्ता ढूंढने के लिए.