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 में शामिल किया गया हो.
  • अगर avoidUTurns को 'सही है' पर सेट किया जा रहा है, तो काम की विज़िट के लिए injectedSolutionLocationToken को सेट करना ज़रूरी है

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

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 दस्तावेज़ देखें.