Method: projects.locations.optimizeTours

यह OptimizeToursRequest भेजता है, जिसमें ShipmentModel शामिल होता है. साथ ही, यह OptimizeToursResponse दिखाता है, जिसमें ShipmentRoute शामिल होते हैं. ये ऐसे रास्तों का सेट होता है जिन पर वाहनों को चलना होता है, ताकि कुल लागत कम से कम हो.

ShipmentModel मॉडल में मुख्य रूप से Shipment होते हैं, जिन्हें पूरा करना होता है. साथ ही, इसमें Vehicle होते हैं, जिनका इस्तेमाल Shipment को एक जगह से दूसरी जगह ले जाने के लिए किया जा सकता है. ShipmentRoute, Shipment को Vehicle असाइन करते हैं. खास तौर पर, वे हर वाहन को Visit की एक सीरीज़ असाइन करते हैं. इसमें एक Visit का मतलब एक VisitRequest होता है. यह Shipment के लिए पिकअप या डिलीवरी होती है.

इसका मकसद, ShipmentRoute को Vehicle असाइन करना है, ताकि कुल लागत कम से कम हो. लागत में कई कॉम्पोनेंट होते हैं, जिन्हें ShipmentModel में तय किया जाता है.

एचटीटीपी अनुरोध

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

यह यूआरएल, gRPC ट्रांसकोडिंग सिंटैक्स का इस्तेमाल करता है.

पाथ पैरामीटर

पैरामीटर
parent

string

ज़रूरी है. कॉल करने के लिए, प्रोजेक्ट या जगह को टारगेट करें.

फ़ॉर्मैट:

  • projects/{project-id}
  • projects/{project-id}/locations/{location-id}

अगर कोई जगह नहीं चुनी जाती है, तो कोई क्षेत्र अपने-आप चुन लिया जाएगा.

अनुरोध का मुख्य भाग

अनुरोध के मुख्य हिस्से में, इस स्ट्रक्चर का डेटा शामिल होता है:

JSON के काेड में दिखाना
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
फ़ील्ड
timeout

string (Duration format)

अगर यह टाइम आउट सेट किया गया है, तो सर्वर टाइम आउट की अवधि खत्म होने से पहले या सिंक्रोनस अनुरोधों के लिए सर्वर की समयसीमा पूरी होने से पहले जवाब देता है. इनमें से जो भी पहले हो.

एसिंक्रोनस अनुरोधों के लिए, सर्वर टाइमआउट खत्म होने से पहले ही समाधान जनरेट कर देगा. हालांकि, ऐसा तब ही होगा, जब समाधान जनरेट करना मुमकिन हो.

यह अवधि को सेकंड में दिखाता है. इसमें नौ दशमलव अंक तक हो सकते हैं. इसके आखिर में 's' होता है. उदाहरण: "3.5s".

model

object (ShipmentModel)

शिपमेंट से जुड़ी समस्या को हल करने के लिए मॉडल.

solvingMode

enum (SolvingMode)

डिफ़ॉल्ट रूप से, हल करने का मोड DEFAULT_SOLVE (0) होता है.

searchMode

enum (SearchMode)

अनुरोध को पूरा करने के लिए इस्तेमाल किया गया खोज मोड.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

ऑप्टिमाइज़ेशन एल्गोरिदम को, पिछले समाधान से मिलता-जुलता पहला समाधान ढूंढने में मदद करें.

पहला समाधान बनाते समय, मॉडल पर कुछ पाबंदियां लगाई जाती हैं. अगर किसी शिपमेंट को किसी रूट पर नहीं ले जाया जाता है, तो पहले समाधान में उसे अपने-आप छोड़ दिया जाता है. हालांकि, बाद के समाधानों में उसे शामिल किया जा सकता है.

