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، وهي مجموعة من المسارات التي يمكن للمركبات القيام بها مع تقليل التكلفة الإجمالية.

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

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

  • https://www.googleapis.com/auth/cloud-platform
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

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

لاقتطاع عدد أخطاء التحقق من الصحة التي تم عرضها. عادةً ما تكون هذه الأخطاء مرتبطة بحمولة بيانات خطأ بهدف عارِدة من الخطأ BadRequest كتفاصيل خطأ في الطلب 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-th مع المركبة i-th في النموذج.

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

total_cost

double

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

OptimizeToursValidationError

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

الحقول
code

int32

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

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

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

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

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

  • UNSPECIFIED = 0،
  • websearchATION_ربح_خطأ = 10، تعذّر إكمال عملية التحقّق قبل الموعد النهائي.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_preferences_SOLVING_mode = 1201؛
    • REQUEST_OPTIONS_Connected_MAX_صالحATION_ERRORS = 1203؛
    • REQUEST_OPTIONS_OPTIONS_GEODESIC_METERS_PER_ثانوي = 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_ABLE_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_GETSITE_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_KEY_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_ بعد_SOFT_START_TIME = 2813؛
    • TIME_WINDOW_SOFT_START_TIME_ بعد_END_TIME = 2814؛
    • TIME_WINDOW_START_TIME_after_SOFT_END_TIME = 2815،
    • 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_TABLE_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_CONFLICTABLE_SOURCE_TAGS_FIELDS = 3005،
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_Destination_TAGS = 3006،
    • TRANSITION_ATTRIBUTES_CONFLIC بداية_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_INDEX_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_CREDIT_COST_PER_AREA_ بعد_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_PURCHASE_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_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_القواعد_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_INDEX_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_INDEX_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

سلسلة تصف الخطأ ويمكن لشخص عادي قراءتها هناك عملية ربط بنسبة 1:1 بين 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.route الانتباه.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، قد تحتاج إلى ضبط هذه النافذة على فاصل زمني أصغر لتحسين الأداء (على سبيل المثال، في حال وضع نموذج ليوم واحد، يجب ضبط الحدود الزمنية العالمية على ذلك اليوم). في حال ترك السياسة بدون ضبط، سيتم استخدام يوم 1 كانون الثاني (يناير) 1970 (أي الثواني: 0، nanos: 0) وفقًا بالتوقيت العالمي المنسّق (UTC) كإعداد تلقائي.

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.
  • مركبة واحدة تبدأ مسارها عند الموقع الجغرافي المحلي وتنتهي عند تحديد الموقع الجغرافي الحالي باستخدام مصفوفة "سريعة"
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها عند الموقع الجغرافي وتنتهي عند انطلاقها باستخدام مصفوفة "سريع"
  • هناك طلب زيارة لاستلام واحد في 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) إلى الزيارات الأخرى في المصفوفة 1.

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

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

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

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

يجب الانتقال إلى المسار نفسه للاطّلاع على كل الشحنات من النوع 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

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

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

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