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

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

अगर इंजेक्ट किए गए समाधान में कोई 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

अगर यह सेट है, तो अनुरोध की समयसीमा 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 दस्तावेज़ देखें.