समाधान में, कुछ बुनियादी मान्यताओं को पूरा किया जाना चाहिए:

  • सभी रास्तों के लिए, vehicleIndex वैल्यू तय सीमा में होनी चाहिए और डुप्लीकेट नहीं होनी चाहिए.
  • सभी विज़िट के लिए, shipmentIndex और visitRequestIndex रेंज में होने चाहिए.
  • किसी शिपमेंट को सिर्फ़ एक रास्ते पर रेफ़रंस किया जा सकता है.
  • पिकअप-डिलीवरी वाले शिपमेंट को डिलीवर करने से पहले, उसे पिकअप करना ज़रूरी है.
  • शिपमेंट के लिए, पिकअप या डिलीवरी का सिर्फ़ एक विकल्प चुना जा सकता है.
  • सभी रास्तों के लिए, यात्रा में लगने वाला समय बढ़ रहा है (जैसे, vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • शिपिंग सिर्फ़ ऐसे वाहन से की जा सकती है जिसे अनुमति मिली हो. किसी वाहन को तब अनुमति दी जाती है, जब Shipment.allowed_vehicle_indices खाली हो या उसका vehicleIndex, Shipment.allowed_vehicle_indices में शामिल हो.

अगर डाला गया समाधान काम नहीं करता है, तो ज़रूरी नहीं है कि पुष्टि करने से जुड़ी गड़बड़ी का मैसेज दिखे. इसके बजाय, काम न करने की वजह बताने वाला मैसेज दिख सकता है.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

ऑप्टिमाइज़ेशन एल्गोरिदम को सीमित करें, ताकि वह ऐसा फ़ाइनल समाधान खोज सके जो पिछले समाधान से मिलता-जुलता हो. उदाहरण के लिए, इसका इस्तेमाल उन रास्तों के हिस्सों को फ़्रीज़ करने के लिए किया जा सकता है जिन्हें पहले ही पूरा कर लिया गया है या जिन्हें पूरा किया जाना है, लेकिन उनमें बदलाव नहीं किया जाना चाहिए.

अगर डाला गया समाधान काम नहीं करता है, तो ज़रूरी नहीं है कि पुष्टि करने से जुड़ी गड़बड़ी का मैसेज दिखे. इसके बजाय, काम न करने की वजह बताने वाला मैसेज दिख सकता है.

refreshDetailsRoutes[]

object (ShipmentRoute)

अगर यह खाली नहीं है, तो दिए गए रास्तों को रीफ़्रेश किया जाएगा. हालांकि, विज़िट के क्रम या यात्रा के समय में कोई बदलाव नहीं किया जाएगा. सिर्फ़ अन्य जानकारी अपडेट की जाएगी. इससे मॉडल की समस्या हल नहीं होती.

नवंबर 2020 से, यह सिर्फ़ उन रास्तों की पॉलीलाइन भरता है जिनमें कोई न कोई स्टेशन मौजूद है. इसके लिए, populatePolylines को 'सही है' पर सेट करना ज़रूरी है.

ऐसा हो सकता है कि पास किए गए रास्तों के routePolyline फ़ील्ड, रास्ते transitions से मेल न खाएं.

इस फ़ील्ड का इस्तेमाल, injectedFirstSolutionRoutes या injectedSolutionConstraint के साथ नहीं किया जाना चाहिए.

Shipment.ignore और Vehicle.ignore का व्यवहार पर कोई असर नहीं पड़ता. पॉलीलाइनें अब भी सभी नॉन-एम्टी रूट में, सभी विज़िट के बीच दिखती हैं. भले ही, संबंधित शिपमेंट या वाहनों को अनदेखा किया गया हो.

interpretInjectedSolutionsUsingLabels

boolean

अगर यह सही है, तो:

  • अनुरोध में शामिल वाहनों के साथ इंजेक्ट किए गए समाधान में रास्तों का मिलान करने के लिए, vehicleIndex के बजाय ShipmentRoute.vehicle_label का इस्तेमाल करता है; अगर ConstraintRelaxation.vehicle_indices खाली नहीं है, तो उसे अपडेट करने के लिए, ओरिजनल ShipmentRoute.vehicle_index की मैपिंग को नए ShipmentRoute.vehicle_index के साथ फिर से इस्तेमाल करता है.हालांकि, मैपिंग साफ़ तौर पर समझ में आनी चाहिए. इसका मतलब है कि कई ShipmentRoute को एक ही ओरिजनल vehicleIndex शेयर नहीं करना चाहिए.
  • अनुरोध में शामिल शिपमेंट के साथ, इंजेक्ट किए गए समाधान में शामिल विज़िट को मैच करने के लिए, shipmentIndex के बजाय ShipmentRoute.Visit.shipment_label का इस्तेमाल करता है;
  • यह SkippedShipment.index के बजाय SkippedShipment.label का इस्तेमाल करता है, ताकि इंजेक्ट किए गए समाधान में छोड़े गए शिपमेंट को अनुरोध किए गए शिपमेंट से मैच किया जा सके.

यह व्याख्या, injectedFirstSolutionRoutes, injectedSolutionConstraint, और refreshDetailsRoutes फ़ील्ड पर लागू होती है. इसका इस्तेमाल तब किया जा सकता है, जब समाधान बनाने के बाद से अनुरोध में शिपमेंट या वाहन के इंडेक्स बदल गए हों. ऐसा शायद इसलिए हुआ है, क्योंकि अनुरोध से शिपमेंट या वाहन हटा दिए गए हैं या उनमें जोड़ दिए गए हैं.

अगर सही है, तो यहां दी गई कैटगरी के लेबल, अपनी कैटगरी में ज़्यादा से ज़्यादा एक बार दिखने चाहिए:

  • Vehicle.label अनुरोध में शामिल हो;
  • Shipment.label अनुरोध में शामिल हो;
  • ShipmentRoute.vehicle_label इंजेक्ट किए गए सलूशन में;
  • SkippedShipment.label और ShipmentRoute.Visit.shipment_label को इंजेक्ट किए गए समाधान में शामिल करें. हालांकि, पिकअप/डिलिवरी के लिए विज़िट के जोड़े को छोड़कर, जिनके shipmentLabel को दो बार शामिल करना ज़रूरी है.

अगर इंजेक्ट किए गए समाधान में मौजूद vehicleLabel, अनुरोध किए गए वाहन से मेल नहीं खाता है, तो समाधान से उस रूट को हटा दिया जाता है. साथ ही, उस रूट पर की गई यात्राओं की जानकारी भी हटा दी जाती है. अगर इंजेक्ट किए गए समाधान में मौजूद shipmentLabel, अनुरोध किए गए शिपमेंट से मेल नहीं खाता है, तो समाधान से उस विज़िट को हटा दिया जाता है. अगर इंजेक्ट किए गए समाधान में मौजूद SkippedShipment.label, शिपमेंट के अनुरोध से मेल नहीं खाता है, तो समाधान से SkippedShipment हटा दिया जाता है.

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

ध्यान दें: कॉल करने वाले व्यक्ति को यह पक्का करना होगा कि हर Vehicle.label (resp. Shipment.label) किसी वाहन (यानी कि शिपमेंट) की ऐसी इकाई की यूनीक पहचान करता है जिसका इस्तेमाल, दो ज़रूरी अनुरोधों में किया जाता है: पहला, वह पिछला अनुरोध जिसने OptimizeToursResponse जनरेट किया था और जिसका इस्तेमाल इंजेक्ट किए गए समाधान में किया गया था. दूसरा, वह मौजूदा अनुरोध जिसमें इंजेक्ट किया गया समाधान शामिल है. ऊपर बताई गई जांचों से, इस ज़रूरी शर्त को पूरा करने की गारंटी नहीं मिलती.

considerRoadTraffic

boolean

ShipmentRoute फ़ील्ड Transition.travel_duration, Visit.start_time, और vehicleEndTime की वैल्यू तय करते समय, ट्रैफ़िक का अनुमान लगाएं. साथ ही, ShipmentRoute.has_traffic_infeasibilities फ़ील्ड की वैल्यू सेट करते समय और OptimizeToursResponse.total_cost फ़ील्ड की वैल्यू तय करते समय भी ट्रैफ़िक का अनुमान लगाएं.

populatePolylines

boolean

अगर यह विकल्प चुना जाता है, तो जवाब ShipmentRoutes में पॉलीलाइन अपने-आप भर जाएंगी.

populateTransitionPolylines

boolean

अगर यह वैल्यू सही है, तो जवाब ShipmentRoute.transitions में पॉलीलाइन और रूट टोकन शामिल किए जाएंगे.

allowLargeDeadlineDespiteInterruptionRisk

boolean

अगर यह सेट है, तो अनुरोध के लिए ज़्यादा से ज़्यादा 60 मिनट की समयसीमा तय की जा सकती है. इसके बारे में ज़्यादा जानने के लिए, https://grpc.io/blog/deadlines पर जाएं. ऐसा न होने पर, ज़्यादा से ज़्यादा समयसीमा सिर्फ़ 30 मिनट होती है. ध्यान दें कि लंबे समय तक चलने वाले अनुरोधों में रुकावट आने का जोखिम काफ़ी ज़्यादा होता है. हालांकि, यह जोखिम अब भी कम होता है.

useGeodesicDistances

boolean

अगर यह वैल्यू सही है, तो यात्रा की दूरी का हिसाब लगाने के लिए, Google Maps में मौजूद दूरी के बजाय जियोडेसिक दूरी का इस्तेमाल किया जाएगा. साथ ही, यात्रा में लगने वाले समय का हिसाब लगाने के लिए, जियोडेसिक दूरी का इस्तेमाल किया जाएगा. इसमें geodesicMetersPerSecond में तय की गई स्पीड का इस्तेमाल किया जाएगा.

label

string

यह लेबल, इस अनुरोध की पहचान करने के लिए इस्तेमाल किया जा सकता है. इसकी जानकारी OptimizeToursResponse.request_label में दी जाती है.

geodesicMetersPerSecond

number

अगर useGeodesicDistances की वैल्यू 'सही है' पर सेट है, तो इस फ़ील्ड को सेट करना ज़रूरी है. इससे यात्रा में लगने वाले समय का हिसाब लगाने के लिए इस्तेमाल की जाने वाली स्पीड तय होती है. इसकी वैल्यू कम से कम 1.0 मीटर/सेकंड होनी चाहिए.

maxValidationErrors

integer

पुष्टि करने से जुड़ी गड़बड़ियों की संख्या को छोटा करता है. ये गड़बड़ियां आम तौर पर, INVALID_ARGUMENT गड़बड़ी के पेलोड से जुड़ी होती हैं. इन्हें BadRequest गड़बड़ी की जानकारी (https://cloud.google.com/apis/design/errors#error_details) के तौर पर दिखाया जाता है. हालांकि, ऐसा तब नहीं होता, जब solvingMode=VALIDATE_ONLY हो: OptimizeToursResponse.validation_errors फ़ील्ड देखें. यह डिफ़ॉल्ट रूप से 100 पर सेट होता है और इसकी ज़्यादा से ज़्यादा सीमा 10,000 है.

जवाब का मुख्य भाग

कामयाब रहने पर, जवाब के मुख्य हिस्से में OptimizeToursResponse का एक इंस्टेंस शामिल किया जाता है.

अनुमति पाने के लिंक

नीचे दिए गए OAuth के लिंक की ज़रूरत हाेती है:

  • https://www.googleapis.com/auth/cloud-platform

IAM अनुमतियां

parent रिसॉर्स पर, IAM से जुड़ी यह अनुमति ज़रूरी है:

  • routeoptimization.locations.use

ज़्यादा जानकारी के लिए, IAM का दस्तावेज़ देखें.