Package google.maps.routeoptimization.v1

الفهرس

RouteOptimization

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

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

  • google.protobuf.Timestamp
    • الأوقات بتوقيت يونكس: ثواني منذ 1970-01-01T00:00:00+00:00.
    • يجب أن تكون الثواني ضمن [0, 253402300799]، أي في [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • يجب عدم ضبط قيمة nanos أو ضبطها على 0.
  • google.protobuf.Duration
    • يجب أن تكون الثواني ضمن [0, 253402300799]، أي في [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • يجب عدم ضبط قيمة nanos أو ضبطها على 0.
  • google.type.LatLng
    • يجب أن يكون خط العرض بتنسيق [-90.0, 90.0].
    • يجب أن يكون خط الطول بـ [-180.0، 180.0].
    • يجب أن يكون قيمة واحدة على الأقل من خطوط الطول والعرض غير صفرية.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

تعمل على تحسين جولات المركبة في رسالة OptimizeToursRequest واحدة أو أكثر دفعة واحدة.

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

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

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

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

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

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

الهدف هو توفير قيمة ShipmentRoute إلى Vehicle، ما يقلّل من التكلفة الإجمالية عندما تشتمل التكلفة على العديد من المكوّنات المحدَّدة في ShipmentModel.

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

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

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

AggregatedMetrics

مقاييس مجمّعة لـ ShipmentRoute (تتجاوب مع 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 (الاستجابة) 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_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.routeOptimize.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 true.

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

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

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

interpret_injected_solutions_using_labels

bool

في حال صحته:

  • تستخدم السمة 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. يمكن استخدامه عندما تتغير مؤشرات الشحن أو المركبات في الطلب منذ إنشاء الحل، ربما بسبب إزالة الشحنات أو المركبات من الطلب أو إضافتها إليه.

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

إذا كان 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

إذا كانت القيمة "true"، ستتم تعبئة الخطوط المتعددة في الرد 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

لاقتطاع عدد أخطاء التحقّق من الصحة التي تم عرضها. عادةً ما يتم إرفاق هذه الأخطاء بحمولة خطأ VLOOKUP كتفاصيل خطأ BadRequest (https://cloud.google.com/apis/design/errors#error_details)، إلا في حال حلول Solution_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 حل النموذج.
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 مع المركبة i في النموذج.

request_label

string

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

skipped_shipments[]

SkippedShipment

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

validation_errors[]

OptimizeToursValidationError

قائمة بجميع أخطاء التحقق من الصحة التي تمكنا من اكتشافها بشكل مستقل. يمكنك الاطلاع على شرح "MULTIPLE ERRORS" للرسالة OptimizeToursValidationError.

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/2021.

total_cost

double

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

OptimizeToursValidationError

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

الحقول
code

int32

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

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

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

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

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

  • UNSPECIFIED = 0،
  • VLOOKUP_فين_ERROR = 10؛ تعذر إكمال عملية التحقق في غضون الموعد النهائي.
  • REQUEST_OPTIONS_ERROR = 12،

    • REQUEST_OPTIONS_POINTS_SOLVING_mode = 1201،
    • REQUEST_OPTIONS_POINTS_MAX_صحATION_ERRORS = 1203،
    • REQUEST_OPTIONS_FI_geoDESIC_METERS_PER_SECOND = 1204،
    • REQUEST_OPTIONS_geoDESIC_METERS_PER_SECOND_TOO_SMALL = 1205،
    • REQUEST_OPTIONS_MisING_prodDESIC_METERS_PER_SECOND = 1206،
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_MODELSIC_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_POINTS_TRAFFIC_FLAVOR = 1213،
    • REQUEST_OPTIONS_TRAFFIC_ الموضّح_WITHOUT_GLOBAL_START_TIME = 1214،
    • REQUEST_OPTIONS_TRAFFIC_ الموضّح_WITH_PRECEDENCES = 1215،
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_mode_PROGRESS = 1216،
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ الموضّح_WITHOUT_TRAFFIC = 1217،
  • INJectED_SOLUTION_ERROR = 20،
    • INJectED_SOLUTION_MisING_LABEL = 2000،
    • INJectED_SOLUTION_DUPLICATE_LABEL = 2001،
    • INJectED_SOLUTION_AMBIGUOUS_INDEX = 2002،
    • INJectED_SOLUTION_INFEASIBLE_YEAR_GETَين_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_POINTS_START_TIME = 2800،
    • TIME_WINDOW_SELECTED_END_TIME = 2801،
    • TIME_WINDOW_POINTS_SOFT_START_TIME = 2802،
    • TIME_WINDOW_POINTS_SOFT_END_TIME = 2803،
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804،
    • TIME_WINDOW_START_TIME_YEAR_END_TIME = 2805،
    • TIME_WINDOW_POINTS_cost_PER_HOUR_BEFORE_SOFT_START_TIME = 2806،
    • TIME_WINDOW_POINTS_cost_PER_HOUR_YEAR_SOFT_END_TIME = 2807،
    • TIME_WINDOW_cost_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808،
    • TIME_WINDOW_cost_YEAR_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_ بعد_SOFT_END_TIME = 2811،
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812،
    • TIME_WINDOW_START_TIME_WEEK_SOFT_START_TIME = 2813،
    • TIME_WINDOW_SOFT_START_TIME_YEAR_END_TIME = 2814،
    • TIME_WINDOW_START_TIME_ بعد_SOFT_END_TIME = 2815،
    • TIME_WINDOW_SOFT_END_TIME_YEAR_END_TIME = 2816،
    • TIME_WINDOW_cost_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817،
    • TIME_WINDOW_cost_YEAR_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818؛
    • TRANSITION_ATTRIBUTES_ERROR = 30،
    • TRANSITION_ATTRIBUTES_ATTRIBUTE_cost = 3000،
    • TRANSITION_ATTRIBUTES_SELECTED_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_CONFLICANCE_SOURCE_TAGS_FIELDS = 3005،
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_destination_TAGS = 3006،
    • TRANSITION_ATTRIBUTES_CONFLICaging_destination_TAGS_FIELDS = 3007،
    • TRANSITION_ATTRIBUTES_chromeos_DURATION_NEGATIVE_OR_NAN = 3008،
    • TRANSITION_ATTRIBUTES_REASON_DURATION_EXCEEDS_GLOBAL_DURATION = 3009،
  • AMOUNT_ERROR = 31،
    • AMOUNT_NEGATIVE_VALUE = 3100،
  • LOAD_LIMIT_ERROR = 33،
    • LOAD_LIMIT_ATTRIBUTE_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_SELECTED_cost_ROAD_SOFT_MAX = 3601
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_cost_ بعد_SOFT_MAX = 3602
    • DISTANCE_LIMIT_cost_ بعد_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_POINTS_cost_PER_HOUR_ تستخدم_SOFT_MAX = 3802
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_cost_ بعد_SOFT_MAX = 3803؛
    • DURATION_LIMIT_cost_ بعد_SOFT_MAX_WITHOUT_SOFT_MAX = 3804؛
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805،
    • مدة
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_cost_PER_SQUARE_HOUR = 3807;
    • DURATION_LIMIT_cost_PER_SQUARE_HOUR_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_DIFF_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_SELECTED = 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_POINTS_PENALTY_cost = 4006،
    • SHIPMENT_Allowed_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007،
    • SHIPMENT_DUPLICATE_تشجيع_VEHICLE_INDEX = 4008،
    • SHIPMENT_INCONSISTENT_cost_FOR_VEHICLE_size_WITHOUT_INDEX = 4009،
    • SHIPMENT_INCONSISTENT_cost_FOR_VEHICLE_size_WITH_INDEX = 4010،
    • SHIPMENT_POINTS_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_SELECTED_cost_PER_KILOMETER = 4217،
    • VEHICLE_ATTRIBUTE_cost_PER_HOUR = 4218،
    • VEHICLE_ATTRIBUTE_cost_PER_TRAVELED_HOUR = 4219،
    • VEHICLE_ATTRIBUTE_FIXED_cost = 4220،
    • VEHICLE_POINTS_TRAVEL_DURATION_MULTIPLE = 4221،
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223،
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224،
    • VEHICLE_TERM_DURATION_longER_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،
  • BREAK_ERROR = 48،
    • BREAK_instructions_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_ تستخدم_GLOBAL_END_TIME = 4807،
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808،
    • BREAK_HOUR_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809،
    • BREAK_WIDTH_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810،
    • BREAK_موجة_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811،
    • BREAK_تردد_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812،
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813،
    • BREAK_موجة_MISING_MAX_INTER_BREAK_DURATION = 4814،
    • BREAK_HOUR_MISING_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_ATTRIBUTE_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_POINTS_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،
display_name

string

الاسم المعروض للخطأ

fields[]

FieldReference

قد يتضمّن سياق الخطأ 0 أو 1 (في معظم الأوقات) أو أكثر من الحقول. على سبيل المثال، يمكن الإشارة إلى المركبة رقم 4 وأول عملية استلام للمركبة رقم 2 على النحو التالي:

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

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

error_message

string

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

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

offending_values

string

قد يحتوي على قيم الحقول. ولا تكون هذه الميزة متاحة أحيانًا. يجب عدم الاعتماد عليها إطلاقًا، وعدم استخدامها إلا لتصحيح أخطاء النماذج اليدوية.

FieldReference

تحدّد سياقًا لخطأ التحقّق من الصحة. تشير السمة 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.routeOptimize.v1.RouteOptimizationService.BatchOptimizeTours].

الحقول
data_format

DataFormat

مطلوبة. تمثّل هذه السمة تنسيق بيانات المخرجات.

حقل الاتحاد destination مطلوبة. يمكن أن يكون الحقل "destination" واحدًا فقط مما يلي:
gcs_destination

GcsDestination

الموقع الجغرافي على Google Cloud Storage لكتابة المخرجات إليه

الشحنة

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

الحقول
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 حسب التوقيت العالمي المنسَّق (UTC) 1 كانون الثاني (يناير) 1970 (أي الثواني: 0 و nanos: 0).

global_end_time

Timestamp

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

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.
  • مركبة واحدة تبدأ مسارها في المنطقة المحلية وتنتهي في المنطقة المحلية
  • طلب زيارة واحد لاستلام الطلب في المنطقة المحلية
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • تتوفّر ثلاثة مواقع جغرافية: locA وlocB وlocC.
  • مركبة واحدة تبدأ مسارها في locA وتنتهي في locB، باستخدام المصفوفة "سريعة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "بطيئة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "سريعة"
  • طلب زيارة واحد للاستلام في الموقع الجغرافي
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) (resp. تحدّد duration_distance_matrices(i).rows(j).meters(k)) مدة (المسافة) للسفر من الزيارات التي تحمل العلامة duration_distance_matrix_src_tags(j) إلى الزيارات ذات العلامة duration_distance_matrix_dst_tags(k) في المصفوفة i.

تتوافق العلامات مع VisitRequest.tags أو Vehicle.start_tags. يجب أن تتطابق قيمة VisitRequest أو Vehicle المحدّدة مع علامة واحدة فقط في هذا الحقل. يُرجى العِلم أنّ علامات المصدر والوجهة والمصفوفة في Vehicle قد تكون متطابقة. وبالمثل، قد تتطابق علامات المصدر والوجهة في VisitRequest. يجب أن تكون جميع العلامات مختلفة ولا يمكن أن تكون سلاسل فارغة. إذا لم يكن هذا الحقل فارغًا، يجب ألا يكون duration_distance_matrices فارغًا.

transition_attributes[]

TransitionAttributes

سمات الانتقال المضافة إلى النموذج.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

مجموعات من shipping_types (أنواع_الشحن) غير المتوافقة (يُرجى الاطّلاع على 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 من بدء الحدث "الأول".

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

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

الحقول
first_is_delivery

bool

يشير إلى ما إذا كان الحدث "الأول" عبارة عن عملية تسليم.

second_is_delivery

bool

يشير إلى ما إذا كان الحدث "الثاني" عبارة عن عملية تسليم.

offset_duration

Duration

الإزاحة بين الحدث "الأول" و "الثاني". ويمكن أن تكون سلبية.

first_index

int32

مؤشر الشحن للحدث "الأول" يجب تحديد هذا الحقل.

second_index

int32

مؤشر الشحن للحدث "الثاني" يجب تحديد هذا الحقل.

ShipmentRoute

يمكن أن يتحلل مسار المركبة، على طول المحور الزمني، على النحو التالي (نفترض أن هناك عدد ن من الزيارات):

  |            |            |          |       |  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

وأخيرًا، إليك كيفية ترتيب السفر والفواصل والتأخير والانتظار أثناء عملية الانتقال.

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

مثال (معقد):

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

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

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 = trip_duration + التأجيل_duration
  • break_duration + look_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

إذا كانت الزيارة صحيحة، تتوافق الزيارة مع عملية استلام 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

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

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

تحدد المتطلبات بين عمليات الشحن استنادًا إلى shipping_type (نوع الشحنة). يتم تحديد تفاصيل المتطلبات من خلال وضع المتطلبات.

الحقول
required_shipment_type_alternatives[]

string

قائمة بأنواع الشحن البديلة المطلوبة من قِبل "dependent_shipment_types"

dependent_shipment_types[]

string

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

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

requirement_mode

RequirementMode

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

RequirementMode

الأوضاع التي تحدِّد شكل الشحنات التابعة على مسار معيّن

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

راجع تعليقات 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` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `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 على عملية الانتقال نفسها: في هذه الحالة، يتم جمع جميع التكاليف الإضافية ويتم تطبيق القيد أو الحد الأكثر صرامة (باتباع دلالات "و" الطبيعية).

الحقول
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/2021، ستتم إتاحة الحدود القصوى فقط.

delay

Duration

تحدِّد هذه السياسة المهلة الزمنية عند تنفيذ عملية النقل هذه.

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

مركبة

يصور مركبة في مشكلة شحن. يؤدي حلّ مشكلة الشحن إلى إنشاء مسار لهذه المركبة يبدأ من start_location وينتهي في end_location. المسار هو سلسلة من الزيارات (راجِع ShipmentRoute).

الحقول
display_name

string

تشير هذه السمة إلى الاسم المعروض الذي يحدّده المستخدم للمركبة. يمكن أن يصل طوله إلى 63 حرفًا، وقد يستخدم أحرف UTF-8.

travel_mode

TravelMode

وضع السفر الذي يؤثر في الطرق التي يمكن للمركبة استخدامها وسرعتها. يمكنك أيضًا الاطّلاع على travel_duration_multiple.

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>

تُستخدَم لتحديد خريطة من سلاسل view_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

تحدّد هذه السمة حد الحمولة الذي ينطبق على أي مركبة، على سبيل المثال "لا يمكن لهذه الشاحنة حمل أكثر من 3, 500 كلغ". يمكنك الاطّلاع على load_limits.

الحقول
soft_max_load

int64

حد خفيف للتحميل. يمكنك الاطّلاع على cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

إذا تجاوز الحمل soft_max_load على طول مسار هذه المركبة، سيتم تطبيق عقوبة التكلفة التالية (مرة واحدة فقط لكل مركبة): (تحميل - soft_max_load) * cost_per_unit_above_soft_max. يتم جمع جميع التكاليف ويجب أن تكون في وحدة "Shipment.penalty_cost" نفسها.

start_load_interval

Interval

فاصل التحميل المقبول للمركبة في بداية المسار.

end_load_interval

Interval

فاصل التحميل المقبول للمركبة في نهاية المسار.

max_load

int64

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

الفاصل الزمني

الفاصل الزمني لمعدّل تحميل البيانات المقبولة

الحقول
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 يجب أن تكون عمليات التسليم بنفس ترتيب استلام الطلبات.

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

تتضمن هذه الطريقة نقطة وسيطة. تحدد نقاط الطرق مواقع الوصول والمغادرة فيvisitRequests ومواقع بدء ونهاية المركبات.

الحقول
side_of_road

bool

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

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

Location

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

place_id

string

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