Package google.maps.routeoptimization.v1

इंडेक्स

RouteOptimization

वाहन के टूर को ऑप्टिमाइज़ करने की सेवा.

कुछ खास तरह के फ़ील्ड की वैधता:

  • google.protobuf.Timestamp
    • समय, यूनिक्स टाइम में होता है: 1970-01-01T00:00:00+00:00 के बाद से सेकंड.
    • सेकंड, [0, 253402300799] के बीच होने चाहिए. यानी, [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] के बीच.
    • nanos को अनसेट या 0 पर सेट करना ज़रूरी है.
  • google.protobuf.Duration
    • सेकंड, [0, 253402300799] के बीच होने चाहिए. यानी, [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] के बीच.
    • nanos को अनसेट या 0 पर सेट करना ज़रूरी है.
  • google.type.LatLng
    • अक्षांश [-90.0, 90.0] के बीच होना चाहिए.
    • देशांतर [-180.0, 180.0] के बीच होना चाहिए.
    • अक्षांश और देशांतर में से कम से कम एक की वैल्यू शून्य नहीं होनी चाहिए.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

एक या इससे ज़्यादा OptimizeToursRequest मैसेज के लिए, वाहन के टूर को बैच के तौर पर ऑप्टिमाइज़ करता है.

यह तरीका, ज़्यादा समय तक चलने वाली कार्रवाई (एलआरओ) है. ऑप्टिमाइज़ेशन के लिए इनपुट (OptimizeToursRequest मैसेज) और आउटपुट (OptimizeToursResponse मैसेज), उपयोगकर्ता के तय किए गए फ़ॉर्मैट में Cloud Storage से पढ़े और लिखे जाते हैं. OptimizeTours तरीके की तरह, हर OptimizeToursRequest में एक ShipmentModel होता है. साथ ही, यह ShipmentRoute फ़ील्ड वाला OptimizeToursResponse दिखाता है. ये फ़ील्ड, वाहनों के लिए तय किए गए रूट का सेट होते हैं. इससे कुल लागत कम हो जाती है.

उपयोगकर्ता, एलआरओ की स्थिति देखने के लिए operations.get को पोल कर सकता है:

अगर LRO done फ़ील्ड की वैल्यू false है, तो इसका मतलब है कि कम से कम एक अनुरोध अब भी प्रोसेस किया जा रहा है. ऐसा हो सकता है कि अन्य अनुरोध पूरे हो गए हों और उनके नतीजे Cloud Storage में उपलब्ध हों.

अगर एलआरओ का done फ़ील्ड 'सही' पर सेट है, तो इसका मतलब है कि सभी अनुरोध प्रोसेस हो गए हैं. प्रोसेस किए गए सभी अनुरोधों के नतीजे, Cloud Storage में उपलब्ध होंगे. पूरे नहीं हो पाए अनुरोधों के नतीजे, Cloud Storage में उपलब्ध नहीं होंगे. अगर एलआरओ का error फ़ील्ड सेट है, तो इसमें उन अनुरोधों में से किसी एक की गड़बड़ी शामिल होती है जो पूरे नहीं हो सके.

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

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

  • https://www.googleapis.com/auth/cloud-platform
IAM से जुड़ी अनुमतियां

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

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

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

इसका मकसद, Vehicles को ShipmentRoutes का ऐसा असाइनमेंट देना है जिससे कुल लागत कम हो. लागत में कई कॉम्पोनेंट होते हैं, जिन्हें ShipmentModel में बताया गया है.

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

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

  • https://www.googleapis.com/auth/cloud-platform
IAM से जुड़ी अनुमतियां

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

  • routeoptimization.locations.use

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

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

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

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

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

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

  • https://www.googleapis.com/auth/cloud-platform
IAM से जुड़ी अनुमतियां

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

  • routeoptimization.operations.create

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

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

यह OptimizeToursLongRunning तरीके का एक वैरिएंट है. इसे ज़्यादा टाइम आउट वैल्यू और बड़े इनपुट/आउटपुट साइज़ के साथ ऑप्टिमाइज़ेशन के लिए डिज़ाइन किया गया है.

क्लाइंट, Google Cloud Storage में सेव किए गए OptimizeToursRequest का यूआरआई बताता है. इसके बाद, सर्वर क्लाइंट के बताए गए Google Cloud Storage यूआरआई में OptimizeToursResponse को सेव करता है.

यह तरीका, OptimizeTours तरीके से बेहतर है. इसका इस्तेमाल उन ऑप्टिमाइज़ेशन के लिए किया जाना चाहिए जिनमें कुछ मिनट से ज़्यादा समय लगता है और इनपुट/आउटपुट का साइज़ 8 एमबी से ज़्यादा होता है. हालांकि, इसका इस्तेमाल छोटे ऑप्टिमाइज़ेशन के लिए भी किया जा सकता है.

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

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

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

  • https://www.googleapis.com/auth/cloud-platform
IAM से जुड़ी अनुमतियां

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

  • routeoptimization.operations.create

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

AggregatedMetrics

सभी Transition और/या Visit (ShipmentRoute के लिए) एलिमेंट के लिए, ShipmentRoute (OptimizeToursResponse के लिए) की एग्रीगेट की गई मेट्रिक.

फ़ील्ड
performed_shipment_count

int32

शिपमेंट की संख्या. ध्यान दें कि पिकअप और डिलीवरी के जोड़े को सिर्फ़ एक बार गिना जाता है.

travel_duration

Duration

किसी रास्ते या समाधान के लिए यात्रा में लगने वाला कुल समय.

wait_duration

Duration

किसी रास्ते या समाधान के लिए इंतज़ार करने की कुल अवधि.

delay_duration

Duration

किसी रूट या समाधान के लिए कुल देरी की अवधि.

break_duration

Duration

किसी रूट या समाधान के लिए ब्रेक की कुल अवधि.

visit_duration

Duration

किसी रास्ते या समाधान के लिए विज़िट की कुल अवधि.

total_duration

Duration

कुल अवधि, ऊपर दी गई सभी अवधियों के योग के बराबर होनी चाहिए. रास्तों के लिए, यह इन पर भी लागू होता है:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

किसी रास्ते या समाधान के लिए तय की गई कुल दूरी.

max_loads

map<string, VehicleLoad>

