Package google.maps.routeoptimization.v1

الفهرس

RouteOptimization

خدمة لتحسين الجولات بالمركبات

صلاحية أنواع معيّنة من الحقول:

  • google.protobuf.Timestamp
    • الأوقات بتوقيت Unix: ثانية منذ 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" كمجموعة.

وهذه الطريقة هي "عملية تشغيل طويلة" (LRO). تتم قراءة/كتابة مدخلات التحسين (OptimizeToursRequest رسالة) والمخرجات (OptimizeToursResponse رسالة) من/إلى Cloud Storage بتنسيق محدّد من جانب المستخدم. مثل طريقة OptimizeTours، يحتوي كل OptimizeToursRequest على ShipmentModel ويعرض OptimizeToursResponse يحتوي على ShipmentRoute، وهي مجموعة من المسارات التي ستقطعها المركبات بأقل تكلفة إجمالية.

يمكن للمستخدم استطلاع رأي operations.get للتحقُّق من حالة LRO:

إذا كان حقل done في LRO خطأ، يعني ذلك أنّ هناك طلبًا واحدًا على الأقل لا يزال قيد المعالجة. قد تكون الطلبات الأخرى قد اكتملت بنجاح وتتوفّر نتائجها في خدمة GCS.

إذا كان حقل LRO done صحيحًا، يعني ذلك أنّه تمت معالجة جميع الطلبات. وستُتاح نتائج أي طلبات تمت معالجتها بنجاح في فريق GCS. ولن تكون نتائج أي طلبات تعذّر تنفيذها متاحة في GCS. إذا تم ضبط حقل error في LRO، سيحتوي على الخطأ من أحد الطلبات التي تعذّر إكمالها.

نطاقات التفويض

يجب توفير نطاق OAuth التالي:

  • https://www.googleapis.com/auth/cloud-platform
أذونات "إدارة الهوية وإمكانية الوصول"

يتطلب هذا الإجراء الحصول على إذن إدارة الهوية وإمكانية الوصول التالي في مورد parent:

  • routeoptimization.operations.create

ولمزيد من المعلومات، اطّلِع على مستندات إدارة الهوية وإمكانية الوصول.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

لإرسال OptimizeToursRequest تحتوي على ShipmentModel وعرض OptimizeToursResponse تحتوي على ShipmentRoute، وهي مجموعة من المسارات التي يمكن للمركبات تنفيذها مع تقليل التكلفة الإجمالية.

يتكوّن نموذج ShipmentModel بشكلٍ أساسي من Shipment التي يجب تنفيذها وVehicles التي يمكن استخدامها لنقل Shipment. وتعيّن ShipmentRoute عناصر Shipment إلى Vehicle. وعلى وجه التحديد، يخصّصون سلسلة من Visit لكل مركبة، حيث تتوافق السمة Visit مع سمة VisitRequest، وهي عملية استلام أو توصيل لـ Shipment.

والهدف من ذلك هو توفير تخصيص ShipmentRoute إلى Vehicle، ما يقلّل من إجمالي التكلفة حيث تكون التكلفة محددة في ShipmentModel.

نطاقات الأذونات

يجب توفير نطاق OAuth التالي:

  • https://www.googleapis.com/auth/cloud-platform
أذونات "إدارة الهوية وإمكانية الوصول"

يجب الحصول على إذن IAM التالي في مورد "parent":

  • routeoptimization.locations.use

ولمزيد من المعلومات، اطّلِع على مستندات إدارة الهوية وإمكانية الوصول.

AggregatedMetrics

