Method: projects.optimizeTours

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

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

इसका लक्ष्य Vehicle के लिए ShipmentRoute का असाइनमेंट देना है, ताकि उस कुल लागत को कम किया जा सके जहां लागत में कई कॉम्पोनेंट के बारे में 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 में शामिल किया गया हो.

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

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

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

refreshDetailsRoutes[]

object (ShipmentRoute)

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

2020/11 से, यह सिर्फ़ उन रास्तों की पॉलीलाइन भरता है जो खाली नहीं हैं और यह ज़रूरी है कि 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 दस्तावेज़ देखें.