इस रूट (या समाधान) पर मौजूद हर मात्रा के लिए, पूरे रूट (या समाधान) पर हासिल किया गया ज़्यादा से ज़्यादा लोड. इसकी गिनती, सभी Transition.vehicle_loads (या ShipmentRoute.metrics.max_loads.

performed_mandatory_shipment_count

int32

ज़रूरी शिपमेंट की संख्या.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

performed_shipment_penalty_cost_sum

double

भेजे गए शिपमेंट के Shipment.penalty_cost का कुल योग.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

BatchOptimizeToursMetadata

इस टाइप में कोई फ़ील्ड नहीं है.

BatchOptimizeToursRequest कॉल के लिए ऑपरेशन मेटाडेटा.

BatchOptimizeToursRequest

एसिंक्रोनस ऑपरेशन के तौर पर, यात्राओं को बैच में ऑप्टिमाइज़ करने का अनुरोध करना. हर इनपुट फ़ाइल में एक OptimizeToursRequest होना चाहिए. साथ ही, हर आउटपुट फ़ाइल में एक OptimizeToursResponse होगा. अनुरोध में, फ़ाइलों को पढ़ने/लिखने और पार्स करने की जानकारी शामिल होती है. सभी इनपुट और आउटपुट फ़ाइलें एक ही प्रोजेक्ट में होनी चाहिए.

फ़ील्ड
parent

string

ज़रूरी है. कॉल करने के लिए, टारगेट प्रोजेक्ट और जगह.

फ़ॉर्मैट:

  • projects/{project-id}
  • projects/{project-id}/locations/-

क्षेत्र के हिसाब से {location-id} वैल्यू इस्तेमाल नहीं की जा सकतीं.

model_configs[]

AsyncModelConfig

ज़रूरी है. हर खरीदारी मॉडल के लिए इनपुट/आउटपुट की जानकारी, जैसे कि फ़ाइल पाथ और डेटा फ़ॉर्मैट.

AsyncModelConfig

एक ऑप्टिमाइज़ेशन मॉडल को एसिंक्रोनस तरीके से हल करने के लिए जानकारी.

फ़ील्ड
display_name

string

ज़रूरी नहीं. उपयोगकर्ता के तय किए गए मॉडल का नाम. उपयोगकर्ता, मॉडल को ट्रैक करने के लिए इसे उपनाम के तौर पर इस्तेमाल कर सकते हैं.

input_config

InputConfig

ज़रूरी है. इनपुट मॉडल के बारे में जानकारी.

output_config

OutputConfig

ज़रूरी है. आउटपुट के लिए चुनी गई जगह की जानकारी.

BatchOptimizeToursResponse

इस टाइप में कोई फ़ील्ड नहीं है.

BatchOptimizeToursRequest का जवाब. कार्रवाई पूरी होने के बाद, इसे Long Running Operation में दिखाया जाता है.

BreakRule

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

  • दो विज़िट के बीच यात्रा के दौरान (इसमें विज़िट से ठीक पहले या ठीक बाद का समय शामिल है, लेकिन विज़िट के बीच का समय शामिल नहीं है). इस मामले में, यह विज़िट के बीच के संबंधित ट्रांज़िट समय को बढ़ा देता है,
  • या वाहन के शुरू होने से पहले (हो सकता है कि वाहन ब्रेक के बीच में शुरू न हो), ऐसे में वाहन के शुरू होने के समय पर कोई असर नहीं पड़ता.
  • या वाहन के बंद होने के बाद (वाहन के बंद होने के समय के साथ).
फ़ील्ड
break_requests[]

BreakRequest

ब्रेक का क्रम. BreakRequest मैसेज देखें.

frequency_constraints[]

FrequencyConstraint

कई FrequencyConstraint लागू हो सकते हैं. इस BreakRule के BreakRequest को ये सभी शर्तें पूरी करनी होंगी. FrequencyConstraint देखें.

BreakRequest

हर वाहन पर लागू होने वाले ब्रेक का क्रम (यानी, उनकी संख्या और क्रम) पहले से पता होना चाहिए. बार-बार होने वाले BreakRequest, उस क्रम को तय करते हैं जिसमें उन्हें होना चाहिए. उनकी समयसीमाएं (earliest_start_time / latest_start_time) ओवरलैप हो सकती हैं, लेकिन वे ऑर्डर के साथ काम करती हों (इसकी जांच की जाती है).

फ़ील्ड
earliest_start_time

Timestamp

ज़रूरी है. ब्रेक शुरू होने का समय (शामिल है).

latest_start_time

Timestamp

ज़रूरी है. ब्रेक शुरू होने की ऊपरी सीमा (शामिल है).

min_duration

Duration

ज़रूरी है. ब्रेक की कम से कम अवधि. वैल्यू का पॉज़िटिव होना ज़रूरी है.

FrequencyConstraint

ऊपर बताए गए ब्रेक की फ़्रीक्वेंसी और अवधि को और सीमित किया जा सकता है. इसके लिए, ब्रेक की कम से कम फ़्रीक्वेंसी लागू की जा सकती है. जैसे, "हर 12 घंटे में कम से कम एक घंटे का ब्रेक होना चाहिए". मान लें कि इसे इस तरह समझा जा सकता है, "12 घंटे की किसी भी स्लाइडिंग टाइम विंडो में, कम से कम एक घंटे का एक ब्रेक होना चाहिए". इस उदाहरण को इस तरह FrequencyConstraint अनुवाद किया जाएगा:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

समाधान में ब्रेक का समय और अवधि, इन सभी पाबंदियों का पालन करेगी. साथ ही, BreakRequest में पहले से तय की गई समयसीमा और कम से कम अवधि का भी पालन करेगी.

FrequencyConstraint को लगातार न लिए जाने वाले ब्रेक पर लागू किया जा सकता है. उदाहरण के लिए, यहां दिया गया शेड्यूल, "हर 12 घंटे में एक घंटा" वाले उदाहरण के मुताबिक है:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
फ़ील्ड
min_break_duration

Duration

ज़रूरी है. इस शर्त के लिए, ब्रेक की कम से कम अवधि. नॉन-नेगेटिव. FrequencyConstraint की जानकारी देखें.

max_inter_break_duration

Duration

ज़रूरी है. रूट में किसी भी समयावधि के लिए ज़्यादा से ज़्यादा अनुमति वाला स्पैन, जिसमें कम से कम आंशिक रूप से duration >= min_break_duration का ब्रेक शामिल नहीं है. वैल्यू का पॉज़िटिव होना ज़रूरी है.

DataFormat

इनपुट और आउटपुट फ़ाइलों के लिए डेटा फ़ॉर्मैट.

Enums
DATA_FORMAT_UNSPECIFIED अमान्य वैल्यू. फ़ॉर्मैट, UNSPECIFIED नहीं होना चाहिए.
JSON JavaScript Object Notation.
PROTO_TEXT प्रोटोकॉल बफ़र का टेक्स्ट फ़ॉर्मैट. https://protobuf.dev/reference/protobuf/textformat-spec/ देखें

DistanceLimit

यह सीमा, तय की जा सकने वाली ज़्यादा से ज़्यादा दूरी तय करती है. यह हार्ड या सॉफ़्ट हो सकता है.

अगर सॉफ़्ट लिमिट तय की गई है, तो soft_max_meters और cost_per_kilometer_above_soft_max, दोनों को तय करना ज़रूरी है. साथ ही, इनकी वैल्यू शून्य या उससे ज़्यादा होनी चाहिए.

फ़ील्ड
max_meters

int64

एक तय सीमा, जो दूरी को ज़्यादा से ज़्यादा max_meters तक सीमित करती है. सीमा, शून्य या इससे ज़्यादा होनी चाहिए.

soft_max_meters

int64

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

अगर soft_max_meters की वैल्यू तय की गई है, तो यह max_meters की वैल्यू से कम होनी चाहिए. साथ ही, यह वैल्यू नेगेटिव नहीं होनी चाहिए.

cost_per_kilometer_below_soft_max

double

हर किलोमीटर के लिए तय की गई लागत, soft_max_meters तक बढ़ सकती है. इसके लिए, यह फ़ॉर्मूला इस्तेमाल किया जाता है:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

route_distance_limit में इस कीमत का इस्तेमाल नहीं किया जा सकता.

cost_per_kilometer_above_soft_max

double

अगर दूरी soft_max_meters से ज़्यादा है, तो हर किलोमीटर के हिसाब से लगने वाला शुल्क. अगर दूरी तय की गई सीमा से कम है, तो अतिरिक्त शुल्क 0 होगा. इसके अलावा, शुल्क का हिसाब लगाने के लिए इस फ़ॉर्मूला का इस्तेमाल किया जाता है:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

लागत, शून्य से कम नहीं होनी चाहिए.

GcsDestination

Google Cloud Storage की वह जगह जहां आउटपुट फ़ाइलें सेव की जाएंगी.

फ़ील्ड
uri

string

ज़रूरी है. Google Cloud Storage यूआरआई.

GcsSource

Google Cloud Storage की वह जगह जहां से इनपुट फ़ाइल को पढ़ा जाएगा.

फ़ील्ड
uri

string

ज़रूरी है. gs://bucket/path/to/object फ़ॉर्मैट में Google Cloud Storage ऑब्जेक्ट का यूआरआई.

InjectedSolutionConstraint

अनुरोध में समाधान शामिल किया गया है. इसमें यह जानकारी शामिल है कि किन विज़िट को सीमित किया जाना चाहिए और उन्हें कैसे सीमित किया जाना चाहिए.

फ़ील्ड
routes[]

ShipmentRoute

इंजेक्ट करने के लिए समाधान के रूट. ऐसा हो सकता है कि ओरिजनल रूट में से कुछ रूट हटा दिए जाएं. रास्तों और छोड़े गए शिपमेंट को, injected_first_solution_routes के लिए मान्य होने की बुनियादी शर्तों को पूरा करना होगा.

skipped_shipments[]

SkippedShipment

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

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

फ़ील्ड
relaxations[]

Relaxation

विज़िट की पाबंदी में दी गई सभी छूट, vehicle_indices में मौजूद वाहनों के साथ रास्तों पर की जाने वाली विज़िट पर लागू होंगी.

vehicle_indices[]

int32

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

अगर interpret_injected_solutions_using_labels सही है, तो वाहन इंडेक्स को ShipmentRoute.vehicle_index की तरह ही मैप किया जाता है. fields टिप्पणी देखें.

सुकून देने वाले

अगर relaxations खाली है, तो routes को विज़िट की गई सभी जगहों के शुरू होने का समय और क्रम पूरी तरह से तय होता है. साथ ही, उन रास्तों पर कोई नई विज़िट नहीं जोड़ी जा सकती. इसके अलावा, routes में वाहन के शुरू और खत्म होने का समय पूरी तरह से तय होता है.हालांकि, ऐसा तब नहीं होता, जब वाहन खाली हो. इसका मतलब है कि वाहन ने कोई विज़िट नहीं की है और मॉडल में used_if_route_is_empty को 'गलत' पर सेट किया गया है.

relaxations(i).level, विज़िट #j पर लागू की गई पाबंदी में छूट के लेवल के बारे में बताता है. यह विज़िट, इन शर्तों को पूरा करती है:

  • route.visits(j).start_time >= relaxations(i).threshold_time और
  • j + 1 >= relaxations(i).threshold_visit_count

इसी तरह, वाहन के शुरू होने के समय को relaxations(i).level तक बढ़ाया जा सकता है, अगर:

  • vehicle_start_time >= relaxations(i).threshold_time और
  • relaxations(i).threshold_visit_count == 0 और वाहन के आखिरी हिस्से को relaxations(i).level तक बढ़ाया जा सकता है, अगर:
  • vehicle_end_time >= relaxations(i).threshold_time और
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

अगर कोई विज़िट threshold_visit_count या threshold_time की शर्त पूरी करती है, तो छूट का लेवल लागू करने के लिए, एक ही level वाले दो relaxations जोड़ें: एक में सिर्फ़ threshold_visit_count सेट हो और दूसरे में सिर्फ़ threshold_time सेट हो. अगर कोई विज़िट, एक से ज़्यादा relaxations की शर्तों को पूरा करती है, तो सबसे कम पाबंदी वाला लेवल लागू होता है. इस वजह से, वाहन के शुरू होने से लेकर रास्ते में पड़ने वाली जगहों पर जाने और वाहन के रुकने तक, छूट का लेवल ज़्यादा आरामदायक हो जाता है. इसका मतलब है कि रास्ता आगे बढ़ने के साथ-साथ, छूट का लेवल कम नहीं होता.

रास्ते में पड़ने वाली जगहों पर जाने का समय और क्रम, जो किसी भी relaxations की थ्रेशोल्ड शर्तों को पूरा नहीं करता है, पूरी तरह से सीमित है. साथ ही, इन क्रमों में कोई भी विज़िट शामिल नहीं की जा सकती. इसके अलावा, अगर किसी वाहन के शुरू या खत्म होने का समय, छूट की किसी भी शर्त को पूरा नहीं करता है, तो समय तय होता है. हालांकि, ऐसा तब नहीं होता, जब वाहन खाली हो.

फ़ील्ड
level

Level

कंस्ट्रेंट रिलैक्सेशन लेवल, threshold_time या इसके बाद की शर्तों और कम से कम threshold_visit_count शर्तों के पूरा होने पर लागू होता है.

threshold_time

Timestamp

वह समय जिसके बाद, छूट level लागू की जा सकती है.

threshold_visit_count

int32

विज़िट की वह संख्या जिसके बाद, छूट level लागू की जा सकती है. अगर threshold_visit_count की वैल्यू 0 है या सेट नहीं है, तो हो सकता है कि वाहन के चालू होने पर level सीधे तौर पर लागू हो जाए.

अगर यह route.visits_size() + 1 है, तो हो सकता है कि level सिर्फ़ वाहन के पिछले हिस्से पर लागू हो. अगर यह route.visits_size() + 1 से ज़्यादा है, तो उस रूट के लिए level लागू नहीं होता.

लेवल

इससे पाबंदी में छूट के अलग-अलग लेवल के बारे में पता चलता है. ये लेवल, किसी विज़िट और उसके बाद की विज़िट पर तब लागू होते हैं, जब थ्रेशोल्ड की शर्तें पूरी होती हैं.

नीचे दी गई सूची में, आराम की स्थिति को बढ़ते क्रम में दिखाया गया है.

Enums
LEVEL_UNSPECIFIED

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

इस वैल्यू का इस्तेमाल, level में साफ़ तौर पर नहीं किया जाना चाहिए.

RELAX_VISIT_TIMES_AFTER_THRESHOLD विज़िट शुरू होने के समय और वाहन के शुरू/खत्म होने के समय में छूट दी जाएगी. हालांकि, हर विज़िट एक ही वाहन से जुड़ी रहेगी और विज़िट के क्रम का पालन करना होगा: उनके बीच या उनसे पहले कोई विज़िट नहीं डाली जा सकती.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD यह RELAX_VISIT_TIMES_AFTER_THRESHOLD की तरह ही है, लेकिन इसमें विज़िट के क्रम में भी छूट दी गई है: विज़िट सिर्फ़ इस वाहन से की जा सकती हैं, लेकिन ऐसा हो सकता है कि विज़िट न की जा सकें.
RELAX_ALL_AFTER_THRESHOLD यह RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD की तरह ही है, लेकिन इसमें वाहन को छूट भी मिलती है: थ्रेशोल्ड समय पर या उसके बाद विज़िट पूरी तरह से मुफ़्त होती हैं. साथ ही, ऐसा हो सकता है कि विज़िट पूरी न हों.

InputConfig

[BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] के लिए इनपुट तय करें.

फ़ील्ड
data_format

DataFormat

ज़रूरी है. इनपुट डेटा का फ़ॉर्मैट.

यूनियन फ़ील्ड source. ज़रूरी है. source इनमें से सिर्फ़ एक हो सकता है:
gcs_source

GcsSource

Google Cloud Storage की कोई जगह. यह एक ऑब्जेक्ट (फ़ाइल) होना चाहिए.

जगह

यह किसी जगह की जानकारी को एन्कैप्सुलेट करता है. इसमें भौगोलिक पॉइंट और हेडिंग शामिल होती है. हालांकि, हेडिंग देना ज़रूरी नहीं है.

फ़ील्ड
lat_lng

LatLng

वेपॉइंट के भौगोलिक निर्देशांक.

heading

int32

ट्रैफ़िक के फ़्लो की दिशा से जुड़ी कंपास हेडिंग. इस वैल्यू का इस्तेमाल, पिकअप और ड्रॉप-ऑफ़ के लिए सड़क के किनारे की जानकारी देने के लिए किया जाता है. हेडिंग की वैल्यू 0 से 360 तक हो सकती हैं. इसमें 0 का मतलब उत्तर दिशा, 90 का मतलब पूर्व दिशा वगैरह होता है.

OptimizeToursLongRunningMetadata

इस टाइप में कोई फ़ील्ड नहीं है.

OptimizeToursLongRunning कॉल के लिए ऑपरेशन मेटाडेटा.

OptimizeToursRequest

टूर ऑप्टिमाइज़ेशन सॉल्वर को दिया जाने वाला अनुरोध. इसमें शिपमेंट मॉडल के साथ-साथ ऑप्टिमाइज़ेशन पैरामीटर भी शामिल होते हैं.

फ़ील्ड
parent

string

ज़रूरी है. कॉल करने के लिए, टारगेट प्रोजेक्ट या जगह.

फ़ॉर्मैट:

  • projects/{project-id}
  • projects/{project-id}/locations/-

क्षेत्र के हिसाब से {location-id} वैल्यू इस्तेमाल नहीं की जा सकतीं.

timeout

Duration

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

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

model

ShipmentModel

शिपमेंट मॉडल को हल करना.

solving_mode

SolvingMode

डिफ़ॉल्ट रूप से, सॉल्विंग मोड DEFAULT_SOLVE (0) पर सेट होता है.

search_mode

SearchMode

अनुरोध को पूरा करने के लिए इस्तेमाल किया गया सर्च मोड.

injected_first_solution_routes[]

ShipmentRoute

ऑप्टिमाइज़ेशन एल्गोरिदम को पहला समाधान ढूंढने में मदद करना, जो पिछले समाधान से मिलता-जुलता हो.

पहला समाधान बनने पर, मॉडल पर पाबंदी लगा दी जाती है. किसी रूट पर शिपमेंट न होने पर, पहले समाधान में उन्हें अपने-आप छोड़ दिया जाता है. हालांकि, बाद के समाधानों में उन्हें शामिल किया जा सकता है.

समाधान को मान्य होने की कुछ बुनियादी शर्तों को पूरा करना होगा:

  • सभी रूट के लिए, vehicle_index रेंज में होना चाहिए और डुप्लीकेट नहीं होना चाहिए.
  • सभी विज़िट के लिए, shipment_index और visit_request_index रेंज में होने चाहिए.
  • किसी शिपमेंट को सिर्फ़ एक रूट पर रेफ़रंस किया जा सकता है.
  • पिकअप-डिलीवरी शिपमेंट का पिकअप, डिलीवरी से पहले किया जाना चाहिए.
  • शिपमेंट के लिए, पिकअप या डिलीवरी का एक से ज़्यादा विकल्प नहीं चुना जा सकता.
  • सभी रास्तों के लिए, यात्रा में लगने वाला समय बढ़ रहा है (यानी, vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • शिपमेंट सिर्फ़ ऐसे वाहन से किया जा सकता है जिसकी अनुमति है. किसी वाहन को तब अनुमति दी जाती है, जब Shipment.allowed_vehicle_indices खाली हो या उसका vehicle_index, Shipment.allowed_vehicle_indices में शामिल हो.

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

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

नवंबर 2020 से, यह सिर्फ़ उन रास्तों की पॉलीलाइन को पॉप्युलेट करता है जो खाली नहीं हैं. इसके लिए, ज़रूरी है कि populate_polylines की वैल्यू 'सही है' पर सेट हो.

पास किए गए रास्तों के route_polyline फ़ील्ड, रास्ते transitions के साथ मेल नहीं खाते.

इस फ़ील्ड का इस्तेमाल, injected_first_solution_routes या injected_solution_constraint के साथ नहीं किया जाना चाहिए.

Shipment.ignore और Vehicle.ignore का इस पर कोई असर नहीं पड़ता. पॉलीलाइन अब भी उन सभी रास्तों पर मौजूद सभी विज़िट के बीच भरी जाती हैं जो खाली नहीं हैं. भले ही, उनसे जुड़े शिपमेंट या वाहनों को अनदेखा किया गया हो.

interpret_injected_solutions_using_labels

bool

अगर सही है, तो:

  • इंजेक्ट किए गए समाधान में मौजूद रास्तों को अनुरोध में मौजूद वाहनों से मैच करने के लिए, vehicle_index के बजाय ShipmentRoute.vehicle_label का इस्तेमाल करता है. अगर ConstraintRelaxation.vehicle_indices खाली नहीं है, तो उसे अपडेट करने के लिए, ओरिजनल ShipmentRoute.vehicle_index से नए ShipmentRoute.vehicle_index की मैपिंग का फिर से इस्तेमाल करता है. हालांकि, मैपिंग साफ़ तौर पर होनी चाहिए. इसका मतलब है कि कई ShipmentRoute को एक ही ओरिजनल vehicle_index शेयर नहीं करना चाहिए.
  • इंजेक्ट किए गए समाधान में विज़िट को अनुरोध में मौजूद शिपमेंट से मैच करने के लिए, shipment_index के बजाय ShipmentRoute.Visit.shipment_label का इस्तेमाल करता है;
  • इंजेक्ट किए गए समाधान में, शिपमेंट के अनुरोधों के साथ शिपमेंट को मैच करने के लिए, SkippedShipment.index के बजाय SkippedShipment.label का इस्तेमाल करता है.

यह परिभाषा injected_first_solution_routes, injected_solution_constraint, और refresh_details_routes फ़ील्ड पर लागू होती है. इसका इस्तेमाल तब किया जा सकता है, जब समाधान बनाने के बाद, अनुरोध में शिपमेंट या वाहन के इंडेक्स बदल गए हों. ऐसा शायद इसलिए हुआ हो, क्योंकि अनुरोध से शिपमेंट या वाहन हटा दिए गए हों या उनमें जोड़ दिए गए हों.

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

अगर इंजेक्ट किए गए समाधान में मौजूद कोई vehicle_label, अनुरोध किए गए वाहन से मेल नहीं खाता है, तो उससे जुड़े रूट को समाधान से हटा दिया जाता है. साथ ही, उस रूट पर मौजूद विज़िट भी हटा दी जाती हैं. अगर इंजेक्ट किए गए समाधान में मौजूद कोई shipment_label, अनुरोध किए गए शिपमेंट से मेल नहीं खाता है, तो उससे जुड़ी विज़िट को समाधान से हटा दिया जाता है. अगर इंजेक्ट किए गए समाधान में मौजूद कोई SkippedShipment.label, शिपमेंट के अनुरोध से मेल नहीं खाता है, तो समाधान से SkippedShipment को हटा दिया जाता है.

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

ध्यान दें: कॉल करने वाले व्यक्ति को यह पक्का करना होगा कि हर Vehicle.label (resp. Shipment.label) किसी वाहन (या शिपमेंट) की इकाई की खास तौर पर पहचान करता है. इसका इस्तेमाल, दो काम के अनुरोधों में किया जाता है: पहला, पिछला अनुरोध जिससे इंजेक्ट किए गए समाधान में इस्तेमाल किया गया OptimizeToursResponse जनरेट हुआ और दूसरा, मौजूदा अनुरोध जिसमें इंजेक्ट किया गया समाधान शामिल है. ऊपर बताई गई यूनीकनेस की जांच, इस ज़रूरी शर्त को पूरा करने की गारंटी नहीं देती.

consider_road_traffic

bool

ShipmentRoute फ़ील्ड Transition.travel_duration, Visit.start_time, और vehicle_end_time का हिसाब लगाने, ShipmentRoute.has_traffic_infeasibilities फ़ील्ड को सेट करने, और OptimizeToursResponse.total_cost फ़ील्ड का हिसाब लगाने के लिए, ट्रैफ़िक के अनुमान को ध्यान में रखें.

populate_polylines

bool

अगर यह वैल्यू 'सही है' पर सेट है, तो जवाब ShipmentRoute में पॉलीलाइन की जानकारी भरी जाएगी.

populate_transition_polylines

bool

अगर यह वैल्यू 'सही है' पर सेट है, तो रिस्पॉन्स ShipmentRoute.transitions में पॉलीलाइन और रूट टोकन की जानकारी अपने-आप भर जाएगी.

allow_large_deadline_despite_interruption_risk

bool

अगर यह सेट है, तो अनुरोध के लिए ज़्यादा से ज़्यादा 60 मिनट की समयसीमा (https://grpc.io/blog/deadlines देखें) हो सकती है. ऐसा न करने पर, आपको सिर्फ़ 30 मिनट मिलेंगे. ध्यान दें कि लंबे समय तक चलने वाले अनुरोधों में रुकावट आने का जोखिम काफ़ी ज़्यादा होता है. हालांकि, यह जोखिम अब भी कम है.

use_geodesic_distances

bool

अगर यह वैल्यू true पर सेट है, तो यात्रा की दूरी का हिसाब लगाने के लिए, Google Maps की दूरी के बजाय जियोडेसिक दूरी का इस्तेमाल किया जाएगा. साथ ही, यात्रा में लगने वाले समय का हिसाब लगाने के लिए, जियोडेसिक दूरी का इस्तेमाल किया जाएगा. इसके लिए, geodesic_meters_per_second से तय की गई स्पीड का इस्तेमाल किया जाएगा.

label

string

इस अनुरोध की पहचान करने के लिए, लेबल का इस्तेमाल किया जा सकता है. इसकी जानकारी OptimizeToursResponse.request_label में दी जाती है.

geodesic_meters_per_second

double

अगर use_geodesic_distances की वैल्यू 'सही है' पर सेट है, तो इस फ़ील्ड को सेट करना ज़रूरी है. इससे, यात्रा में लगने वाले समय का हिसाब लगाने के लिए इस्तेमाल की जाने वाली स्पीड तय होती है. इसकी वैल्यू कम से कम 1.0 मीटर/सेकंड होनी चाहिए.

max_validation_errors

int32

यह पुष्टि करने से जुड़ी गड़बड़ियों की संख्या को कम करता है. आम तौर पर, ये गड़बड़ियां INVALID_ARGUMENT गड़बड़ी के पेलोड से जुड़ी होती हैं. इन्हें BadRequest गड़बड़ी की जानकारी (https://cloud.google.com/apis/design/errors#error_details) के तौर पर दिखाया जाता है. हालांकि, ऐसा तब नहीं होता, जब solving_mode=VALIDATE_ONLY हो: OptimizeToursResponse.validation_errors फ़ील्ड देखें. यह डिफ़ॉल्ट रूप से 100 पर सेट होता है और इसकी सीमा 10,000 है.

SearchMode

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

Enums
SEARCH_MODE_UNSPECIFIED खोज मोड की जानकारी नहीं दी गई है. यह RETURN_FAST के बराबर है.
RETURN_FAST पहला अच्छा समाधान मिलने के बाद, खोज बंद कर दें.
CONSUME_ALL_AVAILABLE_TIME बेहतर समाधान खोजने के लिए, उपलब्ध समय का पूरा इस्तेमाल करें.

SolvingMode

इससे तय होता है कि सॉल्वर को अनुरोध को कैसे मैनेज करना चाहिए. VALIDATE_ONLY के अलावा, अन्य सभी मोड में अनुरोध अमान्य होने पर, आपको INVALID_REQUEST गड़बड़ी का मैसेज मिलेगा. गड़बड़ियों की संख्या को सीमित करने के लिए, max_validation_errors देखें.

Enums
DEFAULT_SOLVE मॉडल को हल करें. [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors] में चेतावनियां जारी की जा सकती हैं.
VALIDATE_ONLY यह मॉडल को हल किए बिना सिर्फ़ उसकी पुष्टि करता है: ज़्यादा से ज़्यादा OptimizeToursResponse.validation_errors को पॉप्युलेट करता है.
DETECT_SOME_INFEASIBLE_SHIPMENTS

सिर्फ़ OptimizeToursResponse.validation_errors या OptimizeToursResponse.skipped_shipments को पॉप्युलेट करता है. साथ ही, अनुरोध के बाकी हिस्से को हल नहीं करता. जवाब में status और routes को सेट नहीं किया गया है. अगर injected_solution_constraint रूट में कोई समस्या मिलती है, तो उसे OptimizeToursResponse.validation_errors फ़ील्ड में भर दिया जाता है और OptimizeToursResponse.skipped_shipments को खाली छोड़ दिया जाता है.

अहम जानकारी: यहां शिप नहीं किए जा सकने वाले सभी शिपमेंट नहीं दिखाए जाते हैं. सिर्फ़ वे शिपमेंट दिखाए जाते हैं जिनका पता प्रीप्रोसेसिंग के दौरान चलता है.

TRANSFORM_AND_RETURN_REQUEST

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

एक्सपेरिमेंटल: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request पर जाएं.

OptimizeToursResponse

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

फ़ील्ड
routes[]

ShipmentRoute

हर वाहन के लिए तय किए गए रास्ते; i-th रास्ता, मॉडल में मौजूद i-th वाहन से जुड़ा होता है.

request_label

string

अगर अनुरोध में कोई लेबल बताया गया है, तो OptimizeToursRequest.label की कॉपी.

skipped_shipments[]

SkippedShipment

शिपमेंट की सूची को स्किप कर दिया गया है.

validation_errors[]

OptimizeToursValidationError

पुष्टि करने से जुड़ी उन सभी गड़बड़ियों की सूची जिनका पता हमने खुद लगाया है. OptimizeToursValidationError मैसेज के लिए, "एक से ज़्यादा गड़बड़ियां" वाली जानकारी देखें. अगर solving_mode, DEFAULT_SOLVE है, तो गड़बड़ियों के बजाय चेतावनियां शामिल की जाएंगी.

processed_request

OptimizeToursRequest

कुछ मामलों में, हम अनुरोध को हल करने से पहले उसमें बदलाव करते हैं. जैसे, लागत जोड़ना. अगर solving_mode == TRANSFORM_AND_RETURN_REQUEST है, तो बदला गया अनुरोध यहां दिखाया जाता है.

एक्सपेरिमेंटल: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request पर जाएं.

metrics

Metrics

इस समाधान के लिए अवधि, दूरी, और इस्तेमाल की मेट्रिक.

मेट्रिक

सभी रास्तों के लिए एग्रीगेट की गई कुल मेट्रिक.

फ़ील्ड
aggregated_route_metrics

AggregatedMetrics

रास्तों के हिसाब से एग्रीगेट किया गया. हर मेट्रिक, एक ही नाम वाले सभी ShipmentRoute.metrics फ़ील्ड का योग (या लोड के लिए, ज़्यादा से ज़्यादा) होती है.

skipped_mandatory_shipment_count

int32

ज़रूरी शिपमेंट की संख्या को स्किप किया गया.

used_vehicle_count

int32

इस्तेमाल किए गए वाहनों की संख्या. ध्यान दें: अगर किसी वाहन का रूट खाली है और Vehicle.used_if_route_is_empty की वैल्यू 'सही है' पर सेट है, तो वाहन को इस्तेमाल किया गया माना जाता है.

earliest_vehicle_start_time

Timestamp

इस्तेमाल की गई गाड़ी के लिए, सबसे पहले शुरू होने का समय. इसकी गिनती, इस्तेमाल की गई सभी गाड़ियों के लिए कम से कम ShipmentRoute.vehicle_start_time के तौर पर की जाती है.

latest_vehicle_end_time

Timestamp

इस्तेमाल की गई गाड़ी के लिए, विज्ञापन दिखाने की आखिरी तारीख. इसकी गिनती, ShipmentRoute.vehicle_end_time की इस्तेमाल की गई सभी गाड़ियों के लिए तय की गई आखिरी तारीख के हिसाब से की जाती है.

costs

map<string, double>

समाधान की लागत, जिसे लागत से जुड़े अनुरोध फ़ील्ड के हिसाब से बांटा गया है. कुंजियां, OptimizeToursRequest इनपुट के हिसाब से प्रोटो पाथ होती हैं. उदाहरण के लिए, "model.shipments.pickups.cost". वैल्यू, लागत वाले फ़ील्ड से जनरेट हुई कुल लागत होती है. इसे पूरे समाधान के लिए एग्रीगेट किया जाता है. दूसरे शब्दों में, costs["model.shipments.pickups.cost"], समाधान में मौजूद सभी पिकअप की लागतों का योग है. मॉडल में तय की गई सभी लागतों की जानकारी यहां दी गई है. हालांकि, TransitionAttributes से जुड़ी लागतों की जानकारी सिर्फ़ एग्रीगेट किए गए तरीके से दी गई है. यह जानकारी जनवरी 2022 से दी जा रही है.

total_cost

double

समाधान की कुल लागत. लागत मैप में मौजूद सभी वैल्यू का योग.

OptimizeToursUriMetadata

इस टाइप में कोई फ़ील्ड नहीं है.

OptimizeToursUri कॉल के लिए ऑपरेशन मेटाडेटा.

OptimizeToursUriRequest

OptimizeToursUri तरीके से इस्तेमाल किया जाने वाला अनुरोध.

फ़ील्ड
parent

string

ज़रूरी है. कॉल करने के लिए, टारगेट प्रोजेक्ट या जगह.

फ़ॉर्मैट:

  • projects/{project-id}
  • projects/{project-id}/locations/-

क्षेत्र के हिसाब से {location-id} वैल्यू इस्तेमाल नहीं की जा सकतीं.

input

Uri

ज़रूरी है. Cloud Storage ऑब्जेक्ट का यूआरआई, जिसमें OptimizeToursRequest शामिल है.

output

Uri

ज़रूरी है. Cloud Storage ऑब्जेक्ट का यूआरआई, जिसमें OptimizeToursResponse शामिल होगा.

OptimizeToursUriResponse

OptimizeToursUri तरीके से मिला जवाब.

फ़ील्ड
output

Uri

ज़रूरी नहीं. Cloud Storage ऑब्जेक्ट का यूआरआई, जिसमें JSON या textproto के तौर पर एन्कोड किया गया OptimizeToursResponse शामिल है. अगर ऑब्जेक्ट को JSON के तौर पर कोड में बदला गया है, तो ऑब्जेक्ट के नाम का एक्सटेंशन .json होगा. अगर ऑब्जेक्ट को textproto के तौर पर एन्कोड किया गया था, तो ऑब्जेक्ट के नाम का एक्सटेंशन .txtpb होगा.

संसाधन के crc32_checksum का इस्तेमाल करके, यह पुष्टि की जा सकती है कि संसाधन के कॉन्टेंट में बदलाव नहीं किया गया है.

OptimizeToursValidationError

OptimizeToursRequest की पुष्टि करते समय मिली गड़बड़ी या चेतावनी के बारे में बताता है.

फ़ील्ड
code

int32

पुष्टि करने से जुड़ी गड़बड़ी को (code, display_name) के पेयर से तय किया जाता है. ये दोनों हमेशा मौजूद होते हैं.

इस सेक्शन के बाद दिए गए फ़ील्ड में, गड़बड़ी के बारे में ज़्यादा जानकारी दी गई है.

एक से ज़्यादा गड़बड़ियां: एक से ज़्यादा गड़बड़ियां होने पर, पुष्टि करने की प्रोसेस में उनमें से कई गड़बड़ियों को दिखाने की कोशिश की जाती है. कंपाइलर की तरह ही, यह प्रोसेस भी पूरी तरह से सटीक नहीं होती. पुष्टि करने से जुड़ी कुछ गड़बड़ियां "गंभीर" होंगी. इसका मतलब है कि वे पुष्टि करने की पूरी प्रोसेस को रोक देती हैं. display_name="UNSPECIFIED" गड़बड़ियों के अलावा, अन्य गड़बड़ियों के लिए भी ऐसा होता है. कुछ गड़बड़ियों की वजह से, पुष्टि करने की प्रोसेस के दौरान अन्य गड़बड़ियों को अनदेखा किया जा सकता है.

स्थिरता: code और display_name बहुत स्थिर होने चाहिए. हालांकि, समय के साथ नए कोड और डिसप्ले नेम दिख सकते हैं. इस वजह से, किसी अमान्य अनुरोध के लिए, (code, display_name) का एक अलग जोड़ा दिख सकता है. ऐसा इसलिए होता है, क्योंकि नई गड़बड़ी की वजह से पुरानी गड़बड़ी छिप जाती है. उदाहरण के लिए, "एक से ज़्यादा गड़बड़ियां" देखें.

display_name

string

गड़बड़ी का डिसप्ले नेम.

fields[]

FieldReference

गड़बड़ी के कॉन्टेक्स्ट में 0, 1 (ज़्यादातर मामलों में) या इससे ज़्यादा फ़ील्ड हो सकते हैं. उदाहरण के लिए, वाहन #4 और शिपमेंट #2 के पहले पिकअप को इस तरह से रेफ़र किया जा सकता है:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

हालांकि, ध्यान दें कि किसी गड़बड़ी के कोड के लिए, fields की एलिमेंट की संख्या नहीं बदलनी चाहिए.

error_message

string

गड़बड़ी के बारे में बताने वाली स्ट्रिंग, जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. code और error_message के बीच 1:1 मैपिंग होती है (जब कोड != "UNSPECIFIED").

स्थिरता: स्थिर नहीं है: किसी code से जुड़ी गड़बड़ी का मैसेज, समय के साथ बदल सकता है. उम्मीद है कि इससे गड़बड़ी को समझने में आसानी होगी. कृपया इसके बजाय, display_name और code का इस्तेमाल करें.

offending_values

string

इसमें फ़ील्ड की वैल्यू शामिल हो सकती हैं. यह सुविधा हमेशा उपलब्ध नहीं होती. आपको इस पर बिलकुल भी भरोसा नहीं करना चाहिए. इसका इस्तेमाल सिर्फ़ मैन्युअल तरीके से मॉडल को डीबग करने के लिए करना चाहिए.

FieldReference

इससे पुष्टि से जुड़ी गड़बड़ी के बारे में जानकारी मिलती है. FieldReference हमेशा इस फ़ाइल में दिए गए फ़ील्ड को रेफ़र करता है और उसी क्रम के स्ट्रक्चर का पालन करता है. उदाहरण के लिए, हम वाहन #5 के start_time_windows के एलिमेंट #2 की जानकारी इस तरह दे सकते हैं:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

हालांकि, हम OptimizeToursRequest या ShipmentModel जैसी टॉप-लेवल इकाइयों को शामिल नहीं करते, ताकि मैसेज में ज़्यादा जानकारी न दिखे.

फ़ील्ड
name

string

फ़ील्ड का नाम, जैसे कि "vehicles".

sub_field

FieldReference

अगर ज़रूरी हो, तो बार-बार नेस्ट किया गया सब-फ़ील्ड.

यूनियन फ़ील्ड index_or_key.

index_or_key इनमें से सिर्फ़ एक हो सकता है:

index

int32

अगर फ़ील्ड दोहराया गया है, तो उसका इंडेक्स.

key

string

अगर फ़ील्ड एक मैप है, तो कुंजी.

OutputConfig

[BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] के नतीजों के लिए डेस्टिनेशन तय करें.

फ़ील्ड
data_format

DataFormat

ज़रूरी है. आउटपुट डेटा का फ़ॉर्मैट.

यूनियन फ़ील्ड destination. ज़रूरी है. destination इनमें से सिर्फ़ एक हो सकता है:
gcs_destination

GcsDestination

Google Cloud Storage की वह जगह जहां आउटपुट को सेव करना है.

RouteModifiers

वाहन के रूट का हिसाब लगाते समय, ज़रूरी शर्तों के सेट को शामिल करता है. यह Google Maps Platform Routes Preferred API में RouteModifiers जैसा ही है; देखें: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

फ़ील्ड
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

ज़रूरी नहीं. इससे यह तय होता है कि जहां तक हो सके, इंडोर नेविगेशन से बचना है या नहीं. उन रास्तों को प्राथमिकता दी जाएगी जिनमें इंडोर नेविगेशन की सुविधा नहीं है. यह सिर्फ़ WALKING के यात्रा मोड पर लागू होता है.

शिपमेंट

किसी एक आइटम को पिकअप करने से लेकर उसकी डिलीवरी तक का शिपमेंट. शिपमेंट को पूरा हुआ मानने के लिए, एक यूनीक वाहन को पिकअप की किसी एक जगह पर जाना होगा. साथ ही, उसके हिसाब से अपनी खाली क्षमता को कम करना होगा. इसके बाद, उसे डिलीवरी की किसी एक जगह पर जाना होगा और उसके हिसाब से अपनी खाली क्षमता को फिर से बढ़ाना होगा.

फ़ील्ड
display_name

string

शिपमेंट का डिसप्ले नेम, जिसे उपयोगकर्ता ने तय किया है. यह ज़्यादा से ज़्यादा 63 वर्णों का हो सकता है. इसमें UTF-8 वर्णों का इस्तेमाल किया जा सकता है.

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

शिपमेंट से जुड़े डिलीवरी के विकल्पों का सेट. अगर यह जानकारी नहीं दी जाती है, तो वाहन को सिर्फ़ पिकअप की जगह पर जाना होगा.

load_demands

map<string, Load>

शिपमेंट के लोड की ज़रूरतें. जैसे, वज़न, वॉल्यूम, पैलेट की संख्या वगैरह. मैप में मौजूद कुंजियां, आइडेंटिफ़ायर होनी चाहिए. इनसे संबंधित लोड के टाइप के बारे में जानकारी मिलनी चाहिए. इनमें इकाइयां भी शामिल होनी चाहिए. उदाहरण के लिए: "weight_kg", "volume_gallons", "pallet_count" वगैरह. अगर कोई कुंजी मैप में नहीं दिखती है, तो उससे जुड़े लोड को शून्य माना जाता है.

allowed_vehicle_indices[]

int32

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

costs_per_vehicle[]

double

इससे पता चलता है कि हर वाहन से इस शिपमेंट को डिलीवर करने में कितनी लागत आती है. अगर यह प्रॉपर्टी दी गई है, तो इसमें इनमें से कोई एक वैल्यू होनी चाहिए:

  • costs_per_vehicle_indices के बराबर एलिमेंट होने चाहिए. costs_per_vehicle[i], मॉडल के वाहन costs_per_vehicle_indices[i] से मेल खाता है.
  • एलिमेंट की संख्या, मॉडल में मौजूद वाहनों की संख्या के बराबर होनी चाहिए. i-th एलिमेंट, मॉडल के वाहन #i से जुड़ा होता है.

ये लागतें penalty_cost की तरह ही एक ही यूनिट में होनी चाहिए और नेगेटिव नहीं होनी चाहिए. अगर इस तरह की कोई लागत नहीं है, तो इस फ़ील्ड को खाली छोड़ दें.

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

उदाहरण के लिए, मान लें कि t, पिकअप के लिए चुने गए विकल्प से डिलीवरी के लिए चुने गए विकल्प तक सीधे जाने में लगने वाला सबसे कम समय है. इसके बाद, pickup_to_delivery_absolute_detour_limit सेटिंग लागू होती है:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

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

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

इस शिपमेंट के "टाइप" के बारे में बताने वाली स्ट्रिंग, जो खाली न हो. इस सुविधा का इस्तेमाल, shipment_types के बीच की ज़रूरी शर्तों या ऐसी चीज़ों के बारे में बताने के लिए किया जा सकता है जो एक साथ काम नहीं करतीं. इसके बारे में ज़्यादा जानने के लिए, ShipmentModel में shipment_type_incompatibilities और shipment_type_requirements देखें.

यह visit_types से अलग है, जिसे एक ही विज़िट के लिए तय किया जाता है: एक ही शिपमेंट से जुड़े सभी पिकअप/डिलीवरी के लिए, एक ही shipment_type शेयर किया जाता है.

label

string

इससे इस शिपमेंट के लिए लेबल तय होता है. इस लेबल की जानकारी, रिस्पॉन्स में मिलती है. यह जानकारी, संबंधित ShipmentRoute.Visit के shipment_label में मौजूद होती है.

ignore

bool

अगर यह सही है, तो इस शिपमेंट को छोड़ दें. हालांकि, penalty_cost लागू न करें.

अगर मॉडल में कोई shipment_type_requirements है, तो शिपमेंट को अनदेखा करने पर, पुष्टि करने से जुड़ी गड़बड़ी होती है.

injected_first_solution_routes या injected_solution_constraint में किए जाने वाले शिपमेंट को अनदेखा करने की अनुमति है. सॉल्वर, शिपमेंट के रूट से पिकअप/डिलीवरी की विज़िट हटा देता है. precedence_rules, जो अनदेखा किए गए शिपमेंट का रेफ़रंस देते हैं उन्हें भी अनदेखा कर दिया जाएगा.

penalty_cost

double

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

अहम जानकारी: अगर इस जुर्माने के बारे में नहीं बताया गया है, तो इसे अनंत माना जाता है. इसका मतलब है कि शिपमेंट को पूरा करना ज़रूरी है.

pickup_to_delivery_relative_detour_limit

double

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

उदाहरण के लिए, मान लें कि t, पिकअप के लिए चुने गए विकल्प से डिलीवरी के लिए चुने गए विकल्प तक सीधे जाने में लगने वाला सबसे कम समय है. इसके बाद, pickup_to_delivery_relative_detour_limit सेटिंग लागू होती है:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

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

फ़ाइलों के लोड होने के बारे में जानकारी

विज़िट के दौरान, अगर पिकअप है, तो वाहन के लोड में पहले से तय की गई संख्या जोड़ी जा सकती है. इसके अलावा, अगर डिलीवरी है, तो उसे घटाया जा सकता है. इस मैसेज में, इस रकम के बारे में बताया गया है. load_demands देखें.

फ़ील्ड
amount

int64

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

VisitRequest

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

फ़ील्ड
arrival_location

LatLng

वह जगह जहां यह VisitRequest करने पर वाहन पहुंचता है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो arrival_location की वैल्यू नहीं दी जानी चाहिए.

arrival_waypoint

Waypoint

वह वेपॉइंट जहां वाहन इस VisitRequest को पूरा करने के बाद पहुंचता है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो arrival_waypoint की वैल्यू नहीं दी जानी चाहिए.

departure_location

LatLng

इस VisitRequest को पूरा करने के बाद, वाहन जिस जगह से रवाना होता है उसकी भौगोलिक जगह की जानकारी. अगर यह arrival_location के जैसा ही है, तो इसे हटाया जा सकता है. अगर शिपमेंट मॉडल में अवधि के लिए दूरी के मैट्रिक्स हैं, तो departure_location की वैल्यू नहीं दी जानी चाहिए.

departure_waypoint

Waypoint

वह वेपॉइंट जहां से वाहन, इस VisitRequest को पूरा करने के बाद रवाना होता है. अगर यह arrival_waypoint के जैसा ही है, तो इसे हटाया जा सकता है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो departure_waypoint की वैल्यू नहीं दी जानी चाहिए.

tags[]

string

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

time_windows[]

TimeWindow

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

TimeWindow न होने का मतलब है कि वाहन किसी भी समय इस विज़िट को पूरा कर सकता है.

टाइम विंडो अलग-अलग होनी चाहिए.इसका मतलब है कि कोई भी टाइम विंडो, किसी दूसरी टाइम विंडो को ओवरलैप न करे या उसके बगल में न हो. साथ ही, वे बढ़ते क्रम में होनी चाहिए.

cost_per_hour_after_soft_end_time और soft_end_time को सिर्फ़ तब सेट किया जा सकता है, जब एक ही टाइम विंडो हो.

duration

Duration

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

cost

double

वाहन के रास्ते पर, विज़िट के इस अनुरोध को पूरा करने की लागत. इसका इस्तेमाल, शिपमेंट के पिकअप या डिलीवरी के हर विकल्प के लिए अलग-अलग शुल्क चुकाने के लिए किया जा सकता है. यह लागत, Shipment.penalty_cost की यूनिट में होनी चाहिए और नेगेटिव नहीं होनी चाहिए.

load_demands

map<string, Load>

इस विज़िट के अनुरोध की मांगें लोड करें. यह Shipment.load_demands फ़ील्ड की तरह ही है. हालांकि, यह पूरे Shipment के बजाय सिर्फ़ इस VisitRequest पर लागू होता है. यहां दी गई मांगें, Shipment.load_demands में दी गई मांगों में जोड़ दी जाती हैं.

visit_types[]

string

इससे विज़िट के टाइप के बारे में पता चलता है. इसका इस्तेमाल, किसी वाहन को इस विज़िट को पूरा करने के लिए ज़रूरी अतिरिक्त समय देने के लिए किया जा सकता है (Vehicle.extra_visit_duration_for_visit_type देखें).

कोई टाइप सिर्फ़ एक बार दिख सकता है.

label

string

इससे इस VisitRequest के लिए लेबल तय होता है. इस लेबल को जवाब में, उससे जुड़े ShipmentRoute.Visit में visit_label के तौर पर रिपोर्ट किया जाता है.

avoid_u_turns

bool

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

एक्सपेरिमेंट के तौर पर उपलब्ध: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request पर जाएं.

ShipmentModel

शिपमेंट मॉडल में शिपमेंट का एक सेट होता है, जिसे वाहनों के सेट से पूरा किया जाना चाहिए. साथ ही, कुल लागत को कम से कम किया जाना चाहिए. यह लागत, इन चीज़ों का कुल योग होती है:

  • वाहनों को रूट करने की लागत (कुल समय के हिसाब से लागत, यात्रा में लगने वाले समय के हिसाब से लागत, और सभी वाहनों की तय लागत का योग).
  • शिपमेंट न करने पर लगने वाले जुर्माने.
  • शिपमेंट की ग्लोबल अवधि की लागत
फ़ील्ड
shipments[]

Shipment

शिपमेंट का ऐसा सेट जिसे मॉडल में शामिल करना ज़रूरी है.

vehicles[]

Vehicle

वाहनों का सेट, जिसका इस्तेमाल विज़िट करने के लिए किया जा सकता है.

objectives[]

Objective

इस मॉडल के लिए तय किए गए लक्ष्यों का सेट, जिसे हम लागत में बदल देंगे. अगर इनपुट मॉडल खाली नहीं है, तो यह मुफ़्त होना चाहिए. बदला हुआ अनुरोध पाने के लिए, कृपया solving_mode = TRANSFORM_AND_RETURN_REQUEST का इस्तेमाल करें. ध्यान दें कि इस मामले में अनुरोध को हल नहीं किया जाएगा. इससे जुड़ा दस्तावेज़ देखें.

एक्सपेरिमेंटल: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request पर जाएं.

global_start_time

Timestamp

मॉडल के शुरू और खत्म होने का ग्लोबल समय: इस रेंज से बाहर का कोई भी समय मान्य नहीं माना जा सकता.

मॉडल की समयसीमा एक साल से कम होनी चाहिए. इसका मतलब है कि global_end_time और global_start_time के बीच का अंतर 3,15,36,000 सेकंड से कम होना चाहिए.

cost_per_*hour फ़ील्ड का इस्तेमाल करते समय, परफ़ॉर्मेंस को बेहतर बनाने के लिए, इस विंडो को कम समय के लिए सेट किया जा सकता है. उदाहरण के लिए, अगर आपको एक दिन का मॉडल बनाना है, तो आपको ग्लोबल टाइम लिमिट को उस दिन के लिए सेट करना चाहिए. अगर इसे सेट नहीं किया जाता है, तो डिफ़ॉल्ट रूप से 1 जनवरी, 1970 को 00:00:00 यूटीसी (यानी सेकंड: 0, नैनो: 0) का इस्तेमाल किया जाता है.

global_end_time

Timestamp

अगर यह नीति सेट नहीं की गई है, तो डिफ़ॉल्ट रूप से 1 जनवरी, 1971 को 00:00:00 यूटीसी (यानी सेकंड: 31536000, नैनो: 0) का इस्तेमाल किया जाता है.

global_duration_cost_per_hour

double

पूरे प्लान की "ग्लोबल अवधि", सभी वाहनों के शुरू होने के सबसे शुरुआती समय और खत्म होने के सबसे आखिरी समय के बीच का अंतर होती है. उदाहरण के लिए, उपयोगकर्ता उस संख्या के लिए हर घंटे की लागत असाइन कर सकते हैं, ताकि काम को जल्द से जल्द पूरा करने के लिए ऑप्टिमाइज़ किया जा सके. यह लागत, Shipment.penalty_cost की यूनिट में ही होनी चाहिए.

duration_distance_matrices[]

DurationDistanceMatrix

मॉडल में इस्तेमाल किए गए अवधि और दूरी के मैट्रिक्स के बारे में बताता है. अगर यह फ़ील्ड खाली है, तो use_geodesic_distances फ़ील्ड की वैल्यू के आधार पर, Google Maps या जियोडेसिक दूरी का इस्तेमाल किया जाएगा. अगर यह खाली नहीं है, तो use_geodesic_distances की वैल्यू 'सही है' नहीं हो सकती. साथ ही, duration_distance_matrix_src_tags और duration_distance_matrix_dst_tags को खाली नहीं छोड़ा जा सकता.

इस्तेमाल करने के उदाहरण:

  • दो जगहें हैं: locA और locB.
  • एक वाहन, जो locA से शुरू होकर locA पर खत्म होता है.
  • locB पर पिकअप के लिए 1 अनुरोध.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • तीन जगहें हैं: locA, locB, और locC.
  • एक वाहन, locA से अपनी यात्रा शुरू करता है और locB पर खत्म करता है. इसके लिए, "तेज़" मैट्रिक्स का इस्तेमाल किया जाता है.
  • एक वाहन, locB से अपना रास्ता शुरू करता है और locB पर ही खत्म करता है. इसके लिए, वह "slow" मैट्रिक्स का इस्तेमाल करता है.
  • एक वाहन, locB से अपना रूट शुरू करता है और locB पर ही खत्म करता है. इसके लिए, "fast" मैट्रिक्स का इस्तेमाल किया जाता है.
  • locC पर पिकअप के लिए विज़िट का 1 अनुरोध.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

अवधि और दूरी के मैट्रिक्स के सोर्स तय करने वाले टैग; duration_distance_matrices(i).rows(j), टैग duration_distance_matrix_src_tags(j) वाली विज़िट से मैट्रिक्स i में मौजूद अन्य विज़िट की अवधि और दूरी तय करता है.

टैग, VisitRequest.tags या Vehicle.start_tags से मेल खाते हैं. दिया गया VisitRequest या Vehicle, इस फ़ील्ड में मौजूद किसी एक टैग से पूरी तरह मैच होना चाहिए. ध्यान दें कि Vehicle के सोर्स, डेस्टिनेशन, और मैट्रिक्स टैग एक जैसे हो सकते हैं. इसी तरह, VisitRequest के सोर्स और डेस्टिनेशन टैग भी एक जैसे हो सकते हैं. सभी टैग अलग-अलग होने चाहिए और खाली स्ट्रिंग नहीं होनी चाहिए. अगर यह फ़ील्ड खाली नहीं है, तो duration_distance_matrices भी खाली नहीं होना चाहिए.

duration_distance_matrix_dst_tags[]

string

अवधि और दूरी के मैट्रिक्स के डेस्टिनेशन तय करने वाले टैग; duration_distance_matrices(i).rows(j).durations(k) (क्रमशः duration_distance_matrices(i).rows(j).meters(k)), मैट्रिक्स i में टैग duration_distance_matrix_src_tags(j) वाली विज़िट से टैग duration_distance_matrix_dst_tags(k) वाली विज़िट तक की यात्रा की अवधि (या दूरी) तय करता है.

टैग, VisitRequest.tags या Vehicle.start_tags से मेल खाते हैं. दिया गया VisitRequest या Vehicle, इस फ़ील्ड में मौजूद किसी एक टैग से पूरी तरह मैच होना चाहिए. ध्यान दें कि Vehicle के सोर्स, डेस्टिनेशन, और मैट्रिक्स टैग एक जैसे हो सकते हैं. इसी तरह, VisitRequest के सोर्स और डेस्टिनेशन टैग भी एक जैसे हो सकते हैं. सभी टैग अलग-अलग होने चाहिए और खाली स्ट्रिंग नहीं होनी चाहिए. अगर यह फ़ील्ड खाली नहीं है, तो duration_distance_matrices भी खाली नहीं होना चाहिए.

transition_attributes[]

TransitionAttributes

मॉडल में ट्रांज़िशन एट्रिब्यूट जोड़े गए.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

शिपमेंट के टाइप के ऐसे सेट जो एक-दूसरे के साथ काम नहीं करते (ShipmentTypeIncompatibility देखें).

shipment_type_requirements[]

ShipmentTypeRequirement

shipment_type की ज़रूरी शर्तों के सेट (ShipmentTypeRequirement देखें).

precedence_rules[]

PrecedenceRule

प्राथमिकता के नियमों का सेट, जिन्हें मॉडल में लागू करना ज़रूरी है.

अहम जानकारी: प्राथमिकता के नियमों का इस्तेमाल करने से, ऑप्टिमाइज़ की जा सकने वाली समस्या का साइज़ सीमित हो जाता है. प्राथमिकता के नियमों का इस्तेमाल करने वाले ऐसे अनुरोधों को अस्वीकार किया जा सकता है जिनमें कई शिपमेंट शामिल हों.

max_active_vehicles

int32

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

DurationDistanceMatrix

यह विज़िट और वाहन के शुरुआती जगहों से लेकर, विज़िट और वाहन के आखिरी जगहों तक की अवधि और दूरी का मैट्रिक्स तय करता है.

फ़ील्ड
rows[]

Row

इससे अवधि और दूरी के मैट्रिक्स की पंक्तियों के बारे में पता चलता है. इसमें ShipmentModel.duration_distance_matrix_src_tags जितने एलिमेंट होने चाहिए.

vehicle_start_tag

string

यह टैग बताता है कि समय और दूरी का यह मैट्रिक्स किन वाहनों पर लागू होता है. अगर यह एट्रिब्यूट खाली है, तो यह सभी वाहनों पर लागू होगा. साथ ही, सिर्फ़ एक मैट्रिक्स हो सकता है.

हर वाहन की शुरुआत, सिर्फ़ एक मैट्रिक्स से मैच होनी चाहिए.इसका मतलब है कि उनके start_tags फ़ील्ड में से सिर्फ़ एक फ़ील्ड, किसी मैट्रिक्स के vehicle_start_tag से मैच होना चाहिए. साथ ही, वह सिर्फ़ उस मैट्रिक्स से मैच होना चाहिए.

सभी मैट्रिक्स में अलग-अलग vehicle_start_tag होने चाहिए.

पंक्ति

इससे अवधि और दूरी के मैट्रिक्स की पंक्ति के बारे में पता चलता है.

फ़ील्ड
durations[]

Duration

किसी पंक्ति के लिए अवधि की वैल्यू. इसमें ShipmentModel.duration_distance_matrix_dst_tags जितने एलिमेंट होने चाहिए.

meters[]

double

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

मकसद

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

एक्सपेरिमेंटल: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request पर जाएं.

फ़ील्ड
type

Type

मकसद किस तरह का है.

weight

double

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

टाइप

मकसद का टाइप, जिसे लागतों के सेट से मैप किया जाएगा.

Enums
DEFAULT लागत का एक डिफ़ॉल्ट सेट इस्तेमाल किया जाएगा, ताकि सही समाधान मिल सके. ध्यान दें: इस मकसद का इस्तेमाल अपने-आप किया जा सकता है. हालांकि, अगर यह पहले से मौजूद नहीं है, तो इसे उपयोगकर्ता के तय किए गए मकसद में, बेसलाइन के तौर पर 1.0 वेट के साथ भी जोड़ा जाएगा.
MIN_DISTANCE "MIN" ऑब्जेक्टिव. तय की गई कुल दूरी को कम करना.
MIN_WORKING_TIME सभी वाहनों के लिए, काम करने के कुल समय को कम करना.
MIN_TRAVEL_TIME यह ऊपर दिए गए उदाहरण की तरह ही है. हालांकि, इसमें सिर्फ़ यात्रा में लगने वाले समय पर फ़ोकस किया गया है.
MIN_NUM_VEHICLES इस्तेमाल किए जाने वाले वाहनों की संख्या कम करना.

PrecedenceRule

दो इवेंट के बीच प्राथमिकता का नियम (हर इवेंट, शिपमेंट का पिकअप या डिलीवरी है): "दूसरा" इवेंट, "पहले" इवेंट के शुरू होने के कम से कम offset_duration बाद शुरू होना चाहिए.

एक ही (या मिलते-जुलते) इवेंट के लिए, कई प्राथमिकताएं हो सकती हैं. उदाहरण के लिए, "A की डिलीवरी के बाद B को पिकअप किया जाता है" और "B के पिकअप के बाद C को पिकअप किया जाता है".

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

फ़ील्ड
first_is_delivery

bool

इससे पता चलता है कि "पहला" इवेंट, डिलीवरी है या नहीं.

second_is_delivery

bool

इससे पता चलता है कि "दूसरा" इवेंट, डिलीवरी है या नहीं.

offset_duration

Duration

"पहले" और "दूसरे" इवेंट के बीच का ऑफ़सेट. यह नेगेटिव हो सकता है.

first_index

int32

"पहले" इवेंट का शिपमेंट इंडेक्स. इस फ़ील्ड में जानकारी देना ज़रूरी है.

second_index

int32

"दूसरे" इवेंट का शिपमेंट इंडेक्स. इस फ़ील्ड में जानकारी देना ज़रूरी है.

ShipmentRoute

किसी वाहन के रास्ते को समय के ऐक्सिस के हिसाब से, इस तरह से बांटा जा सकता है (हम मान लेते हैं कि n विज़िट हैं):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

ध्यान दें कि हम इनके बीच अंतर करते हैं:

  • "समय पर होने वाले इवेंट", जैसे कि वाहन के चलने और रुकने का समय और हर विज़िट के शुरू और खत्म होने का समय (यानी कि पहुंचने और रवाना होने का समय). ये किसी खास सेकंड पर होते हैं.
  • "समय अंतराल", जैसे कि विज़िट और विज़िट के बीच का ट्रांज़िशन. कभी-कभी समयावधि शून्य हो सकती है.इसका मतलब है कि वह एक ही सेकंड में शुरू और खत्म हो सकती है. हालांकि, आम तौर पर समयावधि शून्य से ज़्यादा होती है.

इनवैरिएंट:

  • अगर n विज़िट हैं, तो n+1 ट्रांज़िशन होंगे.
  • विज़िट से पहले हमेशा एक ट्रांज़िशन (एक ही इंडेक्स) और उसके बाद एक ट्रांज़िशन (इंडेक्स + 1) होता है.
  • वाहन के चलने के बाद, हमेशा ट्रांज़िशन #0 होता है.
  • वाहन के सफ़र के खत्म होने से पहले, हमेशा ट्रांज़िशन #n होता है.

ज़ूम इन करने पर, Transition और Visit के दौरान यह होता है:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

आखिर में, यहां बताया गया है कि ट्रांज़िशन के दौरान यात्रा, ब्रेक, देरी, और इंतज़ार को कैसे व्यवस्थित किया जा सकता है.

  • ये ओवरलैप नहीं होते.
  • DELAY यूनीक होता है और यह अगली विज़िट (या वाहन के आखिरी स्टॉप) से ठीक पहले का समय होना चाहिए. इसलिए, देरी की अवधि जानने से ही, इसके शुरू और खत्म होने के समय का पता चल जाता है.
  • BREAKS, समय की ऐसी अवधियां होती हैं जो एक-दूसरे से जुड़ी होती हैं और ओवरलैप नहीं होती हैं. जवाब में, हर ब्रेक के शुरू होने का समय और अवधि बताई गई है.
  • यात्रा और इंतज़ार "प्रीएम्प्टेबल" हैं: इस ट्रांज़िशन के दौरान, उन्हें कई बार रोका जा सकता है. क्लाइंट यह मान सकते हैं कि यात्रा "जितनी जल्दी हो सके" शुरू हो जाती है और "इंतज़ार" में बाकी समय बीत जाता है.

एक (जटिल) उदाहरण:

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
फ़ील्ड
vehicle_index

int32

रूट पर चलने वाला वाहन, जिसकी पहचान सोर्स ShipmentModel में उसके इंडेक्स से की जाती है.

vehicle_label

string

इस रूट पर चलने वाले वाहन का लेबल. अगर बताया गया हो, तो यह ShipmentModel.vehicles(vehicle_index).label के बराबर होता है.

vehicle_start_time

Timestamp

वह समय जब वाहन अपना रास्ता शुरू करता है.

vehicle_end_time

Timestamp

वह समय जब वाहन अपना रास्ता पूरा करता है.

visits[]

Visit

विज़िट का क्रम, जो किसी रास्ते को दिखाता है. visits[i], रास्ते में i-th विज़िट है. अगर यह फ़ील्ड खाली है, तो वाहन को इस्तेमाल नहीं किया गया माना जाता है.

transitions[]

Transition

रास्ते के लिए ट्रांज़िशन की क्रम से लगाई गई सूची.

has_traffic_infeasibilities

bool

OptimizeToursRequest.consider_road_traffic को true पर सेट करने पर, यह फ़ील्ड बताता है कि रूट की टाइमिंग में होने वाली गड़बड़ियों का अनुमान, ट्रैफ़िक के आधार पर यात्रा में लगने वाले समय के अनुमान का इस्तेमाल करके लगाया जाता है. ऐसा हो सकता है कि पहली विज़िट से पहले या आखिरी विज़िट के बाद, ट्रैफ़िक के हिसाब से यात्रा, देरी, और विज़िट के बीच के ब्रेक को पूरा करने के लिए ज़रूरत के मुताबिक समय न हो. हालांकि, विज़िट और वाहन के लिए तय की गई समयसीमा अब भी पूरी हो रही हो. उदाहरण के लिए,

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

ट्रैफ़िक की वजह से, यात्रा में लगने वाले समय का अनुमान travel_duration(previous_visit, next_visit) बढ़ गया है. इसलिए, next_visit पर पहुंचने में, मौजूदा समयसीमा से ज़्यादा समय लग सकता है. इसके अलावा, यात्रा में लगने वाले समय के अनुमान में बढ़ोतरी होने और विज़िट या ब्रेक के समय की पाबंदियों की वजह से, ब्रेक को विज़िट के साथ ओवरलैप किया जा सकता है.

route_polyline

EncodedPolyline

रास्ते को एन्कोड की गई पॉलीलाइन के तौर पर दिखाया जाता है. यह फ़ील्ड सिर्फ़ तब भरा जाता है, जब OptimizeToursRequest.populate_polylines को 'सही है' पर सेट किया गया हो.

breaks[]

Break

इस रूट पर चलने वाले वाहन के लिए शेड्यूल किए गए ब्रेक. breaks क्रम, समय के अंतराल को दिखाता है. हर अंतराल, उससे जुड़े start_time से शुरू होता है और duration सेकंड तक चलता है.

metrics

AggregatedMetrics

इस रास्ते के लिए, समय, दूरी, और लोड की मेट्रिक. कॉन्टेक्स्ट के आधार पर, AggregatedMetrics के फ़ील्ड को सभी ShipmentRoute.transitions या ShipmentRoute.visits के लिए जोड़ा जाता है.

vehicle_fullness

VehicleFullness

VehicleFullness फ़ील्ड, यह कैलकुलेट करने के लिए है कि कैप की गई मेट्रिक, वाहन की तय की गई सीमाओं के कितने करीब हैं. इसके फ़ील्ड, कैप की गई मेट्रिक फ़ील्ड (जैसे, AggregatedMetrics.travel_distance_meters) और वाहन की तय सीमा (जैसे, Vehicle.route_distance_limit) के बीच के अनुपात होते हैं.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

route_costs

map<string, double>

रास्ते की लागत, जिसे लागत से जुड़े अनुरोध फ़ील्ड के हिसाब से बांटा गया है. कुंजियां, इनपुट OptimizeToursRequest के हिसाब से प्रोटो पाथ होती हैं. उदाहरण के लिए, "model.shipments.pickups.cost". वैल्यू, संबंधित लागत फ़ील्ड से जनरेट की गई कुल लागत होती है. इसे पूरे रूट के लिए एग्रीगेट किया जाता है. दूसरे शब्दों में, costs["model.shipments.pickups.cost"], रूट पर पिकअप की सभी लागतों का योग है. मॉडल में तय की गई सभी लागतों की जानकारी यहां दी गई है. हालांकि, TransitionAttributes से जुड़ी लागतों की जानकारी सिर्फ़ एग्रीगेट किए गए तरीके से दी गई है. यह जानकारी जनवरी 2022 से दी जा रही है.

route_total_cost

double

रास्ते की कुल लागत. लागत मैप में मौजूद सभी लागतों का योग.

ब्रेक

ब्रेक के लागू होने की जानकारी देने वाला डेटा.

फ़ील्ड
start_time

Timestamp

ब्रेक शुरू होने का समय.

duration

Duration

ब्रेक की अवधि.

EncodedPolyline

पॉलीलाइन को एन्कोड करके दिखाया गया है. पॉलीलाइन एन्कोडिंग के बारे में ज़्यादा जानकारी यहां मिल सकती है: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

फ़ील्ड
points

string

पॉलीलाइन के एन्कोड किए गए पॉइंट दिखाने वाली स्ट्रिंग.

ट्रांज़िशन

रास्ते में दो इवेंट के बीच ट्रांज़िशन. ShipmentRoute का ब्यौरा देखें.

अगर वाहन में start_location और/या end_location नहीं है, तो यात्रा से जुड़ी मेट्रिक 0 होंगी.

फ़ील्ड
travel_duration

Duration

इस ट्रांज़िशन के दौरान यात्रा में लगने वाला समय.

travel_distance_meters

double

ट्रांज़िशन के दौरान तय की गई दूरी.

traffic_info_unavailable

bool

जब OptimizeToursRequest.consider_road_traffic से ट्रैफ़िक का अनुरोध किया जाता है और Transition के लिए ट्रैफ़िक की जानकारी नहीं मिल पाती है, तो इस बूलियन को 'सही है' पर सेट किया जाता है. ऐसा कुछ समय के लिए हो सकता है (रीयल-टाइम ट्रैफ़िक सर्वर में कभी-कभार होने वाली गड़बड़ी) या हमेशा के लिए (इस जगह के लिए कोई डेटा नहीं है).

delay_duration

Duration

इस ट्रांज़िशन पर लागू की गई देरी की कुल अवधि. अगर कोई देरी होती है, तो वह अगले इवेंट (विज़िट या वाहन के रुकने) से ठीक delay_duration सेकंड पहले शुरू होती है. TransitionAttributes.delay देखें.

break_duration

Duration

इस ट्रांज़िशन के दौरान होने वाले ब्रेक की कुल अवधि, अगर कोई हो. हर ब्रेक के शुरू होने के समय और अवधि की जानकारी, ShipmentRoute.breaks में सेव होती है.

wait_duration

Duration

इस ट्रांज़िशन के दौरान इंतज़ार में बिताया गया समय. इंतज़ार की अवधि, आइडल टाइम के हिसाब से तय होती है. इसमें ब्रेक का समय शामिल नहीं होता. यह भी ध्यान रखें कि इंतज़ार के इस समय को कई अलग-अलग समयावधियों में बांटा जा सकता है.

total_duration

Duration

ट्रांज़िशन की कुल अवधि. यह सुविधा के लिए दी गई है. यह इसके बराबर है:

  • अगली विज़िट start_time (या vehicle_end_time, अगर यह आखिरी ट्रांज़िशन है) - इस ट्रांज़िशन का start_time;
  • अगर ShipmentRoute.has_traffic_infeasibilities की वैल्यू false है, तो यह भी लागू होता है: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

इस ट्रांज़िशन के शुरू होने का समय.

route_polyline

EncodedPolyline

ट्रांज़िशन के दौरान तय किए गए रास्ते को एन्कोड की गई पॉलीलाइन के तौर पर दिखाया जाता है. यह फ़ील्ड सिर्फ़ तब भरा जाता है, जब populate_transition_polylines को 'सही है' पर सेट किया गया हो.

route_token

string

सिर्फ़ आउटपुट के लिए. यह एक ओपेक टोकन है, जिसे नेविगेशन के दौरान रास्ते को फिर से बनाने के लिए, Navigation SDK को पास किया जा सकता है. साथ ही, रास्ता बदलने पर, रास्ता बनाते समय तय किए गए मूल मकसद का ध्यान रखा जा सकता है. इस टोकन को ओपेक ब्लॉब के तौर पर इस्तेमाल करें. अलग-अलग अनुरोधों के लिए, इसकी वैल्यू की तुलना न करें. ऐसा इसलिए, क्योंकि सेवा से एक जैसा रूट मिलने पर भी इसकी वैल्यू बदल सकती है. यह फ़ील्ड सिर्फ़ तब भरा जाता है, जब populate_transition_polylines को 'सही है' पर सेट किया गया हो.

vehicle_loads

map<string, VehicleLoad>

इस ट्रांज़िशन के दौरान, वाहन में लोड किए गए हर तरह के शिपमेंट की जानकारी. इसमें वे शिपमेंट शामिल हैं जो इस वाहन के Vehicle.load_limits में दिखते हैं या इस रूट पर किए गए किसी शिपमेंट के लिए, Shipment.load_demands की वैल्यू शून्य नहीं है.

पहले ट्रांज़िशन के दौरान लोड, वाहन के रूट के शुरुआती लोड होते हैं. इसके बाद, हर विज़िट के बाद, विज़िट के load_demands को जोड़ा या घटाया जाता है, ताकि अगले ट्रांज़िशन के लोड मिल सकें. यह इस बात पर निर्भर करता है कि विज़िट, पिकअप थी या डिलीवरी.

VehicleLoad

यह किसी खास तरह के वाहन के लिए, रास्ते में किसी जगह पर वाहन के असल लोड की जानकारी देता है (Transition.vehicle_loads देखें).

फ़ील्ड
amount

int64

दिए गए टाइप के लिए, वाहन पर लोड की गई चीज़ों की संख्या. लोड की यूनिट आम तौर पर, टाइप के हिसाब से तय होती है. Transition.vehicle_loads देखें.

यहां जाएं

किसी रूट पर की गई विज़िट. यह विज़िट, Shipment को पिकअप या डिलीवर करने से जुड़ी है.

फ़ील्ड
shipment_index

int32

सोर्स ShipmentModel में shipments फ़ील्ड का इंडेक्स.

is_pickup

bool

अगर वैल्यू 'सही' है, तो इसका मतलब है कि विज़िट, Shipment के पिकअप से जुड़ी है. अगर ऐसा नहीं है, तो यह डिलीवरी से जुड़ा है.

visit_request_index

int32

Shipment के पिकअप या डिलीवरी फ़ील्ड में VisitRequest का इंडेक्स (is_pickup देखें).

start_time

Timestamp

विज़िट शुरू होने का समय. ध्यान दें कि वाहन, विज़िट की जगह पर इससे पहले भी पहुंच सकता है. समय, ShipmentModel के मुताबिक है.

load_demands

map<string, Load>

शिपमेंट और विज़िट के अनुरोध load_demands के योग के तौर पर, विज़िट लोड की कुल मांग. अगर विज़िट एक डिलीवरी है, तो वैल्यू नेगेटिव होती हैं. मांगों की रिपोर्ट उसी तरह की जाती है जिस तरह Transition.loads की जाती है (यह फ़ील्ड देखें).

detour

Duration

शिपमेंट की डिलीवरी के लिए तय किए गए रास्ते पर, किसी शिपमेंट की डिलीवरी के लिए पहले से तय किए गए समय से पहले पहुंचने पर लगने वाला अतिरिक्त समय. साथ ही, डिलीवरी के लिए तय की गई समयावधि की वजह से लगने वाला संभावित इंतज़ार का समय. अगर विज़िट, डिलीवरी के लिए है, तो डिटूर की गिनती, उससे जुड़ी पिकअप विज़िट से की जाती है. यह इसके बराबर होती है:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

ऐसा न होने पर, इसका हिसाब वाहन start_location से लगाया जाता है. यह इसके बराबर होता है:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

अगर Shipment में बताया गया है, तो उससे जुड़े Shipment.label की कॉपी.

visit_label

string

अगर VisitRequest में बताया गया है, तो उससे जुड़े VisitRequest.label की कॉपी.

visit_type

VisitType

ज़रूरी नहीं. इससे विज़िट के टाइप के बारे में पता चलता है. Visit.is_pickup फ़ील्ड को ओवरराइड करता है.

injected_solution_location_token

int32

विज़िट की जगह की जानकारी देने वाला ओपेक टोकन.

इस फ़ील्ड को नतीजे के तौर पर मिले रास्तों की विज़िट में तब भरा जा सकता है, जब इस विज़िट के लिए VisitRequest.avoid_u_turns को 'सही' पर सेट किया गया हो या अनुरोध OptimizeToursRequest में ShipmentModel.avoid_u_turns को 'सही' पर सेट किया गया हो.

एक्सपेरिमेंट के तौर पर उपलब्ध: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request पर जाएं.

VisitType

इससे पता चलता है कि विज़िट, पिकअप, डिलीवरी या Stop पर जाने के लिए है. स्टॉप पर विज़िट का इस्तेमाल सिर्फ़ तब किया जाता है, जब मल्टीमोडल ऑप्टिमाइज़ेशन की सुविधा चालू हो.

Enums
VISIT_TYPE_UNSPECIFIED विज़िट टाइप की जानकारी नहीं है.
PICKUP_SHIPMENT विज़िट का मतलब, शिपमेंट पिकअप से है.
DELIVER_SHIPMENT विज़िट का मतलब, शिपमेंट की डिलीवरी से है.

ShipmentTypeIncompatibility

इससे शिपमेंट के shipment_type के आधार पर, उनके बीच की असंगतताओं के बारे में पता चलता है. एक ही रास्ते पर, एक-दूसरे के साथ काम न करने वाले शिपमेंट को एक साथ नहीं भेजा जा सकता. यह पाबंदी, इनकंपैटिबिलिटी मोड के आधार पर लगाई जाती है.

फ़ील्ड
types[]

string

काम न करने वाले टाइप की सूची. सूची में शामिल दो शिपमेंट के लिए, shipment_types की वैल्यू अलग-अलग होने पर, उन्हें "अमान्य" माना जाता है.

incompatibility_mode

IncompatibilityMode

काम न करने की समस्या पर लागू किया गया मोड.

IncompatibilityMode

ऐसे मोड जिनसे यह तय होता है कि एक ही रूट पर, एक-दूसरे के साथ न भेजे जा सकने वाले शिपमेंट को कैसे रोका जाए.

Enums
INCOMPATIBILITY_MODE_UNSPECIFIED इनकंपैटिबिलिटी मोड के बारे में नहीं बताया गया है. इस वैल्यू का इस्तेमाल कभी नहीं किया जाना चाहिए.
NOT_PERFORMED_BY_SAME_VEHICLE इस मोड में, एक-दूसरे के साथ न रखे जा सकने वाले दो शिपमेंट को एक ही वाहन में नहीं रखा जा सकता.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

इस मोड में, एक-दूसरे के साथ काम न करने वाले दो शिपमेंट को एक ही समय पर एक ही वाहन में नहीं रखा जा सकता:

  • वे एक ही वाहन को सिर्फ़ तब शेयर कर सकते हैं, जब एक ऑर्डर की डिलीवरी, दूसरे ऑर्डर को पिक अप करने से पहले हो जाए.
  • जब दोनों शिपमेंट सिर्फ़ पिकअप (कोई डिलीवरी नहीं) या सिर्फ़ डिलीवरी (कोई पिकअप नहीं) के लिए हों, तो उन्हें एक ही वाहन से नहीं भेजा जा सकता.

ShipmentTypeRequirement

shipment_type के आधार पर, शिपमेंट के बीच की ज़रूरी शर्तें तय करता है. ज़रूरी शर्त मोड से, ज़रूरी शर्त की जानकारी तय होती है.

फ़ील्ड
required_shipment_type_alternatives[]

string

dependent_shipment_types के लिए ज़रूरी शिपमेंट के अन्य टाइप की सूची.

dependent_shipment_types[]

string

dependent_shipment_types फ़ील्ड में मौजूद टाइप वाले सभी शिपमेंट के लिए, उसी रूट पर required_shipment_type_alternatives टाइप का कम से कम एक शिपमेंट डिलीवर करना ज़रूरी है.

ध्यान दें: ज़रूरी शर्तों की ऐसी चेन बनाने की अनुमति नहीं है जिसमें कोई shipment_type खुद पर निर्भर हो.

requirement_mode

RequirementMode

ज़रूरी शर्त पर लागू किया गया मोड.

RequirementMode

किसी रास्ते पर, एक-दूसरे पर निर्भर शिपमेंट के दिखने के तरीके.

Enums
REQUIREMENT_MODE_UNSPECIFIED ज़रूरी शर्त का मोड नहीं बताया गया है. इस वैल्यू का इस्तेमाल कभी नहीं किया जाना चाहिए.
PERFORMED_BY_SAME_VEHICLE इस मोड में, "निर्भर" शिपमेंट को कम से कम एक "ज़रूरी" शिपमेंट के साथ एक ही वाहन में भेजना ज़रूरी है.
IN_SAME_VEHICLE_AT_PICKUP_TIME

IN_SAME_VEHICLE_AT_PICKUP_TIME मोड में, "निर्भर" शिपमेंट को पिकअप करते समय, वाहन में कम से कम एक "ज़रूरी" शिपमेंट होना चाहिए.

इसलिए, "डिपेंडेंट" शिपमेंट पिकअप में इनमें से कोई एक होना चाहिए:

  • डिलीवरी के लिए "ज़रूरी" शिपमेंट, रूट पर बाद में डिलीवर किया गया हो या
  • "ज़रूरी" शिपमेंट को उससे पहले के रास्ते पर पिक अप किया गया हो. साथ ही, अगर "ज़रूरी" शिपमेंट की डिलीवरी करनी है, तो यह डिलीवरी "निर्भर" शिपमेंट के पिकअप के बाद की जानी चाहिए.
IN_SAME_VEHICLE_AT_DELIVERY_TIME यह पहले जैसा ही है. हालांकि, "निर्भर" शिपमेंट की डिलीवरी के समय, उनके वाहन में "ज़रूरी" शिपमेंट होना चाहिए.

SkippedShipment

इससे किसी समाधान में, शिप नहीं किए गए शिपमेंट की जानकारी मिलती है. मामूली मामलों और/या अगर हम स्किप करने की वजह की पहचान कर पाते हैं, तो हम यहां वजह बताते हैं.

फ़ील्ड
index

int32

इंडेक्स, सोर्स ShipmentModel में मौजूद शिपमेंट के इंडेक्स से मेल खाता है.

label

string

अगर Shipment में बताया गया है, तो उससे जुड़े Shipment.label की कॉपी.

reasons[]

Reason

शिपमेंट को स्किप करने की वजहों की सूची. ऊपर दी गई टिप्पणी Reason देखें. अगर हमें यह समझ नहीं आता है कि शिपमेंट को क्यों छोड़ा गया, तो वजहें सेट नहीं की जाएंगी.

penalty_cost

double

यह Shipment.penalty_cost की कॉपी है. इसे यहां इसलिए शामिल किया गया है, ताकि शिपमेंट को स्किप करने की गंभीरता को आसानी से समझा जा सके.

एक्सपेरिमेंट के तौर पर: आने वाले समय में, इस फ़ील्ड के काम करने के तरीके या इसकी मौजूदगी में बदलाव हो सकता है.

estimated_incompatible_vehicle_ratio

double

उन वाहनों का अनुमानित अनुपात जो इनमें से कम से कम एक वजह से, इस शिपमेंट को डिलीवर नहीं कर सकते. ध्यान दें: यह फ़ील्ड सिर्फ़ तब भरा जाता है, जब वजहों में कोई वाहन शामिल हो.

एक्सपेरिमेंट के तौर पर: आने वाले समय में, इस फ़ील्ड के काम करने के तरीके या इसकी मौजूदगी में बदलाव हो सकता है.

कारण

अगर शिपमेंट को स्किप करने की वजह बताई जा सकती है, तो वह यहां दी जाएगी. अगर सभी वाहनों के लिए वजह एक जैसी नहीं है, तो reason में एक से ज़्यादा एलिमेंट होंगे. शिपमेंट को स्किप करने की डुप्लीकेट वजहें नहीं हो सकतीं. इसका मतलब है कि example_vehicle_index को छोड़कर, सभी फ़ील्ड एक जैसे नहीं हो सकते. उदाहरण:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

स्किप किया गया शिपमेंट, किसी भी वाहन के साथ काम नहीं करता. सभी वाहनों के लिए वजहें अलग-अलग हो सकती हैं. हालांकि, कम से कम एक वाहन की "सेब" ले जाने की क्षमता (वाहन 1 के साथ), कम से कम एक वाहन की "नाशपाती" ले जाने की क्षमता (वाहन 3 के साथ), और कम से कम एक वाहन की तय दूरी की सीमा (वाहन 1 के साथ) पार हो जाएगी.

फ़ील्ड
code

Code

कोड की टिप्पणियां देखें.

example_vehicle_indices[]

int32

यह example_vehicle_index जैसा ही है. हालांकि, इसमें हम पहचाने गए कई वाहनों की सूची उपलब्ध कराते हैं. यह ज़रूरी नहीं है कि इस सूची में सभी तरह के कॉन्टेंट शामिल हों. यह फ़ील्ड सिर्फ़ तब भरा जाता है, जब [fill_example_vehicle_indices_in_skipped_reasons][] की वैल्यू 'सही है' पर सेट हो.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

example_exceeded_capacity_type

string

अगर वजह का कोड DEMAND_EXCEEDS_VEHICLE_CAPACITY है, तो इसका मतलब है कि आपने एक ही तरह के दस्तावेज़ों को तय सीमा से ज़्यादा अपलोड किया है.

example_vehicle_index

int32

अगर शिपमेंट और वाहन के साथ काम न करने की वजह से ऐसा हुआ है, तो इस फ़ील्ड में काम के वाहन का इंडेक्स दिया जाता है.

कोड

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

Enums
CODE_UNSPECIFIED इसका इस्तेमाल कभी नहीं किया जाना चाहिए.
NO_VEHICLE मॉडल में कोई वाहन नहीं है. इस वजह से, कोई भी शिपमेंट डिलीवर नहीं किया जा सकता.
DEMAND_EXCEEDS_VEHICLE_CAPACITY शिपमेंट की मांग, कुछ क्षमता टाइप के लिए वाहन की क्षमता से ज़्यादा है. इनमें से एक example_exceeded_capacity_type है.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

इस शिपमेंट को पूरा करने के लिए ज़रूरी कम से कम दूरी, वाहन की route_distance_limit से ज़्यादा है. यह दूरी, वाहन की start_location से शिपमेंट के पिकअप और/या डिलीवरी की जगहों और वाहन की आखिरी जगह तक की दूरी होती है.

ध्यान दें कि इस कैलकुलेशन के लिए, हम जियोडेसिक दूरी का इस्तेमाल करते हैं.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

इस शिपमेंट को पूरा करने के लिए ज़रूरी कम से कम समय, वाहन के route_duration_limit से ज़्यादा है. इसमें यात्रा में लगने वाला समय, इंतज़ार का समय, और सेवा में लगने वाला समय शामिल है.

ध्यान दें: यात्रा में लगने वाले समय का हिसाब, सबसे सही स्थिति के हिसाब से लगाया जाता है. जैसे, जियोडेसिक दूरी x 36 मीटर/सेकंड (करीब 130 कि॰मी॰/घंटा).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT यह ऊपर दिए गए विकल्प की तरह ही है. हालांकि, इसमें हम सिर्फ़ यात्रा में लगने वाले कम से कम समय और वाहन के travel_duration_limit की तुलना करते हैं.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS अगर वाहन को सबसे पहले शुरू होने के समय पर शुरू किया जाता है, तो वह सबसे सही स्थिति में भी इस शिपमेंट को पूरा नहीं कर सकता (समय की गणना के लिए CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT देखें): कुल समय की वजह से, वाहन को खत्म होने के सबसे बाद के समय के बाद खत्म करना होगा.
VEHICLE_NOT_ALLOWED शिपमेंट का allowed_vehicle_indices फ़ील्ड खाली नहीं है और यह वाहन इससे जुड़ा नहीं है.
VEHICLE_IGNORED

वाहन के ignore फ़ील्ड की वैल्यू 'सही है' पर सेट हो.

एक्सपेरिमेंट के तौर पर: आने वाले समय में, इस फ़ील्ड के काम करने के तरीके या इसकी मौजूदगी में बदलाव हो सकता है.

SHIPMENT_IGNORED

शिपमेंट के ignore फ़ील्ड की वैल्यू 'सही' पर सेट है.

एक्सपेरिमेंट के तौर पर: आने वाले समय में, इस फ़ील्ड के काम करने के तरीके या इसकी मौजूदगी में बदलाव हो सकता है.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

injected_solution_constraint में शिपमेंट को स्किप कर दिया गया है.

एक्सपेरिमेंट के तौर पर: आने वाले समय में, इस फ़ील्ड के काम करने के तरीके या इसकी मौजूदगी में बदलाव हो सकता है.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

injected_solution_constraint में तय की गई, वाहन के रास्ते में छूट की सुविधा, किसी भी विज़िट को शामिल करने की अनुमति नहीं देती.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

ZERO_PENALTY_COST

शिपमेंट पर कोई जुर्माना नहीं लगाया जाता. यह ऐडवांस मॉडलिंग के विकल्प के तौर पर काम का हो सकता है. साथ ही, इससे यह भी पता चल सकता है कि किसी शिपमेंट को क्यों छोड़ा गया.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

TimeWindow

टाइम विंडो, किसी इवेंट के समय को सीमित करती हैं. जैसे, किसी जगह पर पहुंचने का समय या किसी वाहन के चलने और रुकने का समय.

समयसीमा की तय सीमाएं, start_time और end_time, इवेंट के शुरू होने और खत्म होने के समय को लागू करती हैं, जैसे कि start_time <= event_time <= end_time. सॉफ़्ट टाइम विंडो की निचली सीमा, soft_start_time, यह बताती है कि इवेंट को soft_start_time पर या उसके बाद होना चाहिए. इसके लिए, इवेंट के soft_start_time से पहले होने की अवधि के हिसाब से लागत तय की जाती है. सॉफ़्ट टाइम विंडो की ऊपरी सीमा, soft_end_time, यह बताती है कि इवेंट को soft_end_time पर या उससे पहले होना चाहिए. अगर इवेंट soft_end_time के बाद होता है, तो उसके हिसाब से लागत बढ़ जाएगी. start_time, end_time, soft_start_time, और soft_end_time, ग्लोबल टाइम लिमिट के मुताबिक होने चाहिए (ShipmentModel.global_start_time और ShipmentModel.global_end_time देखें). साथ ही, इनमें इन बातों का ध्यान रखा जाना चाहिए:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
फ़ील्ड
start_time

Timestamp

हार्ड टाइम विंडो शुरू होने का समय. अगर इसे तय नहीं किया जाता है, तो इसे ShipmentModel.global_start_time पर सेट कर दिया जाएगा.

end_time

Timestamp

हार्ड टाइम विंडो के खत्म होने का समय. अगर इसे तय नहीं किया जाता है, तो इसे ShipmentModel.global_end_time पर सेट कर दिया जाएगा.

soft_start_time

Timestamp

समय की विंडो के शुरू होने का सॉफ़्ट टाइम.

soft_end_time

Timestamp

समयसीमा खत्म होने का समय.

cost_per_hour_before_soft_start_time

double

अगर इवेंट, soft_start_time से पहले होता है, तो मॉडल में अन्य लागतों में हर घंटे की लागत जोड़ी जाती है. इसका हिसाब इस तरह लगाया जाता है:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

यह लागत पॉज़िटिव होनी चाहिए. साथ ही, इस फ़ील्ड को सिर्फ़ तब सेट किया जा सकता है, जब soft_start_time सेट किया गया हो.

cost_per_hour_after_soft_end_time

double

अगर इवेंट soft_end_time के बाद होता है, तो मॉडल में अन्य लागतों में हर घंटे की लागत जोड़ी जाती है. इसका हिसाब इस तरह लगाया जाता है:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

यह लागत पॉज़िटिव होनी चाहिए. साथ ही, इस फ़ील्ड को सिर्फ़ तब सेट किया जा सकता है, जब soft_end_time को सेट किया गया हो.

TransitionAttributes

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

फ़ील्ड
src_tag

string

ये टैग, (src->dst) ट्रांज़िशन के सेट को तय करते हैं जिन पर ये एट्रिब्यूट लागू होते हैं.

सोर्स विज़िट या वाहन के शुरू होने की जगह की जानकारी सिर्फ़ तब मैच होती है, जब उसकी VisitRequest.tags या Vehicle.start_tags में src_tag शामिल हो या excluded_src_tag शामिल न हो. यह इस बात पर निर्भर करता है कि इन दोनों फ़ील्ड में से कौनसा फ़ील्ड खाली नहीं है.

excluded_src_tag

string

src_tag देखें. src_tag और excluded_src_tag में से किसी एक फ़ील्ड में वैल्यू डालना ज़रूरी है.

dst_tag

string

डेस्टिनेशन विज़िट या वाहन की यात्रा का आखिरी पड़ाव सिर्फ़ तब मैच होता है, जब उसके VisitRequest.tags या Vehicle.end_tags में dst_tag शामिल हो या excluded_dst_tag शामिल न हो. यह इस बात पर निर्भर करता है कि इन दोनों फ़ील्ड में से कौनसा फ़ील्ड खाली नहीं है.

excluded_dst_tag

string

dst_tag देखें. dst_tag और excluded_dst_tag में से किसी एक फ़ील्ड में वैल्यू डालना ज़रूरी है.

cost

double

इस ट्रांज़िशन को पूरा करने की लागत तय करता है. यह मॉडल में मौजूद अन्य सभी लागतों की तरह ही एक यूनिट है. साथ ही, यह नेगेटिव नहीं होनी चाहिए. यह शुल्क, अन्य सभी मौजूदा शुल्कों के अलावा लागू होता है.

cost_per_kilometer

double

इससे, इस ट्रांज़िशन के दौरान तय की गई दूरी के लिए, हर किलोमीटर के हिसाब से लगने वाली लागत का पता चलता है. यह वाहनों पर बताई गई किसी भी Vehicle.cost_per_kilometer में जुड़ जाता है.

distance_limit

DistanceLimit

इससे, ट्रांज़िशन के दौरान तय की गई दूरी की सीमा तय होती है.

जून 2021 से, सिर्फ़ सॉफ़्ट लिमिट का इस्तेमाल किया जा सकता है.

delay

Duration

इससे पता चलता है कि इस ट्रांज़िशन को पूरा करने में कितनी देरी हुई.

यह देरी हमेशा सोर्स विज़िट खत्म होने के बाद और डेस्टिनेशन विज़िट शुरू होने से पहले होती है.

उरी

एक यूनिवर्सल रिसॉर्स आइडेंटिफ़ायर, जो ऐसे रिसॉर्स पर ले जाता है जिसे Route Optimization API की मदद से पढ़ा और लिखा जा सकता है.

फ़ील्ड
uri

string

संसाधन का यूआरआई. ऐसा हो सकता है कि संसाधन अभी मौजूद न हो.

संसाधन के कॉन्टेंट को JSON या textproto के तौर पर एन्कोड किया जाता है. सिर्फ़ Google Cloud Storage के संसाधनों का इस्तेमाल किया जा सकता है. अगर संसाधन को JSON के तौर पर कोड में बदला गया है, तो संसाधन के नाम के आखिर में .json होना चाहिए. अगर संसाधन को textproto के तौर पर एन्कोड किया गया है, तो संसाधन के नाम के आखिर में .txtpb होना चाहिए. उदाहरण के लिए, JSON कोड में बदली गई फ़ाइल का Google Cloud Storage यूआरआई ऐसा दिख सकता है: gs://bucket/path/input/object.json.

वाहन

शिपमेंट की समस्या में किसी वाहन को मॉडल करता है. शिपमेंट की समस्या को हल करने से, इस वाहन के लिए start_location से शुरू होकर end_location पर खत्म होने वाला रास्ता बन जाएगा. रूट, विज़िट का एक क्रम होता है (ShipmentRoute देखें).

फ़ील्ड
display_name

string

वाहन का डिसप्ले नेम, जिसे उपयोगकर्ता ने तय किया है. यह ज़्यादा से ज़्यादा 63 वर्णों का हो सकता है. इसमें UTF-8 वर्णों का इस्तेमाल किया जा सकता है.

travel_mode

TravelMode

यात्रा का मोड, जिससे वाहन के लिए इस्तेमाल की जा सकने वाली सड़कों और उसकी स्पीड पर असर पड़ता है. travel_duration_multiple भी देखें.

route_modifiers

RouteModifiers

शर्तों का एक सेट, जो किसी वाहन के लिए रास्ते का हिसाब लगाने के तरीके पर असर डालता है.

start_location

LatLng

वह भौगोलिक जगह जहां से वाहन, शिपमेंट को पिक अप करने के लिए रवाना होता है. अगर यह जानकारी नहीं दी जाती है, तो वाहन अपने पहले पिकअप से शुरू होता है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो start_location की वैल्यू नहीं दी जानी चाहिए.

start_waypoint

Waypoint

यह वेपॉइंट, उस भौगोलिक जगह को दिखाता है जहां से वाहन, शिपमेंट को पिक अप करने के लिए निकलता है. अगर start_waypoint और start_location, दोनों में से कोई भी वैल्यू तय नहीं की गई है, तो वाहन अपनी पहली पिकअप लोकेशन से शुरू होता है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो start_waypoint की वैल्यू नहीं दी जानी चाहिए.

end_location

LatLng

वह भौगोलिक जगह जहां वाहन अपनी आखिरी VisitRequest पूरी करने के बाद रुकता है. अगर यह जानकारी नहीं दी जाती है, तो वाहन की ShipmentRoute, आखिरी VisitRequest पूरी होने के तुरंत बाद खत्म हो जाती है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो end_location की वैल्यू नहीं दी जानी चाहिए.

end_waypoint

Waypoint

वेपॉइंट, उस भौगोलिक जगह को दिखाता है जहां वाहन अपनी आखिरी VisitRequest पूरी करने के बाद रुकता है. अगर end_waypoint या end_location में से कोई भी वैल्यू नहीं दी गई है, तो आखिरी VisitRequest पूरा होने के तुरंत बाद, वाहन की ShipmentRoute खत्म हो जाती है. अगर शिपमेंट मॉडल में अवधि और दूरी के मैट्रिक्स हैं, तो end_waypoint की वैल्यू नहीं दी जानी चाहिए.

start_tags[]

string

इससे वाहन के रास्ते की शुरुआत में अटैच किए गए टैग के बारे में पता चलता है.

खाली या डुप्लीकेट स्ट्रिंग इस्तेमाल करने की अनुमति नहीं है.

end_tags[]

string

इससे वाहन के रास्ते के आखिर में जोड़े गए टैग के बारे में पता चलता है.

खाली या डुप्लीकेट स्ट्रिंग इस्तेमाल करने की अनुमति नहीं है.

start_time_windows[]

TimeWindow

वह समयावधि जिसके दौरान वाहन अपनी शुरुआती जगह से रवाना हो सकता है. वे ग्लोबल टाइम लिमिट के अंदर होने चाहिए. इसके लिए, ShipmentModel.global_* फ़ील्ड देखें. अगर कोई समयसीमा तय नहीं की गई है, तो दुनिया भर में लागू होने वाली समयसीमाओं के अलावा कोई और सीमा नहीं है.

दोहराए गए एक ही फ़ील्ड से जुड़ी समयावधियां अलग-अलग होनी चाहिए.इसका मतलब है कि कोई भी समयावधि, किसी दूसरी समयावधि के साथ ओवरलैप नहीं होनी चाहिए या उसके बगल में नहीं होनी चाहिए. साथ ही, वे समयावधियां क्रम से होनी चाहिए.

cost_per_hour_after_soft_end_time और soft_end_time को सिर्फ़ तब सेट किया जा सकता है, जब एक ही टाइम विंडो हो.

end_time_windows[]

TimeWindow

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

दोहराए गए एक ही फ़ील्ड से जुड़ी समयावधियां अलग-अलग होनी चाहिए.इसका मतलब है कि कोई भी समयावधि, किसी दूसरी समयावधि के साथ ओवरलैप नहीं होनी चाहिए या उसके बगल में नहीं होनी चाहिए. साथ ही, वे समयावधियां क्रम से होनी चाहिए.

cost_per_hour_after_soft_end_time और soft_end_time को सिर्फ़ तब सेट किया जा सकता है, जब एक ही टाइम विंडो हो.

unloading_policy

UnloadingPolicy

वाहन पर अनलोडिंग की नीति लागू की गई.

load_limits

map<string, LoadLimit>

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

cost_per_hour

double

वाहन की लागत: सभी लागतों को जोड़ें. साथ ही, ये Shipment.penalty_cost की तरह ही एक ही यूनिट में होनी चाहिए.

वाहन के रास्ते के लिए हर घंटे की लागत. यह लागत, रास्ते को पूरा करने में लगने वाले कुल समय पर लागू होती है. इसमें यात्रा में लगने वाला समय, इंतज़ार करने में लगने वाला समय, और विज़िट करने में लगने वाला समय शामिल है. सिर्फ़ cost_per_traveled_hour के बजाय cost_per_hour का इस्तेमाल करने से, इंतज़ार का समय बढ़ सकता है.

cost_per_traveled_hour

double

वाहन के रूट पर यात्रा के हर घंटे की लागत. यह लागत सिर्फ़ उस रास्ते से यात्रा में लगने वाले समय पर लागू होती है जो ShipmentRoute.transitions में बताया गया है. इसमें इंतज़ार करने और विज़िट करने का समय शामिल नहीं है.

cost_per_kilometer

double

वाहन के रास्ते के हर किलोमीटर की लागत. यह शुल्क, ShipmentRoute.transitions में बताई गई दूरी पर लागू होता है. यह शुल्क, किसी एक VisitRequest के arrival_location से departure_location तक की दूरी पर लागू नहीं होता.

fixed_cost

double

अगर इस वाहन का इस्तेमाल शिपमेंट को हैंडल करने के लिए किया जाता है, तो तय की गई लागत लागू होती है.

used_if_route_is_empty

bool

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

अगर यह वैल्यू true पर सेट है, तो वाहन अपनी शुरुआती जगह से आखिरी जगह तक जाता है. भले ही, वह किसी शिपमेंट को डिलीवर न करे. साथ ही, शुरुआती जगह से आखिरी जगह तक की यात्रा में लगने वाले समय और दूरी की लागत को ध्यान में रखा जाता है.

ऐसा न होने पर, यह वाहन अपने शुरुआती स्टॉप से आखिरी स्टॉप तक नहीं जाता. साथ ही, इस वाहन के लिए कोई break_rule या देरी (TransitionAttributes से) शेड्यूल नहीं की जाती. इस मामले में, वाहन के ShipmentRoute में वाहन के इंडेक्स और लेबल के अलावा कोई जानकारी नहीं होती.

route_duration_limit

DurationLimit

वाहन के रूट की कुल अवधि पर लागू की गई सीमा. किसी OptimizeToursResponse में, वाहन के रूट की अवधि, उसके vehicle_end_time और vehicle_start_time के बीच का अंतर होती है.

travel_duration_limit

DurationLimit

वाहन के रास्ते की यात्रा अवधि पर लागू सीमा. किसी OptimizeToursResponse में, रूट पर यात्रा करने में लगने वाला समय, उसके सभी transitions.travel_duration का योग होता है.

route_distance_limit

DistanceLimit

वाहन के रास्ते की कुल दूरी पर लागू की गई सीमा. किसी OptimizeToursResponse में, रास्ते की दूरी उसके सभी transitions.travel_distance_meters का योग होती है.

extra_visit_duration_for_visit_type

map<string, Duration>

इससे visit_types स्ट्रिंग से लेकर अवधि तक का मैप तय होता है. यह समयावधि, VisitRequest.duration के अलावा वह समय है जो तय किए गए visit_types के साथ विज़िट के दौरान लिया जाएगा. अगर cost_per_hour की वैल्यू तय की गई है, तो विज़िट की इस अतिरिक्त अवधि के लिए शुल्क लिया जाता है. कुंजियां (जैसे, visit_types) खाली स्ट्रिंग नहीं हो सकतीं.

अगर विज़िट के अनुरोध में कई तरह की विज़िट शामिल हैं, तो मैप में हर तरह की विज़िट के लिए समयावधि जोड़ी जाएगी.

break_rule

BreakRule

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

label

string

इस वाहन के लिए लेबल तय करता है. इस लेबल को रिस्पॉन्स में, उससे जुड़े ShipmentRoute के vehicle_label के तौर पर रिपोर्ट किया जाता है.

ignore

bool

अगर इसकी वैल्यू true पर सेट है, तो used_if_route_is_empty की वैल्यू false पर सेट होनी चाहिए. साथ ही, इस वाहन का इस्तेमाल नहीं किया जाएगा.

अगर injected_first_solution_routes में किसी शिपमेंट को अनदेखा किए गए वाहन से किया जाता है, तो उसे पहले समाधान में छोड़ दिया जाता है. हालांकि, जवाब में उसे शामिल किया जा सकता है.

अगर injected_solution_constraint में किसी शिपमेंट को अनदेखा किए गए वाहन से किया जाता है और उससे जुड़े किसी पिकअप/डिलीवरी को वाहन पर ही रहने के लिए बाध्य किया जाता है (यानी कि लेवल RELAX_ALL_AFTER_THRESHOLD तक छूट नहीं दी जाती है), तो उसे जवाब में छोड़ दिया जाता है. अगर किसी शिपमेंट में allowed_vehicle_indices फ़ील्ड खाली नहीं है और अनुमति वाले सभी वाहनों को अनदेखा कर दिया जाता है, तो उसे जवाब में शामिल नहीं किया जाता.

travel_duration_multiple

double

यह एट्रिब्यूट, गुणा करने वाले फ़ैक्टर के बारे में बताता है. इसका इस्तेमाल, इस वाहन की यात्रा में लगने वाले समय को बढ़ाने या घटाने के लिए किया जा सकता है. उदाहरण के लिए, इसे 2.0 पर सेट करने का मतलब है कि यह वाहन धीमा है और इसकी यात्रा में लगने वाला समय, स्टैंडर्ड वाहनों की तुलना में दोगुना है. इस मल्टीपल से, विज़िट की अवधि पर कोई असर नहीं पड़ता. अगर cost_per_hour या cost_per_traveled_hour तय किया गया है, तो इससे कीमत पर असर पड़ता है. यह [0.001, 1000.0] की रेंज में होना चाहिए. अगर इसे सेट नहीं किया जाता है, तो वाहन को स्टैंडर्ड माना जाता है और इस मल्टीपल को 1.0 माना जाता है.

चेतावनी: इस मल्टीपल को लागू करने के बाद, यात्रा में लगने वाले समय को सबसे नज़दीकी सेकंड तक राउंड किया जाएगा. हालांकि, ऐसा किसी भी संख्यात्मक कार्रवाई को करने से पहले किया जाएगा. इसलिए, छोटे मल्टीपल की वजह से सटीक जानकारी नहीं मिल सकती.

नीचे extra_visit_duration_for_visit_type भी देखें.

DurationLimit

वाहन के रास्ते की ज़्यादा से ज़्यादा अवधि तय करने वाली सीमा. यह हार्ड या सॉफ़्ट हो सकता है.

जब सॉफ़्ट लिमिट फ़ील्ड तय किया जाता है, तो सॉफ़्ट मैक्स थ्रेशोल्ड और उससे जुड़ी लागत, दोनों को एक साथ तय करना ज़रूरी होता है.

फ़ील्ड
max_duration

Duration

एक तय सीमा, जो अवधि को ज़्यादा से ज़्यादा max_duration तक सीमित करती है.

soft_max_duration

Duration

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

अगर soft_max_duration तय किया गया है, तो यह शून्य से कम नहीं होना चाहिए. अगर max_duration भी तय किया गया है, तो soft_max_duration की वैल्यू, max_duration की वैल्यू से कम होनी चाहिए.

quadratic_soft_max_duration

Duration

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

अगर quadratic_soft_max_duration सेट है, तो ये शर्तें पूरी होनी चाहिए:

  • यह शून्य या इससे ज़्यादा होना चाहिए.
  • max_duration के बारे में बताना ज़रूरी है.
  • quadratic_soft_max_duration की वैल्यू, max_duration से कम होनी चाहिए.
  • दोनों तारीखों के बीच एक दिन से ज़्यादा का अंतर नहीं होना चाहिए: max_duration - quadratic_soft_max_duration <= 86400 seconds
cost_per_hour_after_soft_max

double

soft_max_duration थ्रेशोल्ड का उल्लंघन होने पर, हर घंटे के हिसाब से लगने वाला शुल्क. अगर कॉल की अवधि थ्रेशोल्ड से कम है, तो कोई अतिरिक्त शुल्क नहीं लिया जाता. अगर कॉल की अवधि थ्रेशोल्ड से ज़्यादा है, तो अतिरिक्त शुल्क लिया जाता है. यह शुल्क, कॉल की अवधि के हिसाब से तय होता है:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

लागत, शून्य से कम नहीं होनी चाहिए.

cost_per_square_hour_after_quadratic_soft_max

double

quadratic_soft_max_duration थ्रेशोल्ड का उल्लंघन होने पर, हर स्क्वेयर घंटे के हिसाब से लगने वाली लागत.

अगर कॉल की अवधि थ्रेशोल्ड से कम है, तो अतिरिक्त शुल्क 0 होगा. अगर ऐसा नहीं है, तो कॉल की अवधि के हिसाब से शुल्क लिया जाएगा:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

लागत, शून्य से कम नहीं होनी चाहिए.

LoadLimit

इससे किसी वाहन पर लोड की जाने वाली चीज़ों की सीमा तय होती है. उदाहरण के लिए, "इस ट्रक में सिर्फ़ 3,500 कि॰ग्रा॰ तक का वज़न ले जाया जा सकता है". load_limits देखें.

फ़ील्ड
soft_max_load

int64

लोड की सॉफ़्ट लिमिट. cost_per_unit_above_soft_max देखें.

cost_per_unit_above_soft_max

double

अगर इस वाहन के रूट पर लोड कभी भी soft_max_load से ज़्यादा हो जाता है, तो लागत पर यह जुर्माना लागू होता है (हर वाहन के लिए सिर्फ़ एक बार): (लोड - soft_max_load) * cost_per_unit_above_soft_max. सभी लागतें जुड़ती हैं और Shipment.penalty_cost की तरह ही एक ही यूनिट में होनी चाहिए. सॉफ़्ट लिमिट सिर्फ़ उन टाइप पर तय की जा सकती हैं जो पूरे मॉडल में सिर्फ़ पिकअप या सिर्फ़ डिलीवरी पर लागू होते हैं.

start_load_interval

Interval

रूट की शुरुआत में, वाहन में लोड किए जाने वाले सामान की तय सीमा.

end_load_interval

Interval

रूट के आखिर में, वाहन के लिए स्वीकार किया जाने वाला लोड इंटरवल.

max_load

int64

लोड की ज़्यादा से ज़्यादा स्वीकार्य मात्रा.

cost_per_kilometer

LoadCost

इस वाहन के लिए, एक किलोमीटर तक एक यूनिट लोड ले जाने की लागत. इसका इस्तेमाल, ईंधन की खपत के लिए प्रॉक्सी के तौर पर किया जा सकता है: अगर लोड, वज़न (न्यूटन में) है, तो लोड*किलोमीटर में ऊर्जा का डाइमेंशन होता है.

एक्सपेरिमेंट के तौर पर उपलब्ध: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request पर जाएं.

cost_per_traveled_hour

LoadCost

इस वाहन के लिए, एक घंटे में एक यूनिट लोड के साथ यात्रा करने की लागत.

एक्सपेरिमेंट के तौर पर उपलब्ध: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request पर जाएं.

इंटरवल

लोड की जा सकने वाली रकम का इंटरवल.

फ़ील्ड
min

int64

कम से कम स्वीकार किया जाने वाला लोड. यह वैल्यू, 0 से ज़्यादा या इसके बराबर होनी चाहिए. अगर दोनों की वैल्यू दी गई है, तो min की वैल्यू, max की वैल्यू से कम या उसके बराबर होनी चाहिए.

max

int64

ज़्यादा से ज़्यादा स्वीकार किया जाने वाला लोड. यह वैल्यू, 0 से ज़्यादा या इसके बराबर होनी चाहिए. अगर इस एट्रिब्यूट की वैल्यू सबमिट नहीं की जाती है, तो इस मैसेज से ज़्यादा से ज़्यादा लोड पर कोई पाबंदी नहीं लगेगी. अगर दोनों एट्रिब्यूट की वैल्यू दी गई हैं, तो min की वैल्यू, max की वैल्यू से कम या उसके बराबर होनी चाहिए.

LoadCost

Transition के दौरान, लोड की एक यूनिट को मूव करने की लागत. किसी लोड के लिए, लागत को दो हिस्सों में बांटा जाता है:

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, load - load_threshold) * cost_per_unit_above_threshold

इस लागत के साथ, समाधानों में ज़्यादा मांग वाले ऑर्डर को पहले डिलीवर करने या ज़्यादा मांग वाले ऑर्डर को आखिर में पिकअप करने को प्राथमिकता दी जाती है. उदाहरण के लिए, अगर किसी वाहन में

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

इसका रूट start,pickup,pickup,delivery,delivery,end है. इसमें ये ट्रांज़िशन हैं:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

तो इस LoadCost की लागत (cost_below * load_below * kilometers + cost_above * load_above * kms) होगी

  • ट्रांज़िशन 0: 0.0
  • ट्रांज़िशन 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • ट्रांज़िशन 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • ट्रांज़िशन 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • ट्रांज़िशन 4: 0.0

इसलिए, इस रूट पर LoadCost 120.0 है.

हालांकि, अगर रूट की शुरुआत, पिकअप, डिलीवरी, पिकअप, डिलीवरी, और ट्रांज़िशन के साथ खत्म होती है, तो:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

तो इस LoadCost की लागत होगी

  • ट्रांज़िशन 0: 0.0
  • ट्रांज़िशन 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • ट्रांज़िशन 2: 0.0
  • ट्रांज़िशन 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • ट्रांज़िशन 4: 0.0

यहां, रूट पर LoadCost की वैल्यू 40.0 है.

LoadCost की वजह से, ज़्यादा ट्रांज़िशन वाले समाधानों की कीमत बढ़ जाती है.

एक्सपेरिमेंट के तौर पर उपलब्ध: ज़्यादा जानकारी के लिए, https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request पर जाएं.

फ़ील्ड
load_threshold

int64

लोड की वह मात्रा जिसके बाद, लोड की एक यूनिट को ले जाने की लागत, cost_per_unit_below_threshold से बदलकर cost_per_unit_above_threshold हो जाती है. यह 0 से ज़्यादा या इसके बराबर होनी चाहिए.

cost_per_unit_below_threshold

double

0 और थ्रेशोल्ड के बीच की हर यूनिट के लिए, लोड की एक यूनिट को मूव करने की लागत. वैल्यू सीमित होनी चाहिए और 0 से ज़्यादा या उसके बराबर होनी चाहिए.

cost_per_unit_above_threshold

double

थ्रेशोल्ड से ज़्यादा की हर यूनिट के लिए, लोड की एक यूनिट को मूव करने की लागत. अगर थ्रेशोल्ड = 0 है, तो यह हर यूनिट के लिए तय की गई लागत है. वैल्यू सीमित होनी चाहिए और 0 से ज़्यादा या उसके बराबर होनी चाहिए.

TravelMode

यात्रा के ऐसे मोड जिनका इस्तेमाल वाहन कर सकते हैं.

ये Google Maps Platform के Routes API में मौजूद यात्रा के मोड का सबसेट होने चाहिए. ज़्यादा जानकारी के लिए, यहां जाएं: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

ध्यान दें: WALKING के रास्ते बीटा वर्शन में हैं. ऐसा हो सकता है कि कभी-कभी इनमें साफ़ फ़ुटपाथ या पैदल चलने के रास्ते न दिखें. आपको अपने ऐप्लिकेशन में दिखाए जाने वाले पैदल चलने के सभी रास्तों के लिए, उपयोगकर्ता को यह चेतावनी दिखानी होगी.

Enums
TRAVEL_MODE_UNSPECIFIED यात्रा के मोड की जानकारी नहीं दी गई है. यह DRIVING के बराबर है.
DRIVING ड्राइविंग के लिए रास्ते के निर्देशों (कार, ...) के हिसाब से यात्रा का मोड.
WALKING पैदल रास्ते की जानकारी के लिए यात्रा का मोड.

UnloadingPolicy

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

अन्य शिपमेंट, unloading_policy से अलग, रास्ते में कहीं भी डिलीवर किए जा सकते हैं.

Enums
UNLOADING_POLICY_UNSPECIFIED अनलोडिंग की नीति के बारे में नहीं बताया गया है; डिलीवरी, उनसे जुड़े पिकअप के बाद ही होनी चाहिए.
LAST_IN_FIRST_OUT डिलीवरी, पिकअप के उल्टे क्रम में होनी चाहिए
FIRST_IN_FIRST_OUT डिलीवरी उसी क्रम में होनी चाहिए जिस क्रम में पिकअप किए गए हैं

VehicleFullness

VehicleFullness एक मेट्रिक है, जिससे यह पता चलता है कि वाहन कितना भरा हुआ है. हर VehicleFullness फ़ील्ड की वैल्यू 0 और 1 के बीच होती है. इसे कैप की गई मेट्रिक फ़ील्ड (जैसे, AggregatedMetrics.travel_distance_meters) और वाहन की क्षमता (जैसे, Vehicle.route_distance_limit) के अनुपात के तौर पर कैलकुलेट किया जाता है. हालांकि, ऐसा तब ही होता है, जब वाहन की क्षमता मौजूद हो. ऐसा न करने पर, फ़ुलनेस रेशियो सेट नहीं होता. अगर सीमा 0 है, तो फ़ील्ड को 1 पर सेट किया जाता है. ध्यान दें: जब किसी रूट पर ट्रैफ़िक की वजह से समस्याएं आती हैं, तो कुछ रॉ फ़ुलनेस रेशियो 1.0 से ज़्यादा हो सकते हैं. उदाहरण के लिए, वाहन अपनी तय दूरी की सीमा से ज़्यादा दूरी तय कर सकता है. ऐसे मामलों में, हम फ़ुलनेस वैल्यू को 1.0 पर कैप करते हैं.

फ़ील्ड
max_fullness

double

इस मैसेज में मौजूद अन्य सभी फ़ील्ड की ज़्यादा से ज़्यादा संख्या.

distance

double

AggregatedMetrics.travel_distance_meters और Vehicle.route_distance_limit के बीच का अनुपात. अगर Vehicle.route_distance_limit को सेट नहीं किया गया है, तो यह फ़ील्ड सेट नहीं किया जाएगा.

travel_duration

double

[AggregatedMetrics.travel_duration_seconds][] और Vehicle.travel_duration_limit के बीच का अनुपात. अगर Vehicle.travel_duration_limit को सेट नहीं किया गया है, तो यह फ़ील्ड भी सेट नहीं किया जाएगा.

active_duration

double

[AggregatedMetrics.total_duration_seconds][] और Vehicle.route_duration_limit के बीच का अनुपात. अगर Vehicle.route_duration_limit को सेट नहीं किया गया है, तो यह फ़ील्ड सेट नहीं किया जाएगा.

max_load

double

[AggregatedMetrics.max_load][] के सभी टाइप और उनसे जुड़े Vehicle.load_limits के बीच का ज़्यादा से ज़्यादा अनुपात. अगर सभी Vehicle.load_limits फ़ील्ड सेट नहीं हैं, तो यह फ़ील्ड भी सेट नहीं होगा.

active_span

double

किसी वाहन के लिए, (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) का अनुपात. अगर डिनॉमिनेटर मौजूद नहीं है, तो इसके बजाय (ShipmentModel.global_end_time - ShipmentModel.global_start_time) का इस्तेमाल किया जाता है.

वेपॉइंट

यह वेपॉइंट को एनकैप्सुलेट करता है. वेपॉइंट, VisitRequest के पहुंचने और रवाना होने की जगहों के साथ-साथ, वाहनों के शुरू और खत्म होने की जगहों को मार्क करते हैं.

फ़ील्ड
side_of_road

bool

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

vehicle_stopover

bool

इससे पता चलता है कि वेपॉइंट, वाहनों के रुकने के लिए है. इसका मकसद, यात्रियों को पिक अप या ड्रॉप करना है. यह विकल्प सिर्फ़ 'DRIVING' ट्रैवल मोड के लिए काम करता है. साथ ही, 'location_type' की वैल्यू 'location' होने पर ही काम करता है.

एक्सपेरिमेंट के तौर पर: इस फ़ील्ड के काम करने के तरीके या मौजूदगी में आने वाले समय में बदलाव हो सकता है.

यूनियन फ़ील्ड location_type. किसी जगह को दिखाने के अलग-अलग तरीके. location_type इनमें से सिर्फ़ एक हो सकता है:
location

Location

भौगोलिक निर्देशांकों का इस्तेमाल करके तय की गई जगह. इसमें वैकल्पिक हेडिंग भी शामिल है.

place_id

string

वेपॉइंट से जुड़ी लोकप्रिय जगह का आईडी.

किसी VisitRequest के लिए, पहुंचने या जाने की जगह की जानकारी देने के लिए, जगह के आईडी का इस्तेमाल करें. इसके लिए, जगह के ऐसे आईडी का इस्तेमाल करें जो उस जगह पर नेविगेट करने के लिए, LatLng की जगह की जानकारी दे सके. उदाहरण के लिए, किसी इमारत को दिखाने वाली जगह का आईडी सही है, लेकिन किसी सड़क को दिखाने वाली जगह का आईडी इस्तेमाल करने का सुझाव नहीं दिया जाता.