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.label के बजाय SkippedShipment.index का इस्तेमाल करता है, ताकि अनुरोध किए गए शिपमेंट से, इंजेक्ट किए गए समाधान में स्किप किए गए शिपमेंट को मैच किया जा सके.

यह परिभाषा, 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 है.

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

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

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

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

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

IAM अनुमतियां

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

  • routeoptimization.operations.create

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