Method: projects.optimizeTours

यह फ़ंक्शन, ShipmentModel वाला OptimizeToursRequest भेजता है और ShipmentRoute वाला OptimizeToursResponse दिखाता है. ShipmentRoute, वाहनों के लिए तय किए गए रास्तों का एक सेट होता है, ताकि कुल लागत को कम किया जा सके.

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

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

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

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*}: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 में शामिल किया गया हो.
  • अगर avoidUTurns को 'सही है' पर सेट किया जाता है, तो काम की विज़िट के लिए injectedSolutionLocationToken को सेट किया जाना चाहिए

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

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 फ़ील्ड पर लागू होती है. इसका इस्तेमाल तब किया जा सकता है, जब समाधान बनाने के बाद, अनुरोध में शामिल शिपिंग या वाहन का इंडेक्स बदल गया हो. इसकी एक वजह यह भी हो सकती है कि अनुरोध से शिपमेंट या वाहनों को हटा दिया गया है या अनुरोध में जोड़ दिया गया है.

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

अगर इंजेक्ट किए गए सलूशन में 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

अगर सही है, तो जवाब ShipmentRoute सेकंड में पॉलीलाइन पॉप्युलेट होगी.

populateTransitionPolylines

boolean

अगर सही है, तो जवाब ShipmentRoute.transitions में पॉलीलाइन भरा जाएगा.

allowLargeDeadlineDespiteInterruptionRisk

boolean

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

useGeodesicDistances

boolean

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

label

string

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

geodesicMetersPerSecond

number

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

maxValidationErrors

integer

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

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

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

अनुमति के दायरे

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

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

IAM की अनुमतियां

parent संसाधन पर, IAM की इस अनुमति की ज़रूरत है:

  • routeoptimization.locations.use

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