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) من مساحة التخزين في السحابة الإلكترونية وكتابتها إليها بتنسيق يحدّده المستخدم. مثل طريقة OptimizeTours، يحتوي كل OptimizeToursRequest على ShipmentModel ويعرض OptimizeToursResponse يحتوي على حقول ShipmentRoute، وهي مجموعة من المسارات التي ستقطعها المركبات لخفض التكلفة الإجمالية.

يمكن للمستخدم الاستعلام عن operations.get للتحقّق من حالة طلب الحصول على إذن الوصول إلى البيانات غير القابلة للتغيير:

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

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

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

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

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

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

  • routeoptimization.operations.create

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

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
أذونات إدارة الهوية والوصول

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

  • routeoptimization.locations.use

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

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_below_soft_max

double

التكلفة المتكبّدة لكل كيلومتر، والتي تزيد حتى soft_max_meters، باستخدام الصيغة:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

هذه التكلفة غير متاحة في route_distance_limit.

cost_per_kilometer_above_soft_max

double

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

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

يجب أن تكون التكلفة غير سالبة.

GcsDestination

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

الحقول
uri

string

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

GcsSource

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

الحقول
uri

string

مطلوب. معرّف الموارد المنتظم لعنصر في 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 على false في النموذج).

يحدِّد relaxations(i).level مستوى تخفيف القيود المطبَّق على الزيارة رقم j التي تستوفي:

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

وبالمثل، يتم تخفيف بدء تشغيل المركبة إلى relaxations(i).level إذا كانت تستوفي الشروط التالية:

  • vehicle_start_time >= relaxations(i).threshold_time و
  • relaxations(i).threshold_visit_count == 0 ويتم تخفيف مدة انتهاء صلاحية المركبة إلى relaxations(i).level إذا كانت تستوفي الشروط التالية:
  • vehicle_end_time >= relaxations(i).threshold_time و
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

لتطبيق مستوى تسهيل إذا كانت الزيارة تستوفي threshold_visit_count أو threshold_time، أضِف relaxations مع level نفسه: أحدهما مع ضبط threshold_visit_count فقط والآخر مع ضبط threshold_time فقط. إذا كانت الزيارة تستوفي شروط relaxations متعددة، يتم تطبيق المستوى الأكثر تساهلاً. ونتيجةً لذلك، يصبح مستوى الاسترخاء أكثر استرخاءً من بداية المركبة إلى زيارات المسار وصولاً إلى نهاية المركبة، أي أنّ مستوى الاسترخاء لا ينخفض مع تقدّم المسار.

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

الحقول
level

Level

مستوى تخفيف القيود الذي ينطبق عند استيفاء الشروط في threshold_time أو بعد ذلك وthreshold_visit_count على الأقل

threshold_time

Timestamp

الوقت الذي يمكن فيه تطبيق level أو بعده

threshold_visit_count

int32

عدد الزيارات التي يمكن عندها أو بعدها تطبيق التخفيض level إذا كانت قيمة threshold_visit_count هي 0 (أو لم يتم ضبطها)، يمكن تطبيق level مباشرةً عند بدء تشغيل المركبة.

إذا كان route.visits_size() + 1، قد لا يتم تطبيق level إلا على طرف المركبة. وإذا كان عدد الصفحات أكثر من route.visits_size() + 1، لن يتم تطبيق level على هذا المسار على الإطلاق.

المستوى

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

تم ترتيب النقاط أدناه حسب ترتيب زيادة الاسترخاء.

عمليات التعداد
LEVEL_UNSPECIFIED

مستوى التخفيف التلقائي الضمني: لا يتم تخفيف أي قيود، أي أنّ جميع الزيارات مقيّدة بالكامل.