المقاييس المجمّعة لـ ShipmentRoute (resp. لـ OptimizeToursResponse على جميع عناصر Transition و/أو Visit (الاستجابة لجميع ShipmentRoute).

الحقول
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 بالكامل (resp. ShipmentRoute.metrics.max_loads

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 يتم إرجاعها في "عملية التشغيل الطويل" بعد اكتمال العملية.

BreakRule

قواعد لإنشاء استراحة زمنية للمركبة (مثل استراحات الغداء) الفاصل هو فترة زمنية متصلة تظل خلالها المركبة في وضع السكون في موقعها الحالي ولا يمكنها إجراء أي زيارة. قد يحدث استراحة:

  • أثناء السفر بين زيارتين (ويشمل ذلك الوقت قبل الزيارة أو بعدها مباشرة، ولكن ليس في منتصف الزيارة)، وفي هذه الحالة، يمتد وقت النقل المقابل بين الزيارات
  • أو قبل بدء تشغيل المركبة (قد لا تبدأ المركبة في منتصف الاستراحة)، وفي هذه الحالة لا يؤثر ذلك في وقت بدء المركبة.
  • أو بعد انتهاء المركبة (كما هو الحال، مع وقت انتهاء المركبة).
الحقول
break_requests[]

BreakRequest

سلسلة الفواصل اطّلِع على رسالة BreakRequest.

frequency_constraints[]

FrequencyConstraint

قد تنطبق عدة أنواع من FrequencyConstraint. ويجب أن تستوفي جميعها معايير BreakRequest لهذا BreakRule. يمكنك الاطّلاع على 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

تنسيقات البيانات لملفات الإدخال والمخرجات

عمليات التعداد
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

مطلوب. معرِّف الموارد المنتظم (URI) لخدمة Google Cloud Storage

GcsSource

موقع Google Cloud Storage الذي ستتم قراءة ملف الإدخال منه

الحقول
uri

string

مطلوب. معرّف الموارد المنتظم (URI) لعنصر Google Cloud Storage بالتنسيق gs://bucket/path/to/object.

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.

يتم ربط فهرس المركبات بالطريقة نفسها المتّبعة مع ShipmentRoute.vehicle_index، في حال كانت قيمة interpret_injected_solutions_using_labels صحيحة (راجِع التعليق 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، أضِف relaxations بقيمة level نفسها: أحدهما تم ضبط 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" على الإطلاق لهذا المسار.

المستوى

تعبِّر عن مستويات تخفيف القيد المختلفة، والتي يتم تطبيقها على زيارة وتلك التي تليها عندما تستوفي شروط الحدّ.

التعداد أدناه مرتّبًا على زيادة الاسترخاء.

عمليات التعداد
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 عنوانًا للشرق المستحق، وما إلى ذلك.

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/2011، لن يؤدي ذلك إلا إلى تعبئة الخطوط المتعددة للمسارات غير الفارغة ويتطلب ضبط سياسة populate_polylines.

قد تكون الحقول route_polyline للمسارات التي تم تمريرها غير متسقة مع المسار transitions.

يجب عدم استخدام هذا الحقل مع injected_first_solution_routes أو injected_solution_constraint.

ولا يؤثر Shipment.ignore وVehicle.ignore في هذا السلوك. تظل الخطوط المتعددة مملوءة بين جميع الزيارات في جميع المسارات غير الفارغة بغض النظر عما إذا تم تجاهل الشحنات أو المركبات ذات الصلة أم لا.

interpret_injected_solutions_using_labels

bool

إذا كانت القيمة هي true:

  • استخدام ShipmentRoute.vehicle_label بدلاً من vehicle_index لمطابقة المسارات في الحل الذي تم حقنه مع المركبات الواردة في الطلب إعادة استخدام ربط ShipmentRoute.vehicle_index الأصلي بـ ShipmentRoute.vehicle_index الجديد لتعديل ConstraintRelaxation.vehicle_indices إذا لم يكن فارغًا، ولكن يجب أن تكون عملية الربط واضحة (أي يجب ألا تتشارك ShipmentRoute عدة عناصر vehicle_index الأصلية نفسها).
  • استخدام ShipmentRoute.Visit.shipment_label بدلاً من shipment_index لمطابقة الزيارات في الحل الذي تم حقنه مع الشحنات الواردة في الطلب
  • تستخدم SkippedShipment.label بدلاً من SkippedShipment.index لمطابقة الشحنات التي تم تخطّيها في الحلّ الذي تم حقنه مع شحنات الطلبات.

ينطبق هذا التفسير على الحقول injected_first_solution_routes وinjected_solution_constraint وrefresh_details_routes. ويمكن استخدامه عندما تتغيّر مؤشرات الشحنات أو المركبات في الطلب منذ إنشاء الحلّ، ربما بسبب إزالة الشحنات أو المركبات من الطلب أو إضافتها إليه.

إذا كانت القيمة هي true، يجب أن تظهر التصنيفات في الفئات التالية مرة واحدة كحدّ أقصى في فئتها:

إذا لم يكن vehicle_label في الحلّ المُدرَج مطابقًا لمركبة طلب، تتم إزالة المسار المقابل من الحلّ مع زياراته. في حال عدم توافق shipment_label في الحل الذي تم إدخاله مع عملية شحن الطلب، تتم إزالة الزيارة المقابلة من الحلّ. إذا كانت السمة SkippedShipment.label الموجودة في الحل الذي تم إدخاله لا تتوافق مع عملية شحن الطلب، تتم إزالة SkippedShipment من الحلّ.

قد تؤدي إزالة زيارات المسار أو مسارات كاملة من حلّ تمّت حقنه إلى التأثير في القيود الضمنية، ما قد يؤدي إلى تغيير في الحلّ أو أخطاء في التحقّق أو عدم القابلية للتنفيذ.

ملاحظة: يجب أن يتأكد المتصل من أن كل Vehicle.label (رد) 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

وفي حال ضبط هذه السياسة، يمكن أن يتم تحديد موعد نهائي للطلب (راجِع https://grpc.io/blog/deadlines) يصل إلى 60 دقيقة. وبخلاف ذلك، يبلغ الحد الأقصى للموعد النهائي 30 دقيقة فقط. وتجدر الإشارة إلى أنّ الطلبات طويلة الأجل تنطوي على خطر أكبر بكثير (ولكنّه لا يزال بسيطًا).

use_geodesic_distances

bool

في حال الضبط على "صحيح"، سيتم احتساب مسافات السفر باستخدام المسافات الجيوديسية بدلاً من المسافات في "خرائط Google"، وسيتم احتساب مدّة التنقّل باستخدام المسافات الجيوديسية مع السرعة التي تحدّدها 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

وضع يحدد سلوك البحث، والمقايضة في وقت الاستجابة مقابل جودة الحل. يتم فرض الموعد النهائي للطلب العام في جميع الأوضاع.

عمليات التعداد
SEARCH_MODE_UNSPECIFIED وضع بحث غير محدَّد، يعادل RETURN_FAST.
RETURN_FAST إيقاف البحث بعد العثور على أول حل جيد.
CONSUME_ALL_AVAILABLE_TIME قضاء كل الوقت المتاح للبحث عن حلول أفضل

SolvingMode

تحدِّد هذه السياسة كيفية تعامل أداة الحلّ مع الطلب. في جميع وسائل النقل باستثناء VALIDATE_ONLY، إذا كان الطلب غير صالح، ستظهر لك رسالة الخطأ INVALID_REQUEST. يمكنك الاطّلاع على max_validation_errors للحدّ من عدد الأخطاء المعروضة.

عمليات التعداد
DEFAULT_SOLVE حلّ النموذج قد يتم إصدار التحذيرات في [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.Verifyation_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 فارغًا.

ملاحظة مهمّة: لا يتم إرجاع جميع الشحنات غير المجدية إلى هنا، بل يتم فقط إرجاع الشحنات التي تبيّن أنّها غير قابلة للتنفيذ أثناء المعالجة المُسبقة.

OptimizeToursResponse

الاستجابة بعد حل مشكلة تحسين الجولة التي تحتوي على المسارات التي تتبعها كل مركبة، والشحنات التي تم تخطيها والتكلفة الإجمالية للحل.

الحقول
routes[]

ShipmentRoute

المسارات المحسوبة لكل مركبة ويتجاوب المسار i-th مع المركبة i-th في النموذج.

request_label

string

نسخة من OptimizeToursRequest.label، إذا تم تحديد تصنيف في الطلب

skipped_shipments[]

SkippedShipment

قائمة بكل الشحنات التي تم تخطّيها

validation_errors[]

OptimizeToursValidationError

قائمة بجميع أخطاء التحقّق من الصحة التي تمكّنا من اكتشافها بشكلٍ مستقل. عرض "MULTIPLE ERRORS" شرح لرسالة OptimizeToursValidationError. بدلاً من الأخطاء، سيتضمّن ذلك تحذيرات في حالة solving_mode هي DEFAULT_SOLVE.

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"، والقيم هي التكلفة الإجمالية التي تم إنشاؤها بواسطة حقل التكلفة المقابل، ويتم تجميعها على مستوى الحلّ بأكمله. بمعنى آخر، تكون التكاليف ["model.shipments.pickups.cost"] هي مجموع كل تكاليف الاستلام بدلاً من الحلّ. يتم الإبلاغ عن جميع التكاليف المحدّدة في النموذج هنا بالتفصيل، باستثناء التكاليف المرتبطة بسمات TransitionAttributes التي يتم الإبلاغ عنها بطريقة مجمّعة فقط اعتبارًا من 2022/2022.

total_cost

double

التكلفة الإجمالية للحلّ مجموع كل القيم في خريطة التكاليف.

OptimizeToursValidationError

تصف هذه السمة خطأً أو تحذيرًا حدث عند التحقق من صحة OptimizeToursRequest.

الحقول
code

int32

يتم تحديد خطأ في عملية التحقّق من خلال الزوج (code وdisplay_name) اللذَين متوفّران دائمًا.

توفّر الحقول الأخرى (أدناه) المزيد من السياق حول الخطأ.

أخطاء متعددة: عند حدوث أخطاء متعددة، تحاول عملية التحقق إخراج العديد منها. تمامًا مثل المحول البرمجي، هذه عملية غير كاملة. ستكون بعض أخطاء التحقّق "فادحة"، ما يعني أنّها توقِف عملية التحقّق بأكملها. ينطبق هذا الأمر على display_name="UNSPECIFIED" أخطاء من بين أخطاء أخرى. وقد يتسبب بعضها في تخطي عملية التحقق للأخطاء الأخرى.

الاستقرار: يجب أن يكون code وdisplay_name ثابتَين جدًا. ولكن قد تظهر الرموز والأسماء المعروضة الجديدة بمرور الوقت، ما قد يؤدي إلى ظهور زوج مختلف (code، display_name) لطلب معيّن (غير صالح) لأنّ الخطأ الجديد أخفى الخطأ القديم (راجِع "الأخطاء المتعددة").

مرجع: قائمة بجميع الأزواج (الرمز، الاسم):

  • UNSPECIFIED = 0،
  • RealtimeATION_')}>_ERROR = 10، تعذّر إكمال عملية التحقّق قبل الموعد النهائي.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_preferences_SOLVING_mode = 1201؛
    • REQUEST_OPTIONS_مرح_MAX_REASONATION_ERRORS = 1203؛
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GeoDESIC_METERS_PER_COUNTRY_TOO_SMALL = 1205؛
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_COUNTRY = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207؛
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_OPTIONS_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_enabled_WITHOUT_GLOBAL_START_TIME = 1214،
    • REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_mode_غير = 1216؛
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_adwordspolicy_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20،
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005؛
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006،
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPAcity_TYPES = 2201،
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_ بعد_GLOBAL_END_TIME = 2204،
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_Long = 2205؛
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24،
  • TAG_ERROR = 26،
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_ بهدف_START_TIME = 2800،
    • TIME_WINDOW_ACTIVE_END_TIME = 2801،
    • TIME_WINDOW_ مؤسسة_SOFT_START_TIME = 2802،
    • TIME_WINDOW_ACTIVE_SOFT_END_TIME = 2803،
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_after_END_TIME = 2805،
    • TIME_WINDOW_TABLE_COST_PER_AREA_BEFORE_SOFT_START_TIME = 2806؛
    • ‫TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_after_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809؛
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810؛
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_after_SOFT_END_TIME = 2811؛
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812؛
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2819;
    • TIME_WINDOW_SOFT_END_TIME_OUTSIDE_GLOBAL_TIME_WINDOW = 2820;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817؛
    • TIME_WINDOW_COST_after_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818؛
    • TRANSITION_ATTRIBUTES_ERROR = 30،
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_الإعدادات_COST_PER_KILOMETER = 3001،
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002،
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003،
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004،
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_Destination_TAGS = 3006،
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_refresh_DURATION_NEGATIVE_OR_NAN = 3008،
    • TRANSITION_ATTRIBUTES_refresh_DURATION_EXCEEDS_GLOBAL_DURATION = 3009،
  • AMOUNT_ERROR = 31،
    • AMOUNT_NEGATIVE_VALUE = 3100،
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_الإعدادات_COST_ABOVE_SOFT_MAX = 3303
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305؛
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306،
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307؛
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308،
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309،
  • INTERVAL_ERROR = 34،
    • INTERVAL_MIN_EXCEEDS_MAX = 3401،
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403،
    • INTERVAL_MIN_EXCEEDS_CAPAcity = 3404،
    • INTERVAL_MAX_EXCEEDS_CAPAcity = 3405،
  • DISTANCE_LIMIT_ERROR = 36،
    • ‫DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_after_SOFT_MAX = 3602،
    • DISTANCE_LIMIT_COST_after_SOFT_MAX_WITHOUT_SOFT_MAX = 3603؛
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • ‫DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38،
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800،
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801،
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
    • DURATION_LIMIT_COST_after_SOFT_MAX_WITHOUT_SOFT_MAX = 3804؛
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805،
    • DURATION_LIMIT_ACTIVE_COST_after_QUADRATIC_SOFT_MAX = 3806؛
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_AREA = 3807؛
    • DURATION_LIMIT_COST_PER_SQUARE_AREA_WITHOUT_QUADRATIC_SOFT_MAX = 3808؛
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809؛
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811؛
    • DURATION_LIMIT_ توفّر_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812؛
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813؛
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3815;
  • SHIPMENT_ERROR = 40،
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014،
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_مرح = 4015،
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016،
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002،
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003؛
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004،
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005،
    • SHIPMENT_ACTIVE_PENALTY_COST = 4006؛
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007،
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008،
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_size_WITHOUT_INDEX = 4009،
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_size_WITH_INDEX = 4010،
    • SHIPMENT_INSERT_COST_FOR_VEHICLE = 4011،
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012،
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013،
  • ‫VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202،
    • ‫VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204،
    • VEHICLE_EMPTY_END_TAG = 4205،
    • VEHICLE_DUPLICATE_END_TAG = 4206،
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207،
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208؛
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209؛
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210،
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211،
    • ‫VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213،
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214،
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215،
    • VEHICLE_IGNORED_WITH_used_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_PURCHASE_COST_PER_KILOMETER = 4217،
    • VEHICLE_PURCHASE_COST_PER_hour = 4218،
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_مرح_FIXED_COST = 4220؛
    • VEHICLE_CUSTOM_TRAVEL_DURATION_MULTIPLE = 4221،
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223،
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224،
    • VEHICLE_MIN_DURATION_LOWER_THAN_DURATION_LIMIT = 4222،
  • VISIT_REQUEST_ERROR = 44،
    • VISIT_REQUEST_EMPTY_TAG = 4400،
    • VISIT_REQUEST_DUPLICATE_TAG = 4401،
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404،
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405،
  • PRECEDENCE_ERROR = 46،
    • PRECEDENCE_القواعد_MISSING_FIRST_INDEX = 4600،
    • ‫PRECEDENCE_RULE_MISSING_SECOND_INDEX = 4601;
    • PRECEDENCE_القواعد_FIRST_INDEX_OUT_OF_BOUNDS = 4602،
    • PRECEDENCE_ ثلاثة_FIRST_OUT_OF_BOUNDS = 4603،
    • PRECEDENCE_القواعد_DUPLICATE_INDEX = 4604،
    • PRECEDENCE_القواعد_INEXISTENT_FIRST_VISIT_REQUEST = 4605،
    • PRECEDENCE_القواعد_INEXISTENT_COUNTRY_VISIT_REQUEST = 4606؛
  • BREAK_ERROR = 48،
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801،
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802،
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805،
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806،
    • BREAK_REQUEST_LATEST_END_TIME_after_GLOBAL_END_TIME = 4807،
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808،
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809،
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811،
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812؛
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813،
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814،
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50،
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002،
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005،
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52،
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001،
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004،
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006،
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010،
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011،
  • VEHICLE_OPERATOR_ERROR = 54،
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • ‫VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402،
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403،
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404،
  • DURATION_SECONDS_MATRIX_ERROR = 56،
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
  • تحذير = 9،
    • WARNING_INJECTED_FIRST_SOLUTION = 90;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_SHIPMENTS_Remove = 9000;
      • WARNING_INJECTED_FIRST_SOLUTION_INFEASIBLE_ بعد_GET تجربة_TRAVEL_TIMES = 9001،
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

سلسلة تصف الخطأ ويمكن لشخص عادي قراءتها هناك عملية ربط بنسبة 1:1 بين code وerror_message (عندما يكون الرمز != "UNSPECIFIED").

الاستقرار: غير ثابت: قد تتغير رسالة الخطأ المرتبطة بعلامة code معيّنة (نأمل أن يتم توضيحها) بمرور الوقت. يُرجى الاعتماد على display_name وcode بدلاً من ذلك.

offending_values

string

قد تحتوي على قيم الحقول. لا تتوفّر هذه الميزة دائمًا. يجب ألا تعتمد عليها مطلقًا وأن تستخدمها فقط لتصحيح أخطاء النموذج اليدوي.

مرجع حقل

تُحدِّد سياقًا لخطأ التحقّق. يشير FieldReference دائمًا إلى حقل معيّن في هذا الملف ويتبع البنية الهرمية نفسها. على سبيل المثال، قد نحدِّد العنصر رقم 2 من start_time_windows للمركبة رقم 5 باستخدام:

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

ومع ذلك، نحذف كيانات المستوى الأعلى، مثل OptimizeToursRequest أو ShipmentModel لتجنُّب ازدحام الرسالة.

الحقول
name

string

اسم الحقل، على سبيل المثال: "المركبات".

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

يشير هذا المصطلح إلى مجموعة من الشروط الاختيارية التي يجب استيفاؤها عند حساب مسارات المركبات. يشبه هذا الإجراء العنصر RouteModifiers في واجهة برمجة التطبيقات المفضّلة لمسارات "منصّة خرائط Google". يُرجى الاطّلاع على: 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

مجموعة المركبات التي يمكنها تنفيذ هذه الشحنة وإذا كانت فارغة، قد تتمكّن جميع المركبات من أدائها. يتم توفير المركبات من خلال الفهرس في قائمة "vehicles" الخاصة بـ "ShipmentModel".

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

تحدّد هذه السمة الحد الأقصى لوقت الانتقال المطلق مقارنةً بأقصر مسار بدءًا من استلام الطلب إلى توصيله. وفي حال تحديدها، يجب أن تكون قيمة غير سالبة، وأن تحتوي الشحنة على الأقل على استلام الطلبات وتوصيلها.

على سبيل المثال، يجب ألا تكون أقصر وقت ممكن للانتقال مباشرةً من خيار الاستلام المحدّد إلى خيار التسليم المحدَّد. بعد ذلك، يفرض الإعداد pickup_to_delivery_absolute_detour_limit ما يلي:

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

في حال تحديد الحدود النسبية والمطلقة في الشحنة نفسها، يتم استخدام الحدّ الأكثر تقييدًا لكلّ زوج من عمليات الاستلام/التسليم المحتملة. اعتبارًا من 2017/2010، لا تتوفّر الإحالات الناجحة إلا عندما لا تعتمد مُدد السفر على المركبات.

pickup_to_delivery_time_limit

Duration

تُحدِّد الحد الأقصى لمدة الفترة من بدء عملية الاستلام إلى بدء عملية تسليم الشحنة. في حال تحديده، يجب أن يكون موجبًا، ويجب أن تحتوي الشحنة على عملية استلام وتسليم واحدة على الأقل. ولا يعتمد ذلك على البدائل التي يتم اختيارها للاستلام والتسليم، ولا على سرعة المركبة. يمكن تحديد ذلك جنبًا إلى جنب مع الحد الأقصى لقيود التحويل: سيراعي الحل كلتا المواصفتين.

shipment_type

string

سلسلة غير فارغة تحدد "النوع" لهذه الشحنة. يمكن استخدام هذه الميزة لتحديد حالات عدم التوافق أو المتطلبات بين shipment_types (راجِع shipment_type_incompatibilities وshipment_type_requirements في ShipmentModel).

تختلف عن قيمة visit_types المحدّدة لزيارة واحدة: تتشارك كلّ عمليات الاستلام أو التسليم التي تنتمي إلى الشحنة نفسها سمة shipment_type نفسها.

label

string

تحدّد هذه السمة تصنيفًا لهذه الشحنة. تم الإبلاغ عن هذا التصنيف في الرد في shipment_label من ShipmentRoute.Visit المقابلة.

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

تحدّد هذه السمة الحد الأقصى لمدة التنقّل النسبية مقارنةً بأقصر مسار بدءًا من استلام الطلب إلى التسليم. وفي حال تحديدها، يجب أن تكون قيمة غير سالبة، وأن تحتوي الشحنة على الأقل على استلام الطلبات وتوصيلها.

على سبيل المثال، يجب ألا تكون أقصر وقت ممكن للانتقال مباشرةً من خيار الاستلام المحدّد إلى خيار التسليم المحدَّد. بعد ذلك، يفرض ضبط pickup_to_delivery_relative_detour_limit ما يلي:

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

في حال تحديد الحدود النسبية والمطلقة على الشحنة نفسها، يتم استخدام الحدّ الأكثر تقييدًا لكل زوج من المنتجات لاستلام الطلب أو توصيله. اعتبارًا من 2017/2010، لا تتوفّر الإحالات الناجحة إلا عندما لا تعتمد مُدد السفر على المركبات.

تحميل

عند إجراء زيارة، قد تتم إضافة مبلغ محدّد مسبقًا إلى حمولة المركبة إذا كانت عبارة عن شراء من المركبة، أو طرحه إذا كانت عبارة عن عملية توصيل. وتحدِّد هذه الرسالة هذا المبلغ. يمكنك الاطّلاع على 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، إلا أنّه لا ينطبق إلا على هذا VisitRequest بدلاً من Shipment بالكامل. تتم إضافة الطلبات المدرَجة هنا إلى الطلبات المدرَجة في Shipment.load_demands.

visit_types[]

string

تحدّد هذه السمة أنواع الزيارة. ويمكن استخدام ذلك لتخصيص الوقت الإضافي اللازم لإتمام هذه الزيارة في مركبة (اطّلع على Vehicle.extra_visit_duration_for_visit_type).

يمكن أن يظهر النوع مرة واحدة فقط.

label

string

تُحدِّد تصنيفًا لهذا VisitRequest. تم الإبلاغ عن هذا التصنيف في الردّ على أنّه visit_label في ShipmentRoute.Visit المقابل.

ShipmentModel

يحتوي نموذج الشحنة على مجموعة من الشحنات التي يجب إجراؤها بواسطة مجموعة من المركبات، مع تقليل التكلفة الإجمالية، وهي مجموع:

  • تكلفة توجيه المركبات (مجموع التكلفة لكل الوقت الإجمالي والتكلفة لكل مدة الرحلة والتكلفة الثابتة على جميع المركبات).
  • عقوبات الشحن غير المُنفَّذة.
  • تكلفة المدة العالمية للشحنات
الحقول
shipments[]

Shipment

مجموعة الشحنات التي يجب إجراؤها في النموذج

vehicles[]

Vehicle

مجموعة من المركبات التي يمكن استخدامها لإجراء الزيارات

global_start_time

Timestamp

وقت البدء والانتهاء العام للنموذج: لا يمكن اعتبار الوقت خارج هذا النطاق صالحًا.

يجب أن تكون الفترة الزمنية للنموذج أقل من سنة، أي يجب أن تكون الفترة الزمنية بين global_end_time وglobal_start_time ضمن 31536000 ثانية لكل منهما.

عند استخدام حقول cost_per_*hour، قد تحتاج إلى ضبط هذه النافذة على فاصل زمني أصغر لتحسين الأداء (على سبيل المثال، في حال وضع نموذج ليوم واحد، يجب ضبط الحدود الزمنية العالمية على ذلك اليوم). في حال عدم ضبطها، يتم استخدام 00:00:00 بالتوقيت العالمي المتّفق عليه، 1 كانون الثاني (يناير) 1970 (أي الثواني: 0، النانو ثوانٍ: 0) كقيمة تلقائية.

global_end_time

Timestamp

في حال ترك السياسة بدون ضبط، سيتم استخدام يوم 1 كانون الثاني (يناير) 1971 (أي الثواني: 31536000، nanos: 0) وفقًا بالتوقيت العالمي المنسّق (UTC) كإعداد تلقائي.

global_duration_cost_per_hour

double

"المدة الشاملة" من الخطة الإجمالية هو الفرق بين أقرب وقت بدء فعلي وآخر وقت انتهاء فعال لجميع المركبات. ويمكن للمستخدمين تحديد تكلفة في الساعة لهذه الكمية لمحاولة تحسين الأداء من أجل إكمال أقرب مهمة مثلاً. يجب أن تكون هذه التكلفة بالوحدة نفسها التي تستخدمها Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

لتحديد مصفوفات المدة والمسافة المستخدمة في النموذج. إذا كان هذا الحقل فارغًا، سيتم استخدام "خرائط Google" أو المسافات الجيوديسية بدلاً من ذلك، استنادًا إلى قيمة الحقل use_geodesic_distances. وإذا لم يكن فارغًا، لا يمكن أن يكون use_geodesic_distances صحيحًا ولا يمكن أن يكون duration_distance_matrix_src_tags أو duration_distance_matrix_dst_tags فارغَين.

أمثلة على استخدام هذه الكلمة في جملة:

  • يوجد موقعان: locA وlocB.
  • مركبة واحدة تبدأ مسارها عند locA وتنتهي عند locA.
  • طلب زيارة لاستلام واحد في الموقع الجغرافي
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، باستخدام مصفوفة "Fast" (سريعة)
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها عند الموقع الجغرافي وتنتهي عند تحديد الموقع الجغرافي B{2/}، باستخدام المصفوفة "بسرعة".
  • هناك طلب زيارة لاستلام واحد في locC.
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)) مدة (المسافة) لرحلة السفر من الزيارات ذات العلامة duration_distance_matrix_src_tags(j) إلى الزيارات ذات العلامة duration_distance_matrix_dst_tags(k) في المصفوفة 1.

تتوافق العلامات مع 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.

PrecedenceRule

قاعدة الأسبقية بين حدثَين (كلّ حدث هو استلام الشحنة أو تسليمها): "الثانية" يجب أن يبدأ الحدث لمدة offset_duration على الأقل بعد "الأول" بدأت.

يمكن أن تشير عدة أولويات إلى الأحداث نفسها (أو ذات الصلة)، على سبيل المثال: "يتم استلام الطلب (ب) بعد تسليم الطلب (أ)" و"يحدث استلام C بعد استلام B".

بالإضافة إلى ذلك، لا تسري الأسبقية إلا عند تنفيذ الشحنتين ويتم تجاهلهما.

الحقول
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

أخيرًا، إليك كيفية ترتيب TRAVEL وBREAKS وDELAY وWAIT أثناء الانتقال.

  • لا تتداخل.
  • تجدر الإشارة إلى أنّ مدة التأخير فريدة ويجب أن تكون فترة زمنية متجاورة قبل الزيارة التالية (أو نهاية المركبة) مباشرةً. وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت البدء والانتهاء.
  • الفواصل الزمنية هي فترات زمنية متجاورة وغير متداخلة. يحدِّد الردّ وقت بدء كل استراحة ومدتها.
  • تُعد TRAVEL وWAIT "متوقعين": يمكن مقاطعتهما عدة مرات أثناء هذه المرحلة الانتقالية. يمكن للعملاء افتراض أن السفر يحدث "في أقرب وقت ممكن" وأن "الانتظار" يملأ الوقت المتبقي.

مثال (معقد):

                               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

تسلسل مرتب من الزيارات يمثل مسارًا. الزيارات[i] هي الزيارة الأولى في المسار. إذا كان هذا الحقل فارغًا، سيُعتبر المركبة غير مستخدَمة.

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)

من المحتمل أن تحدث الوصول في وقت Next_visit بعد الفترة الزمنية الحالية، وذلك بسبب الزيادة المقدّرة في وقت السفر بمقدار travel_duration(previous_visit, next_visit) بسبب عدد الزيارات. وقد يتداخل وقت الاستراحة أيضًا مع وقت الزيارة بسبب زيادة تقديرات وقت التنقّل والقيود المفروضة على وقت الزيارة أو وقت الاستراحة.

route_polyline

EncodedPolyline

تمثيل الخطوط المتعددة المشفر للمسار. تتم تعبئة هذا الحقل فقط عند ضبط OptimizeToursRequest.populate_polylines على "صحيح".

breaks[]

Break

فترات الاستراحة المُجدوَلة للمركبة التي تنفّذ هذا المسار يمثّل تسلسل breaks فواصل زمنية، يبدأ كلّ منها عند start_time المناظر ويستمر لمدة duration ثانية.

metrics

AggregatedMetrics

مقاييس المدة والمسافة والحمولة لهذا المسار ويتم جمع حقول AggregatedMetrics في ShipmentRoute.transitions أو ShipmentRoute.visits بالكامل، بناءً على السياق.

route_costs

map<string, double>

تكلفة المسار، مقسَّمة حسب حقول الطلب المتعلقة بالتكلفة. وتمثل المفاتيح مسارات أولية بالنسبة إلى إدخال OptimizeToursRequest، على سبيل المثال: "model.shipments.pickups.cost"، والقيم هي إجمالي التكلفة الناتجة عن حقل التكلفة المقابل، والتي يتم تجميعها على مسار الرحلة بالكامل. بعبارة أخرى، فإنّ costs["model.shipments.pickups.cost"] هي مجموع جميع تكاليف الاستلام على طول المسار. يتم الإبلاغ عن جميع التكاليف المحدّدة في النموذج هنا بالتفصيل، باستثناء التكاليف المرتبطة بسمات TransitionAttributes التي يتم الإبلاغ عنها بطريقة مجمّعة فقط اعتبارًا من 2022/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 خاطئة، يتم أيضًا تعليق ما يلي: `total_duration = travel_duration + delay_duration.
  • break_duration + long_duration`.
start_time

Timestamp

وقت بدء عملية النقل هذه

route_polyline

EncodedPolyline

تمثيل الخطوط المتعددة المشفر للمسار الذي تم اتباعه أثناء الانتقال. تتم تعبئة هذا الحقل فقط عند ضبط 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

فهرس الحقل shipments في المصدر ShipmentModel.

is_pickup

bool

في حال كانت القيمة true، تتجاوب الزيارة مع طلب استلام Shipment. وبخلاف ذلك، يتجاوب هذا مع عملية التسليم.

visit_request_index

int32

مؤشر VisitRequest إما في حقل الاستلام أو التسليم في Shipment (راجِع 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.label المقابلة لها، إذا تم تحديدها في Shipment

visit_label

string

نسخة من VisitRequest.label المقابلة لها، إذا تم تحديدها في VisitRequest

ShipmentTypeIncompatibility

تُحدِّد هذه السمة حالات عدم التوافق بين الشحنات استنادًا إلى shipment_type. يتم تقييد ظهور الشحنات غير المتوافقة على المسار نفسه استنادًا إلى وضع عدم التوافق.

الحقول
types[]

string

قائمة الأنواع غير المتوافقة. هناك شحنتان "shipment_types" مختلفتان بين الشحنات المُدرَجة غير متوافقة.

incompatibility_mode

IncompatibilityMode

الوضع الذي تم تطبيقه على عدم التوافق.

IncompatibilityMode

الأوضاع التي تحدّد كيفية تقييد ظهور الشحنات غير المتوافقة على المسار نفسه

عمليات التعداد
INCOMPATIBILITY_MODE_UNSPECIFIED وضع عدم التوافق غير محدّد يجب عدم استخدام هذه القيمة مطلقًا.
NOT_PERFORMED_BY_SAME_VEHICLE في هذا الوضع، لا يمكن أبدًا لشحنتَين غير متوافقتَين أن تتشاركا المركبة نفسها.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

في عمليتَي شحن بأنواع غير متوافقة مع وضع عدم التوافق "NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY":

  • إذا كان كلاهما لعملية استلام فقط (بدون عمليات تسليم) أو لعملية تسليم فقط (بدون عمليات استلام)، لا يمكنهما مشاركة المركبة نفسها على الإطلاق.
  • في حال تم تسليم إحدى الشحنات والأخرى للاستلام، يمكن أن تتشارك الشحنتان المركبة نفسها إذا تم تسليم الشحنة السابقة قبل استلام الشحنة الثانية.

ShipmentTypeRequirement

تُحدِّد المتطلبات بين الشحنات استنادًا إلى shipment_type. يتم تحديد تفاصيل المتطلّب حسب وضع المتطلّب.

الحقول
required_shipment_type_alternatives[]

string

تتضمّن هذه السمة قائمة بأنواع الشحن البديلة المطلوبة بموجب سياسة "dependent_shipment_types".

dependent_shipment_types[]

string

يجب الانتقال إلى المسار نفسه للاطّلاع على كل الشحنات من النوع required_shipment_type_alternatives في الحقل dependent_shipment_types.

ملاحظة: لا يُسمَح باستخدام سلاسل المتطلبات التي تعتمد عليها shipment_type على نفسها.

requirement_mode

RequirementMode

تم تطبيق الوضع على الشرط.

RequirementMode

الأوضاع التي تحدد مظهر الشحنات التابعة على المسار.

عمليات التعداد
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.label المقابلة لها، إذا تم تحديدها في Shipment

reasons[]

Reason

قائمة بالأسباب التي تفسّر سبب تخطّي الشحنة عرض التعليق فوق Reason. إذا تعذّر علينا فهم سبب تخطي الشحنة، لن يتم تحديد الأسباب.

السبب

إذا تمكّنا من توضيح سبب تخطي الشحنة، سيتم إدراج الأسباب هنا. إذا لم يكن السبب هو نفسه لكل المركبات، ستتضمّن السمة 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_exceeded_capacity_type

string

إذا كان رمز السبب هو DEMAND_EXCEEDS_VEHICLE_CAPACITY، يتم توثيق نوع واحد من الحدّ الأقصى تم تجاوزه.

example_vehicle_index

int32

إذا كان السبب مرتبطًا بعدم توافق مركبة شحن، يوفر هذا الحقل المؤشر الخاص بمركبة واحدة ذات صلة.

الرمز

رمز يحدد نوع السبب. لا معنى لهذا الترتيب هنا. على وجه الخصوص، لا يشير ذلك إلى ما إذا كان سبب معيّن سيظهر قبل سبب آخر في الحل، إذا كان كلاهما ينطبق.

عمليات التعداد
CODE_UNSPECIFIED ويجب عدم استخدام هذه المعلومات مطلقًا.
NO_VEHICLE لا توجد مركبة في النموذج تجعل جميع الشحنات غير قابلة للتنفيذ.
DEMAND_EXCEEDS_VEHICLE_CAPACITY يتجاوز الطلب على الشحنة سعة المركبة لبعض أنواع السعة، من بينها example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

إنّ الحدّ الأدنى للمسافة اللازمة لإجراء هذه الشحنة، أي من start_location الخاصة بالمركبة إلى المواقع الجغرافية لاستلام الشحنة و/أو تسليمها وإلى الموقع الجغرافي النهائي للمركبة يتجاوز route_distance_limit.

لاحظ أنه في هذه العملية الحسابية، نستخدم المسافات الجيوديسية.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

يتجاوز الحد الأدنى للوقت اللازم لتنفيذ هذه الشحنة، بما في ذلك وقت التنقّل ووقت الانتظار ووقت الخدمة، route_duration_limit المركبة.

ملاحظة: يتم احتساب وقت التنقّل في أفضل سيناريو، أي المسافة الجيوديسية مضروبة في 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" الخاص بالشحن ليس فارغًا وهذه المركبة لا تنتمي إليه.

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/6، سيتم السماح بالحدود المسموح بها فقط.

delay

Duration

تحدد هذه السياسة التأخير الذي يحدث عند إجراء عملية النقل هذه.

ويحدث هذا التأخير دائمًا بعد الانتهاء من زيارة المصدر وقبل بدء زيارة الوجهة.

مركبة

تصمم مركبة في مشكلة شحن. سيؤدي حلّ مشكلة الشحن إلى إنشاء مسار يبدأ من 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، ستنتهي ShipmentRoute للمركبة فورًا عند إكمال آخر VisitRequest لها. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد السمة 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_hour بدلاً من cost_per_traveled_hour فقط إلى زيادة وقت الاستجابة.

cost_per_traveled_hour

double

التكلفة لكل ساعة يتم قطعها لمسار المركبة. لا يتم تطبيق هذه التكلفة إلا على مدة السفر التي يسلكها المسار (أي التي تم الإبلاغ عنها في شهر ShipmentRoute.transitions)، وتستثنى منها وقت الانتظار ووقت الزيارة.

cost_per_kilometer

double

التكلفة لكل كيلومتر من مسار المركبة يتم تطبيق هذه التكلفة على المسافة الواردة في ShipmentRoute.transitions ولا تنطبق على أي مسافة يتم قطعها ضمنيًا من arrival_location إلى departure_location في VisitRequest واحد.

fixed_cost

double

يتم تطبيق تكلفة ثابتة في حال استخدام هذه المركبة لمعالجة شحنة.

used_if_route_is_empty

bool

ينطبق هذا الحقل على المركبات فقط عندما لا يوفّر مسارها أي شحنات. يشير هذا العمود إلى ما إذا كان يجب اعتبار المركبة مستعمَلة أم لا في هذه الحالة.

إذا كان صحيحًا، تنتقل المركبة من موقع بدايتها إلى موقعها النهائي حتى لو لم تكن تخدم أي شحنات، وتكاليف الوقت والمسافة الناتجة من بدايتها --> السفر النهائي في الاعتبار.

بخلاف ذلك، لا تنتقل المركبة من موقع البدء إلى موقع النهاية، ولا يتم تحديد أي 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>

تحدِّد هذه السياسة خريطة من سلاسل traffic_types إلى المُدد. المدة هي الوقت بالإضافة إلى VisitRequest.duration التي يجب أخذها في الزيارات التي تتضمّن visit_types المحدّد. تضيف مدة الزيارة الإضافية هذه التكلفة في حال تحديد cost_per_hour. لا يمكن أن تكون المفاتيح (أي visit_types) سلاسل فارغة.

إذا كان طلب الزيارة يتضمّن أنواعًا متعدّدة، ستتم إضافة مدة لكل نوع في الخريطة.

break_rule

BreakRule

تصف هذه السمة الجدول الزمني للفاصل الإعلاني الذي سيتم فرضه على هذه المركبة. إذا كانت هذه القيمة فارغة، لن يتم ضبط أي فترات استراحة لهذه المركبة.

label

string

تُحدِّد تصنيفًا لهذه المركبة. يتم الإبلاغ عن هذا التصنيف في الرد على أنّه vehicle_label من ShipmentRoute المقابل.

ignore

bool

إذا كانت القيمة صحيحة، يجب أن تكون used_if_route_is_empty خطأ، وستظل هذه المركبة غير مستخدَمة.

إذا تم تنفيذ عملية شحن بواسطة مركبة تم تجاهلها في 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. وتكون التكلفة الإضافية 0 إذا كانت المدة أقل من الحد الأدنى، وإلّا تعتمد التكلفة على المدة على النحو التالي:

  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

يحدد حد الحمولة الذي ينطبق على مركبة، على سبيل المثال: "يمكن لهذه الشاحنة حمل ما يصل إلى 3500 كلغ كحد أقصى". يمكنك الاطّلاع على 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

الحد الأقصى المسموح به لحجم التحميل.

الفاصل

فاصل كميات التحميل المقبولة

الحقول
min

int64

الحد الأدنى للحمولة المقبولة يجب أن تكون القيمة ≥ 0. في حال تحديدهما، يجب أن تكون قيمة minmax.

max

int64

الحد الأقصى المقبول يجب أن تكون القيمة أكبر من أو تساوي 0. وفي حال عدم تحديد ذلك، لن يتم تقييد الحد الأقصى للتحميل من خلال هذه الرسالة. في حال تحديد كلاهما، يجب أن تكون minmax.

TravelMode

وسائل النقل التي يمكن استخدامها من قِبل المركبات

ويجب أن تكون هذه مجموعة فرعية من أوضاع السفر المفضَّلة في واجهة برمجة التطبيقات لتطبيق مسارات المسارات في "خرائط Google"، ويمكنك الاطّلاع على الرابط التالي: https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

عمليات التعداد
TRAVEL_MODE_UNSPECIFIED وضع سفر غير محدَّد، يعادل DRIVING.
DRIVING وضع السفر المناسب لاتجاهات القيادة (السيارة، ...)
WALKING وضع السفر المرتبط باتجاهات المشي

UnloadingPolicy

سياسة حول كيفية تفريغ حمولة المركبة لا ينطبق إلا على الشحنات التي تتضمّن عملية استلام وتسليم.

يمكن إجراء شحنات أخرى في أي مكان على المسار بشكل مستقل عن unloading_policy.

عمليات التعداد
UNLOADING_POLICY_UNSPECIFIED سياسة إلغاء تحميل غير محدّدة التسليمات بعد عمليات الاستلام المقابلة لها فقط.
LAST_IN_FIRST_OUT يجب أن يتم التسليم بترتيب عكسي لاستلام الطلب.
FIRST_IN_FIRST_OUT يجب أن يتم تسليم الطلبات بنفس ترتيب استلام الطلب.

النقطة الوسيطة

يتم تغليف نقطة وسيطة. تشير نقاط الطرق إلى مواقع وصول ومغادرة طلبات الزيارات، ومواقع بدء المركبات ونهايتها.

الحقول
side_of_road

bool

اختياريّ. يشير إلى أنّ الموقع الجغرافي لنقطة المرور هذه مخصّص لاختيار جانب معيّن من الطريق لتوقف المركبة. عند تعيين هذه القيمة، يمر المسار عبر الموقع بحيث يمكن للمركبة التوقف في جانب الطريق الذي يتحيز الموقع نحوه من وسط الطريق. لا يصلح هذا الخيار لطريقة "التنزّه". وضع السفر.

حقل الاتحاد location_type. الطرق المختلفة لتمثيل الموقع الجغرافي. يمكن أن يكون location_type واحدًا فقط مما يلي:
location

Location

نقطة يتم تحديدها باستخدام الإحداثيات الجغرافية، بما في ذلك عنوان اختياري.

place_id

string

معرّف مكان نقطة الاهتمام المرتبط بنقطة الطريق