पिकअप और डिलीवरी के लिए स्टॉप ऑर्डर ऑप्टिमाइज़ेशन की बुनियादी सुविधा

इस उदाहरण में, किसी वाहन को असाइन किए गए स्टॉप के क्रम को ऑप्टिमाइज़ किया जाता है. इसके लिए, लागत के सामान्य पैरामीटर का इस्तेमाल किया जाता है. यह रूट ऑप्टिमाइज़ेशन ऑपरेशन का सबसे आसान मोड है. इससे यह पक्का किया जाता है कि सभी स्टॉप पर तय समयसीमा में पहुंचा जाए.

इस उदाहरण में, एक सामान्य स्थिति दिखाई गई है. इसमें एक वाहन और तीन शिपमेंट हैं. ये सभी शिपमेंट, एक ही जगह से शुरू होते हैं. इस जगह को डिपो कहा जाता है.

अनुरोध का उदाहरण देखें

      {
        "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
            }
          ]
        }
      }
    

Route Optimization API के अनुरोध फ़ील्ड

खास जानकारी में बताया गया है कि रास्ते को ऑप्टिमाइज़ करने के अनुरोध की सबसे अहम प्रॉपर्टी 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 Place ID का इस्तेमाल किया जा सकता है. साथ ही, इसमें वाहन के हेडिंग भी तय किए जा सकते हैं. ज़्यादा जानकारी के लिए, रेफ़रंस दस्तावेज़ (REST, gRPC) देखें.

उदाहरण में दी गई शर्तें

इस स्थिति में, ऑप्टिमाइज़र पर कई तरह की पाबंदियां लग जाती हैं:

  1. सभी गतिविधियां, ग्लोबल स्टार्ट और एंड टाइम के बीच पूरी होनी चाहिए. इस उदाहरण में, शिपमेंट के एक-दूसरे के काफ़ी करीब होने और दुनिया भर में समय की लंबी अवधि होने की वजह से, शुरू और खत्म होने का समय एक बहुत ही ढीला कंस्ट्रेंट है.
  2. सभी शिपमेंट पूरे होने चाहिए. अगर shipments पर पेनल्टी के शुल्क नहीं बताए गए हैं, तो यह डिफ़ॉल्ट रूप से लागू होता है.
  3. costPerKilometer और costPerHour को वाहन पर सेट किया गया है.

लागत के बारे में जानकारी, लागत मॉडल के पैरामीटर में दी गई है.

Route Optimization API के जवाब की प्रॉपर्टी

अनुरोध के उदाहरण का जवाब देखना

    {
      "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 होता है, क्योंकि वाहन को रास्ते की शुरुआत में अपनी शुरुआती जगह से पहली जगह तक और रास्ते के आखिर में अपनी आखिरी जगह से मंज़िल तक जाना होता है. अगर वाहन के शुरू या खत्म होने की जगह की जानकारी नहीं है, तो भी transitions की संख्या visits से ज़्यादा होगी. ऐसा इसलिए, क्योंकि पहली या आखिरी यात्रा की जगह की जानकारी को वाहन के शुरू या खत्म होने की जगह की जानकारी के तौर पर इस्तेमाल किया जाता है.

इस उदाहरण में, पिकअप के लिए की गई पहली तीन यात्राओं के बीच ट्रांज़िशन है. हालांकि, इनके बीच की दूरी और अवधि शून्य है, क्योंकि अनुरोध में तीनों पिकअप के लिए एक ही जगह दी गई है.

ज़्यादा जानकारी के लिए, ShipmentRoute रेफ़रंस दस्तावेज़ (REST, gRPC) देखें.

वेपॉइंट के क्रम को आसानी से ऑप्टिमाइज़ करना

इस उदाहरण में दिखाया गया है कि रूट ऑप्टिमाइज़ेशन मॉडल, शिपमेंट की प्रॉपर्टी के तौर पर विज़िट को मॉडल करता है. साथ ही, इसमें वेपॉइंट या स्टॉप को एक स्वतंत्र इकाई के तौर पर नहीं माना जाता. हालांकि, स्टॉप या वेपॉइंट को शिपमेंट के तौर पर दिखाया जा सकता है. इसके लिए, पिकअप या डिलीवरी के तौर पर सिर्फ़ एक VisitRequest का इस्तेमाल किया जा सकता है. ऑप्टिमाइज़र को सबसे अच्छा रास्ता ढूंढने के लिए, वाहन को costPerHour या costPerKilometer असाइन करना ज़रूरी है. इससे ऑप्टिमाइज़र को कोई भी रास्ता ढूंढने के बजाय, सबसे अच्छा रास्ता ढूंढने में मदद मिलती है.