يجب عدم استخدام هذه القيمة صراحةً في level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD سيتمّ تخفيف قيود أوقات بدء الزيارات وأوقات بدء/انتهاء المركبات، ولكن تظلّ كلّ زيارة مرتبطة بالمركبة نفسها ويجب مراعاة تسلسل الزيارات: لا يمكن إدراج أيّ زيارة بينها أو قبلها.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD كما هو الحال في RELAX_VISIT_TIMES_AFTER_THRESHOLD، ولكن تم أيضًا تخفيف تسلسل الزيارة: يمكن إجراء الزيارات من خلال هذه المركبة فقط، ولكن يمكن أن تصبح غير مُنفَّذة.
RELAX_ALL_AFTER_THRESHOLD كما هو الحال في RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD، ولكن يتم أيضًا تخفيف القيود المفروضة على المركبة: تكون الزيارات مجانية تمامًا عند أو بعد الوقت المحدَّد، وقد لا يتم تنفيذها.

InputConfig

حدِّد إدخالًا لـ [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

الحقول
data_format

DataFormat

مطلوب. تنسيق بيانات الإدخال

حقل الربط source مطلوب. يمكن أن يكون source واحدًا فقط مما يلي:
gcs_source

GcsSource

موقع Google Cloud Storage يجب أن يكون هذا عنصرًا واحدًا (ملفًا).

الموقع الجغرافي

تُحاط بموقع جغرافي (نقطة جغرافية وعنوان اختياري).

الحقول
lat_lng

LatLng

الإحداثيات الجغرافية لنقطة الطريق

heading

int32

اتجاه البوصلة المرتبط باتجاه تدفق حركة المرور تُستخدَم هذه القيمة لتحديد جانب الطريق الذي سيتم استخدامه لعمليات الاستلام والإرجاع. يمكن أن تتراوح قيم الاتجاه بين 0 و360، حيث يحدد الصفر اتجاهًا شماليًا تمامًا، ويحدد 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، لا يتمّ ملء خطوط البوليجون إلا للمسارات غير الفارغة، ويتطلّب ذلك ضبط populate_polylines على "صحيح".

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

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

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

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

ملاحظة: على المتصل التأكّد من أنّ كل Vehicle.label (resp. Shipment.label) لتحديد مركبة (أو شحنة) بشكل فريد تم استخدامها في الطلبَين المعنيّين: الطلب السابق الذي أدى إلى إنشاء OptimizeToursResponse المستخدَم في الحلّ المُحقَّق والطلب الحالي الذي يتضمّن الحلّ المُحقَّق. إنّ عمليات التحقّق من التفرد الموضّحة أعلاه ليست كافية لضمان استيفاء هذا الشرط.

consider_road_traffic

bool

ننصحك بالأخذ في الاعتبار تقدير عدد الزيارات عند احتساب حقول ShipmentRoute Transition.travel_duration وVisit.start_time وvehicle_end_time، وعند ضبط الحقل ShipmentRoute.has_traffic_infeasibilities، وعند احتساب الحقل OptimizeToursResponse.total_cost.

populate_polylines

bool

إذا كان صحيحًا، ستتم تعبئة الخطوط المتعددة في ShipmentRoutes الاستجابة.

populate_transition_polylines

bool

إذا كانت القيمة "صحيح"، سيتم تعبئة الخطوط المتعددة ورموز المسارات في الاستجابة ShipmentRoute.transitions.

allow_large_deadline_despite_interruption_risk

bool

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

use_geodesic_distances

bool

إذا كان صحيحًا، سيتم احتساب مسافات التنقّل باستخدام المسافات الجيوديسية بدلاً من مسافات "خرائط Google"، وسيتم احتساب أوقات التنقّل باستخدام المسافات الجيوديسية بسرعة محدّدة بواسطة geodesic_meters_per_second.

label

string

التصنيف الذي يمكن استخدامه لتحديد هذا الطلب، والذي تم الإبلاغ عنه في OptimizeToursResponse.request_label

geodesic_meters_per_second

double

عندما تكون قيمة use_geodesic_distances صحيحة، يجب ضبط هذا الحقل ويحدّد السرعة المطبّقة لاحتساب أوقات التنقّل. يجب أن تكون قيمته 1.0 متر/ثانية على الأقل.

max_validation_errors

int32

تقتطع عدد أخطاء التحقّق التي يتم عرضها. يتم عادةً إرفاق هذه الأخطاء بحمولة خطأ INVALID_ARGUMENT كتفاصيل خطأ BadRequest (https://cloud.google.com/apis/design/errors#error_details)، ما لم يكن solving_mode=VALIDATE_ONLY: راجِع الحقل OptimizeToursResponse.validation_errors. يكون هذا العدد التلقائي 100، والحد الأقصى له هو 10,000.

SearchMode

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

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

SolvingMode

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

عمليات التعداد
DEFAULT_SOLVE حلّ النموذج قد يتم إصدار التحذيرات في [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY التحقّق من صحة النموذج فقط بدون حلّه: تعبئة أكبر عدد ممكن من OptimizeToursResponse.validation_errors
DETECT_SOME_INFEASIBLE_SHIPMENTS

يتم تعبئة OptimizeToursResponse.validation_errors أو OptimizeToursResponse.skipped_shipments فقط، ولا يتم حلّ بقية الطلب (لا يتم ضبط status وroutes في الاستجابة). إذا تم رصد حالات عدم التوافق في injected_solution_constraint مسار، تتم تعبئتها في الحقل OptimizeToursResponse.validation_errors ويبقى الحقل OptimizeToursResponse.skipped_shipments فارغًا.

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

OptimizeToursResponse

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

الحقول
routes[]

ShipmentRoute

المسارات المحسوبة لكل مركبة، حيث يتطابق المسار i مع المركبة i في النموذج.

request_label

string

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

skipped_shipments[]

SkippedShipment

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

validation_errors[]

OptimizeToursValidationError

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

metrics

Metrics

مقاييس المدة والمسافة والاستخدام لهذا الحلّ

المقاييس

المقاييس العامة المجمّعة على مستوى جميع المسارات

الحقول
aggregated_route_metrics

AggregatedMetrics

يتم احتساب هذه النسبة بشكل مجمع على مدار المسارات. كل مقياس هو مجموع (أو الحد الأقصى للتحميلات) لجميع حقول ShipmentRoute.metrics التي تحمل الاسم نفسه.

skipped_mandatory_shipment_count

int32

عدد الشحنات الإلزامية التي تم تخطّيها

used_vehicle_count

int32

عدد المركبات المستخدَمة ملاحظة: إذا كان مسار المركبة فارغًا وكانت القيمة Vehicle.used_if_route_is_empty صحيحة، تُعتبر المركبة مستعملة.

earliest_vehicle_start_time

Timestamp

أقرب وقت بدء لمركبة مستعملة، ويتم احتسابه على أنّه الحد الأدنى لجميع المركبات المستعمَلة التي تبلغ ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

آخر وقت انتهاء لمركبة مستعملة، ويتم احتسابه على أنّه الحد الأقصى لجميع المركبات المستعمَلة التي تبلغ ShipmentRoute.vehicle_end_time.

costs

map<string, double>

تكلفة الحلّ، مقسّمة حسب حقول الطلبات ذات الصلة بالتكلفة المفاتيح هي مسارات نموذجية، نسبةً إلى إدخال OptimizeToursRequest، على سبيل المثال "model.shipments.pickups.cost"، والقيم هي التكلفة الإجمالية التي تم إنشاؤها بواسطة حقل التكلفة المقابل، ويتم تجميعها على مستوى الحلّ بأكمله. بعبارة أخرى، costs["model.shipments.pickups.cost"] هي مجموع جميع تكاليف الاستلام على مستوى الحلّ. يتمّ إدراج جميع التكاليف المحدّدة في النموذج بالتفصيل هنا باستثناء التكاليف المرتبطة بعناصر TransitionAttributes التي يتمّ إدراجها فقط بطريقة مجمّعة اعتبارًا من 01/2022.

total_cost

double

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

OptimizeToursValidationError

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

الحقول
code

int32

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

تقدّم الحقول التي تتبع هذا القسم مزيدًا من السياق حول الخطأ.

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

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

display_name

string

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

fields[]

FieldReference

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

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

يُرجى العلم أنّ عدد القيم الفريدة للسمة fields يجب ألا يتغيّر لرمز خطأ معيّن.

error_message

string

سلسلة تصف الخطأ ويمكن لشخص عادي قراءتها هناك تعيين بنسبة 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.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

الحقول
data_format

DataFormat

مطلوب. تنسيق البيانات الناتجة

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

GcsDestination

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

RouteModifiers

تُحاط مجموعة من الشروط الاختيارية التي يجب استيفاؤها عند احتساب مسارات المركبات. يشبه هذا الإجراء العنصر RouteModifiers في واجهة برمجة التطبيقات المفضّلة للمسارات في "منصّة خرائط Google". يُرجى الاطّلاع على: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

الحقول
avoid_tolls

bool

لتحديد ما إذا كنت تريد تجنُّب الطرق ذات الرسوم في الحالات المعقولة سيتم منح الأولوية للمسارات التي لا تتضمّن طرقًا ذات رسوم عبور. لا ينطبق إلا على وسائل النقل الآلية.

avoid_highways

bool

يحدّد ما إذا كان يجب تجنُّب الطرق السريعة كلما أمكن ذلك. وسيتم منح الأولوية للمسارات التي لا تحتوي على طرق سريعة. لا ينطبق إلا على وسائل النقل الآلية.

avoid_ferries

bool

تُحدِّد ما إذا كان يجب تجنُّب العبّارات كلما أمكن ذلك. سيتم منح الأولوية للمسارات التي لا تتضمّن السفر عبر العبّارات. لا ينطبق إلا على وسائل النقل الآلية.

avoid_indoor

bool

اختيارية: تحدِّد ما إذا كان يجب تجنُّب التنقّل داخل المباني حيثما أمكن. سيتم منح الأولوية للمسارات التي لا تتضمّن التنقّل داخل المباني. ينطبق ذلك على وضع السفر WALKING فقط.

الشحن

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

الحقول
display_name

string

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

pickups[]

VisitRequest

مجموعة من بدائل الاستلام المرتبطة بالشحنة في حال عدم تحديد موقع جغرافي، يجب أن تزور المركبة موقعًا جغرافيًا يتوافق مع عمليات التسليم.

deliveries[]

VisitRequest

مجموعة من بدائل التسليم المرتبطة بالشحنة في حال عدم تحديد موقع جغرافي، يجب أن تزور المركبة موقعًا جغرافيًا يتطابق مع مواقع الاستلام.

load_demands

map<string, Load>

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

allowed_vehicle_indices[]

int32

مجموعة المركبات التي يمكنها تنفيذ هذه الشحنة إذا كان الحقل فارغًا، يمكن لجميع المركبات تنفيذه. يتم عرض المركبات حسب فهرسها في قائمة ShipmentModel vehicles.

costs_per_vehicle[]

double

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

  • عدد العناصر نفسه في costs_per_vehicle_indices يتوافق costs_per_vehicle[i] مع المركبة costs_per_vehicle_indices[i] من الطراز.
  • عدد العناصر نفسه لعدد المركبات في النموذج يتوافق العنصر i مع المركبة رقم i من الطراز.

يجب أن تكون هذه التكاليف بالوحدة نفسها المستخدَمة في penalty_cost، ويجب ألّا تكون سالبة. اترك هذا الحقل فارغًا إذا لم تكن هناك تكاليف من هذا النوع.

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

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

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

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

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

سلسلة غير فارغة تحدّد "نوعًا" لهذه الشحنة يمكن استخدام هذه الميزة لتحديد حالات عدم التوافق أو المتطلبات بين shipment_types (راجِع 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

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

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

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

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

تحميل

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

الحقول
amount

int64

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

VisitRequest

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

الحقول
arrival_location

LatLng

الموقع الجغرافي الذي تصل إليه المركبة عند تنفيذ هذا VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد arrival_location.

arrival_waypoint

Waypoint

نقطة الطريق التي تصل إليها المركبة عند تنفيذ هذه VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المسافة حسب المدة، يجب عدم تحديد arrival_waypoint.

departure_location

LatLng

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

departure_waypoint

Waypoint

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

tags[]

string

تحدِّد العلامات المرفقة بطلب الزيارة. لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

time_windows[]

TimeWindow

الفترات الزمنية التي تحدّ من وقت الوصول في إحدى الزيارات يُرجى العِلم أنّه قد تغادر المركبة خارج فترة وقت الوصول، أي أنّ وقت الوصول + المدة لا يجب أن يكونا ضمن فترة زمنية. وقد يؤدي ذلك إلى الانتظار إذا وصلت المركبة قبل TimeWindow.start_time.

يعني عدم توفّر TimeWindow أنّ المركبة يمكنها إجراء هذه الزيارة في أي وقت.

يجب أن تكون الفترات الزمنية غير متداخلة، أي يجب ألا تتداخل أي فترة زمنية مع أخرى أو تكون مجاورة لها، ويجب أن تكون بترتيب متزايد.

لا يمكن ضبط cost_per_hour_after_soft_end_time وsoft_end_time إلا في حال توفّر فترة زمنية واحدة.

duration

Duration

مدة الزيارة، أي الوقت الذي تقضيه المركبة بين الوصول والمغادرة (تُضاف إلى وقت الانتظار المحتمَل، راجِع time_windows).

cost

double

تكلفة خدمة طلب الزيارة هذا على مسار مركبة. ويمكن استخدامها لدفع تكاليف مختلفة لكل عملية استلام أو تسليم بديلة للشحنة. يجب أن تكون هذه التكلفة بالوحدة نفسها المستخدَمة في Shipment.penalty_cost، ويجب ألا تكون سالبة.

load_demands

map<string, Load>

تحميل متطلبات طلب الزيارة هذا يشبه هذا الحقل حقل Shipment.load_demands، إلا أنّه لا ينطبق إلا على هذا VisitRequest بدلاً من Shipment بالكامل. تتم إضافة الطلبات الواردة هنا إلى الطلبات الواردة في Shipment.load_demands.

visit_types[]

string

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

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

label

string

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

ShipmentModel

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

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

Shipment

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

vehicles[]

Vehicle

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

global_start_time

Timestamp

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

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

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

global_end_time

Timestamp

في حال عدم ضبط القيمة، يتم استخدام 00:00:00 بالتوقيت العالمي المنسق، 1 كانون الثاني (يناير) 1971 (أي الثواني: 31536000، النانو ثانية: 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.
  • مركبة واحدة تبدأ مسارها من الموقع الجغرافي "أ" وتنتهي به في الموقع الجغرافي "ب"، باستخدام مصفوفة "سريع".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "بطيء".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام مصفوفة "fast".
  • طلب زيارة استلام واحد في الموقع الجغرافي (ج).
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

علامات تحدّد مصادر مصفوفتَي المدة والمسافة: duration_distance_matrices(i).rows(j) تحدّد المدّات والمسافات من الزيارات التي تحمل العلامة duration_distance_matrix_src_tags(j) إلى الزيارات الأخرى في المصفوفة i.

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

duration_distance_matrix_dst_tags[]

string

علامات تحدّد وجهات مصفوفتَي المدة والمسافة؛ duration_distance_matrices(i).rows(j).durations(k) (على التوالي تحدِّد duration_distance_matrices(i).rows(j).meters(k)) مدة التنقّل (أو المسافة) من الزيارات التي تحمل العلامة duration_distance_matrix_src_tags(j) إلى الزيارات التي تحمل العلامة duration_distance_matrix_dst_tags(k) في المصفوفة i.

تتطابق العلامات مع 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 على الأقل من بدء الحدث "الأول".

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

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

الحقول
first_is_delivery

bool

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

second_is_delivery

bool

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

offset_duration

Duration

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

first_index

int32

فهرس الشحنة للحدث "الأول". يجب تحديد هذا الحقل.

second_index

int32

فهرس الشحنة للحدث "الثاني". يجب تحديد هذا الحقل.

ShipmentRoute

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

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

يُرجى العِلم أنّنا نفرق بين:

  • "الأحداث الدقيقة"، مثل بدء تشغيل المركبة وانتهائها وبدء كل زيارة وانتهائها (المعروفة أيضًا باسم الوصول والمغادرة) تحدث في ثانية معيّنة.
  • "الفواصل الزمنية"، مثل الزيارات نفسها والانتقال بين الزيارات على الرغم من أنّ الفواصل الزمنية يمكن أن تكون أحيانًا بلا مدة، أي أنّها تبدأ وتنتهي في الثانية نفسها، إلا أنّها غالبًا ما تكون لها مدة موجبة.

القيم الثابتة:

  • إذا كانت هناك n زيارة، تكون هناك n+1 انتقال.
  • تكون الزيارة محاطة دائمًا بانتقال قبلها (الفهرس نفسه) وانتقال بعدها (الفهرس + 1).
  • يتبع بدء تشغيل المركبة دائمًا الانتقال رقم 0.
  • يسبق نهاية المركبة دائمًا الانتقال رقم n.

عند التكبير، إليك ما يحدث أثناء Transition وVisit:

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

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

  • ولا تتداخل هذه المجموعات.
  • يكون DELAY فريدًا ويجب أن يكون فترة زمنية متصلة مباشرةً قبل الزيارة التالية (أو نهاية المركبة). وبالتالي، يكفي معرفة مدة التأخير لمعرفة وقت البدء والانتهاء.
  • الفواصل هي فترات زمنية متصلة وغير متداخلة. يحدِّد الردّ وقت بدء كل استراحة ومدتها.
  • 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

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

transitions[]

Transition

قائمة بحالات النقل للمسار مرتبة حسب الترتيب

has_traffic_infeasibilities

bool

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

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

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

route_polyline

EncodedPolyline

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

breaks[]

Break

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

metrics

AggregatedMetrics

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

route_costs

map<string, double>

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

Timestamp

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

route_polyline

EncodedPolyline

تمثيل الخطوط المتعددة المشفَّرة للمسار الذي تم اتّباعه أثناء عملية النقل لا تتم تعبئة هذا الحقل إلا إذا تم ضبط populate_transition_polylines على "صحيح".

route_token

string

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

vehicle_loads

map<string, VehicleLoad>

أحمال المركبات أثناء عملية النقل هذه، لكل نوع يظهر في Vehicle.load_limits لهذه المركبة أو يكون له Shipment.load_demands غير صفري في بعض الشحنات التي تم إجراؤها على هذا المسار

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

VehicleLoad

يُستخدَم لتسجيل الحمولة الفعلية للمركبة في نقطة معيّنة على طول المسار، لنوع معيّن (راجِع Transition.vehicle_loads).

الحقول
amount

int64

كمية الحمولة على المركبة، لنوع معيّن يتم عادةً الإشارة إلى وحدة الحمل حسب النوع. يمكنك الاطّلاع على Transition.vehicle_loads.

انتقال

زيارة تم إجراؤها أثناء مسار ترتبط هذه الزيارة باستلام أو تسليم Shipment.

الحقول
shipment_index

int32

فهرس حقل 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

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

الحقول
types[]

string

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

incompatibility_mode

IncompatibilityMode

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

IncompatibilityMode

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

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

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

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

ShipmentTypeRequirement

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

الحقول
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

راجِع التعليقات في الرمز البرمجي.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

الرمز

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

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

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

يُرجى العلم أنّنا نستخدم المسافات الجيوديسية لإجراء هذا الحساب.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

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

ملاحظة: يتم احتساب وقت التنقّل في أفضل السيناريوهات، أي المسافة الجيوديسية مضروبة في 36 مترًا في الثانية (130 كيلومترًا في الساعة تقريبًا).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT كما هو موضّح أعلاه، ولكننا نقارن فقط الحد الأدنى لوقت التنقّل وtravel_duration_limit المركبة.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS لا يمكن للمركبة تنفيذ عملية الشحن هذه في أفضل السيناريوهات (راجِع CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT لمعرفة كيفية احتساب الوقت) إذا بدأت في أقرب وقت ممكن، لأنّ إجمالي الوقت سيجعل المركبة تنتهي بعد وقت الانتهاء النهائي.
VEHICLE_NOT_ALLOWED حقل allowed_vehicle_indices في الشحنة ليس فارغًا وهذه المركبة لا تنتمي إليه.

TimeWindow

تحدّ الفترات الزمنية من وقت الحدث، مثل وقت الوصول إلى زيارة أو وقت بدء مركبة وانتهائها.

تفرض حدود الفترة الزمنية الثابتة، start_time وend_time، أقرب وقت وآخر وقت للحدث، على النحو التالي: start_time <= event_time <= end_time. يعبّر الحدّ الأدنى لفترة الوقت المرن، soft_start_time، عن تفضيل حدوث الحدث في soft_start_time أو بعد هذا التاريخ من خلال تكبد تكلفة تتناسب مع المدة التي قبل soft_start_time يحدث فيها الحدث. يعبّر الحدّ الأقصى لفترة الوقت المرنة، soft_end_time، عن تفضيل حدوث الحدث في soft_end_time أو قبله من خلال تكبد تكلفة تتناسب مع المدة التي يحدث فيها الحدث بعد soft_end_time. يجب أن تكون القيم start_time وend_time وsoft_start_time وsoft_end_time ضمن الحدود الزمنية العامة (راجِع ShipmentModel.global_start_time وShipmentModel.global_end_time) وأن تلتزم بما يلي:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
الحقول
start_time

Timestamp

وقت بدء الفترة الزمنية الثابتة إذا لم يتم تحديدها، سيتم ضبطها على ShipmentModel.global_start_time.

end_time

Timestamp

وقت انتهاء الفترة الزمنية الصارمة إذا لم يتم تحديدها، سيتم ضبطها على ShipmentModel.global_end_time.

soft_start_time

Timestamp

وقت بدء الفترة الزمنية

soft_end_time

Timestamp

وقت الانتهاء النهائي لفترة زمنية معيّنة

cost_per_hour_before_soft_start_time

double

تكلفة لكل ساعة تُضاف إلى التكاليف الأخرى في النموذج إذا حدث الحدث قبل soft_start_time، ويتم احتسابها على النحو التالي:

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

يجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا إذا تم ضبط soft_start_time.

cost_per_hour_after_soft_end_time

double

تكلفة لكل ساعة تُضاف إلى التكاليف الأخرى في النموذج إذا حدث الحدث بعد soft_end_time، ويتم احتسابها على النحو التالي:

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

يجب أن تكون هذه التكلفة موجبة، ولا يمكن ضبط الحقل إلا إذا تم ضبط soft_end_time.

TransitionAttributes

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

الحقول
src_tag

string

علامات تحدّد مجموعة التحولات (src->dst) التي تنطبق عليها هذه السمات

تتطابق زيارة مصدر أو بدء مركبة إذا كان حقل VisitRequest.tags أو Vehicle.start_tags يحتوي على src_tag أو لا يحتوي على excluded_src_tag (حسب الحقل من هذين الحقلين غير الفارغ).

excluded_src_tag

string

يمكنك الاطّلاع على src_tag. يجب أن يكون src_tag أو excluded_src_tag واحدًا فقط غير فارغ.

dst_tag

string

تتطابق زيارة الوجهة أو نهاية المركبة إذا كان الحقل VisitRequest.tags أو Vehicle.end_tags يتضمّن dst_tag أو لا يتضمّن excluded_dst_tag (حسب الحقل من هذين الحقلين غير فارغ).

excluded_dst_tag

string

يمكنك الاطّلاع على dst_tag. يجب أن يكون dst_tag أو excluded_dst_tag واحدًا فقط غير فارغ.

cost

double

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

cost_per_kilometer

double

تحدّد تكلفة لكل كيلومتر تُطبَّق على المسافة المقطوعة أثناء تنفيذ هذا النقل. ويضاف إلى أي Vehicle.cost_per_kilometer محدّد على المركبات.

distance_limit

DistanceLimit

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

اعتبارًا من حزيران (يونيو) 2021، أصبح بإمكانك استخدام الحدود الدنيا فقط.

delay

Duration

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

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

مركبة

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

الحقول
display_name

string

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

travel_mode

TravelMode

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

route_modifiers

RouteModifiers

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

start_location

LatLng

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

start_waypoint

Waypoint

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

end_location

LatLng

الموقع الجغرافي الذي تنتهي فيه المركبة بعد إكمال آخر VisitRequest في حال عدم تحديده، تنتهي ShipmentRoute المركبة على الفور عند إكمال آخر VisitRequest. إذا كان نموذج الشحن يتضمّن مصفوفات المدة والمسافة، يجب عدم تحديد end_location.

end_waypoint

Waypoint

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

start_tags[]

string

تُحدِّد العلامات المرفقة ببداية مسار المركبة.

لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

end_tags[]

string

تحدّد العلامات المرفقة بنهاية مسار المركبة.

لا يُسمح باستخدام سلاسل فارغة أو مكرّرة.

start_time_windows[]

TimeWindow

الفترات الزمنية التي يمكن خلالها للمركبة مغادرة موقعها الجغرافي الأولي ويجب أن تكون ضمن الحدود الزمنية العامة (راجِع حقول ShipmentModel.global_*). في حال عدم تحديدها، لا يكون هناك أي قيود باستثناء هذه الحدود الزمنية الشاملة.

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

لا يمكن ضبط cost_per_hour_after_soft_end_time وsoft_end_time إلا في حال توفّر فترة زمنية واحدة.

end_time_windows[]

TimeWindow

الفترات الزمنية التي قد تصل خلالها المركبة إلى موقعها النهائي ويجب أن تكون ضمن الحدود الزمنية العامة (راجِع حقول ShipmentModel.global_*). في حال عدم تحديدها، لا يكون هناك أي قيود باستثناء هذه الحدود الزمنية الشاملة.

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

لا يمكن ضبط cost_per_hour_after_soft_end_time وsoft_end_time إلا في حال توفّر فترة زمنية واحدة.

unloading_policy

UnloadingPolicy

تم فرض سياسة التفريغ على المركبة.

load_limits

map<string, LoadLimit>

سعة المركبة (الوزن والحجم وعدد المنصات مثلاً) المفاتيح في الخريطة هي معرّفات لنوع الحمولة، بما يتوافق مع مفاتيح حقل Shipment.load_demands. إذا لم يكن مفتاح معيّن متوفّرًا في هذه الخريطة، تُعتبَر السعة المقابلة غير محدودة.

cost_per_hour

double

تكاليف المركبات: تُجمع جميع التكاليف ويجب أن تكون بالوحدة نفسها المستخدَمة في Shipment.penalty_cost.

التكلفة لكل ساعة من مسار المركبة يتم تطبيق هذه التكلفة على إجمالي الوقت المستغرَق في المسار، ويشمل ذلك وقت التنقّل ووقت الانتظار ووقت الزيارة. قد يؤدي استخدام cost_per_hour بدلاً من cost_per_traveled_hour فقط إلى زيادة وقت الاستجابة.

cost_per_traveled_hour

double

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

cost_per_kilometer

double

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

fixed_cost

double

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

used_if_route_is_empty

bool

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

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

بخلاف ذلك، لا تنتقل المركبة من موقع البدء إلى موقع النهاية، ولا يتم تحديد أي break_rule أو تأخير (من TransitionAttributes) لهذه المركبة. في هذه الحالة، لا يحتوي ShipmentRoute للمركبة على أي معلومات باستثناء فهرس المركبة وتصنيفها.

route_duration_limit

DurationLimit

الحدّ الذي يتم تطبيقه على إجمالي مدة مسار المركبة في OptimizeToursResponse معيّن، تكون مدة مسار المركبة هي الفرق بين vehicle_end_time وvehicle_start_time.

travel_duration_limit

DurationLimit

الحدّ المفروض على مدة التنقّل في مسار المركبة في OptimizeToursResponse معيّن، تكون مدة التنقّل في المسار هي مجموع كل transitions.travel_duration.

route_distance_limit

DistanceLimit

الحدّ الذي يتم تطبيقه على إجمالي مسافة مسار المركبة في OptimizeToursResponse معيّن، تكون مسافة المسار هي مجموع جميع transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

تحدِّد خريطة من سلاسل visit_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

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