Method: projects.optimizeToursLongRunning

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

नतीजे के तौर पर मिले long-running operation (एलआरओ) का नाम <parent>/operations/<operation_id> फ़ॉर्मैट में होगा. इसका इस्तेमाल, कंप्यूटेशन की प्रोग्रेस को ट्रैक करने के लिए किया जा सकता है. metadata फ़ील्ड का टाइप OptimizeToursLongRunningMetadata है. अगर फ़ील्ड सही तरीके से अपडेट हो जाता है, तो response फ़ील्ड का टाइप OptimizeToursResponse हो जाता है.

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

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

यह यूआरएल, 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)

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

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

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

अगर यह वैल्यू true पर सेट है, तो यात्रा की दूरी का हिसाब लगाने के लिए, 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_ARGUMENT गड़बड़ी के पेलोड से जुड़ी होती हैं. हालांकि, ऐसा तब नहीं होता, जब solvingMode=VALIDATE_ONLY: OptimizeToursResponse.validation_errors फ़ील्ड देखें. यह डिफ़ॉल्ट रूप से 100 पर सेट होता है और इसकी सीमा 10,000 है.

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

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

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

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

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

IAM से जुड़ी अनुमतियां

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

  • routeoptimization.operations.create

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