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].
    • يجب إلغاء ضبط قيمة "نانو ثانية" أو ضبطها على 0.
  • google.protobuf.Duration
    • يجب أن تكون الثواني في النطاق [0, 253402300799]، أي في النطاق [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • يجب إلغاء ضبط قيمة "نانو ثانية" أو ضبطها على 0.
  • google.type.LatLng
    • يجب أن يكون خط العرض ضمن النطاق [-90.0, 90.0].
    • يجب أن يكون خط الطول ضمن النطاق [-180.0, 180.0].
    • يجب أن تكون قيمة خط العرض أو خط الطول أو كليهما غير صفرية.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

يمكن للمستخدم إجراء عملية بحث operations.get للتحقّق من حالة عملية LRO:

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

إذا كان الحقل done الخاص بممثل الجهة المحلية صحيحًا، يعني ذلك أنّه تمت معالجة جميع الطلبات. ستتوفّر نتائج أي طلبات تمت معالجتها بنجاح في 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

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

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

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

سيكون لعملية long-running operation (LRO) التي تم إرجاعها اسم بالتنسيق <parent>/operations/<operation_id> ويمكن استخدامها لتتبُّع تقدّم عملية الحساب. نوع الحقل metadata هو OptimizeToursLongRunningMetadata. يكون نوع الحقل response هو OptimizeToursResponse، في حال نجاح العملية.

تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/otlr/make-request لمزيد من التفاصيل.

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

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

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

يتطلّب هذا الإجراء إذن إدارة الهوية وإمكانية الوصول (IAM) التالي على مورد parent:

  • routeoptimization.operations.create

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

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

هذا النوع هو أحد أشكال طريقة OptimizeToursLongRunning المصمَّمة لعمليات التحسين التي تتضمّن قيم مهلة كبيرة وأحجام إدخال/إخراج كبيرة.

يحدّد العميل معرّف الموارد المنتظم (URI) الخاص بـ OptimizeToursRequest المخزّن في Google Cloud Storage، ويكتب الخادم OptimizeToursResponse إلى معرّف الموارد المنتظم (URI) الخاص بـ Google Cloud Storage الذي يحدّده العميل.

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

سيكون لعملية long-running operation (LRO) التي تم إرجاعها اسم بالتنسيق <parent>/operations/<operation_id> ويمكن استخدامها لتتبُّع تقدّم عملية الحساب. نوع الحقل metadata هو OptimizeToursLongRunningMetadata. يكون نوع الحقل response هو OptimizeToursUriResponse، في حال نجاح العملية.

تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/otlr/make-request لمزيد من التفاصيل.

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

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

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

يتطلّب هذا الإجراء إذن إدارة الهوية وإمكانية الوصول (IAM) التالي على مورد parent:

  • routeoptimization.operations.create

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

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.

performed_mandatory_shipment_count

int32

عدد عمليات الشحن الإلزامية التي تم تنفيذها

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

performed_shipment_penalty_cost_sum

double

مجموع Shipment.penalty_cost لعمليات الشحن التي تم تنفيذها.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

BatchOptimizeToursMetadata

لا يتضمّن هذا النوع أي حقول.

البيانات الوصفية للعمليات الخاصة بمكالمات BatchOptimizeToursRequest

BatchOptimizeToursRequest

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

الحقول
parent

string

الحقل مطلوب. استهداف مشروع وموقع جغرافي لإجراء مكالمة

التنسيق:

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

في حال عدم تحديد موقع جغرافي، سيتم اختيار منطقة تلقائيًا.

model_configs[]

AsyncModelConfig

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

AsyncModelConfig

معلومات لحلّ نموذج تحسين واحد بشكل غير متزامن

الحقول
display_name

string

اختيارية: اسم الطراز الذي يحدّده المستخدم، ويمكن للمستخدمين استخدامه كاسم مستعار لتتبُّع الطُرز.

input_config

InputConfig

الحقل مطلوب. معلومات حول نموذج الإدخال

output_config

OutputConfig

الحقل مطلوب. معلومات الموقع الجغرافي المطلوب إخراج البيانات إليه

BatchOptimizeToursResponse

لا يتضمّن هذا النوع أي حقول.

ردّ على BatchOptimizeToursRequest يتم عرض هذا الرمز في عملية التشغيل الطويلة بعد اكتمال العملية.

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 تنسيق النص في Protocol Buffers يُرجى الاطّلاع على https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

حدّ يحدّد أقصى مسافة يمكن قطعها. ويمكن أن يكون صلبًا أو ليّنًا.

في حال تحديد حدّ أقصى مرن، يجب تحديد كل من soft_max_meters وcost_per_kilometer_above_soft_max ويجب أن تكونا غير سالبتَين.

الحقول
max_meters

int64

حدّ أقصى يقيّد المسافة لتكون max_meters على الأكثر. يجب أن يكون الحدّ غير سالب.

soft_max_meters

int64

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

إذا تم تحديد soft_max_meters، يجب أن تكون قيمته أقل من max_meters وألا تكون سالبة.

cost_per_kilometer_below_soft_max

double

التكلفة لكل كيلومتر تمّ تحمّلها، وتزداد لتصل إلى soft_max_meters، مع الصيغة:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

لا يمكن استخدام هذه التكلفة في route_distance_limit.

cost_per_kilometer_above_soft_max

double

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

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

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

GcsDestination

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

الحقول
uri

string

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

GcsSource

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

الحقول
uri

string

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

InjectedSolutionConstraint

حلّ تم إدراجه في الطلب يتضمّن معلومات عن الزيارات التي يجب تقييدها وكيفية تقييدها

الحقول
routes[]

ShipmentRoute

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

skipped_shipments[]

SkippedShipment

تم تخطّي شحنات الحلّ المطلوب إضافته. وقد يتم حذف بعضها من الحل الأصلي. الاطّلاع على حقل routes

constraint_relaxations[]

ConstraintRelaxation

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

ConstraintRelaxation

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

الحقول
relaxations[]

Relaxation

جميع القيود التي سيتم تخفيفها على الزيارات في المسارات التي تتضمّن مركبات في vehicle_indices

vehicle_indices[]

int32

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

يتم ربط فهرس المركبات بالطريقة نفسها كما في ShipmentRoute.vehicle_index، إذا كانت قيمة interpret_injected_solutions_using_labels صحيحة (راجِع التعليق fields).

استرخاء

إذا كانت relaxations فارغة، يكون وقت البدء وتسلسل جميع الزيارات في routes مقيّدًا بالكامل ولا يمكن إدراج أو إضافة زيارات جديدة إلى تلك المسارات. بالإضافة إلى ذلك، يتم تقييد وقتَي بدء وانتهاء المركبة في routes بشكل كامل، ما لم تكن المركبة فارغة (أي ليس لديها زيارات وتم ضبط used_if_route_is_empty على "خطأ" في النموذج).

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

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

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

  • vehicle_start_time >= relaxations(i).threshold_time و
  • يتم ضبط relaxations(i).threshold_visit_count == 0 على relaxations(i).level إذا استوفى ما يلي:
  • vehicle_end_time >= relaxations(i).threshold_time و
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

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

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

الحقول
level

Level

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

threshold_time

Timestamp

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

threshold_visit_count

int32

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

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

المستوى

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

يتم ترتيب التعداد أدناه حسب درجة التخفيف المتزايدة.

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

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

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

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

InputConfig

تحديد إدخال لـ [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours]

الحقول
data_format

DataFormat

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

حقل الدمج source الحقل مطلوب. يمكن أن تكون source إحدى القيم التالية فقط:
gcs_source

GcsSource

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

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

تتضمّن هذه السمة موقعًا جغرافيًا (نقطة جغرافية واتجاهًا اختياريًا).

الحقول
lat_lng

LatLng

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

heading

int32

تمثّل هذه السمة اتجاه البوصلة المرتبط باتجاه حركة المرور. تُستخدَم هذه القيمة لتحديد جانب الطريق الذي يجب استخدامه للاستلام والتسليم. يمكن أن تتراوح قيم الاتجاه من 0 إلى 360، حيث يشير 0 إلى اتجاه الشمال تمامًا، ويشير 90 إلى اتجاه الشرق تمامًا، وما إلى ذلك.

OptimizeToursLongRunningMetadata

لا يتضمّن هذا النوع أي حقول.

البيانات الوصفية للعمليات الخاصة بمكالمات OptimizeToursLongRunning

OptimizeToursRequest

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

الحقول
parent

string

الحقل مطلوب. استهداف مشروع أو موقع جغرافي لإجراء مكالمة

التنسيق:

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

في حال عدم تحديد موقع جغرافي، سيتم اختيار منطقة تلقائيًا.

timeout

Duration

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

بالنسبة إلى الطلبات غير المتزامنة، سينشئ الخادم حلاً (إذا أمكن ذلك) قبل انقضاء المهلة.

model

ShipmentModel

نموذج الشحن المطلوب حله

solving_mode

SolvingMode

يكون وضع الحلّ تلقائيًا DEFAULT_SOLVE (0).

search_mode

SearchMode

وضع البحث المستخدَم لحلّ الطلب

injected_first_solution_routes[]

ShipmentRoute

توجيه خوارزمية التحسين للعثور على حلّ أوّلي مشابه لحلّ سابق

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

يجب أن يستوفي الحل بعض افتراضات الصلاحية الأساسية:

  • بالنسبة إلى جميع الطرق، يجب أن يكون vehicle_index ضمن النطاق وألّا يكون مكررًا.
  • بالنسبة إلى جميع الزيارات، يجب أن يكون shipment_index وvisit_request_index ضمن النطاق.
  • لا يمكن الإشارة إلى شحنة إلا في مسار واحد.
  • يجب استلام شحنة الاستلام والتسليم قبل تسليمها.
  • لا يمكن تنفيذ أكثر من بديل واحد لاستلام الشحنة أو تسليمها.
  • بالنسبة إلى جميع المسارات، تتزايد الأوقات (أي vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • لا يمكن إجراء عملية شحن إلا على مركبة مسموح بها. يُسمح بالمركبة إذا كان Shipment.allowed_vehicle_indices فارغًا أو إذا كان vehicle_index مضمّنًا في Shipment.allowed_vehicle_indices.

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

injected_solution_constraint

InjectedSolutionConstraint

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

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

refresh_details_routes[]

ShipmentRoute

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

اعتبارًا من 11/2020، لا يتم ملء خطوط متعدّدة الأضلاع إلا للمسارات غير الفارغة، ويجب أن تكون قيمة populate_polylines صحيحة.

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

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

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

interpret_injected_solutions_using_labels

bool

إذا كان ذلك صحيحًا:

ينطبق هذا التفسير على الحقول 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

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

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

TRANSFORM_AND_RETURN_REQUEST

لا يعمل هذا الوضع إلا إذا لم يكن ShipmentModel.objectives فارغًا. لم يتم حلّ الطلب. يتم التحقّق من صحتها وتعبئتها بالتكاليف التي تتوافق مع الأهداف المحدّدة فقط. يمكنك أيضًا الاطّلاع على مستندات ShipmentModel.objectives. يتم عرض الطلب الناتج على أنّه OptimizeToursResponse.processed_request.

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

OptimizeToursResponse

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

الحقول
routes[]

ShipmentRoute

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

request_label

string

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

skipped_shipments[]

SkippedShipment

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

validation_errors[]

OptimizeToursValidationError

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

processed_request

OptimizeToursRequest

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

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

metrics

Metrics

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

المقاييس

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

الحقول
aggregated_route_metrics

AggregatedMetrics

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

skipped_mandatory_shipment_count

int32

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

used_vehicle_count

int32

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

earliest_vehicle_start_time

Timestamp

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

latest_vehicle_end_time

Timestamp

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

costs

map<string, double>

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

total_cost

double

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

OptimizeToursUriMetadata

لا يتضمّن هذا النوع أي حقول.

البيانات الوصفية للعمليات الخاصة بمكالمات OptimizeToursUri

OptimizeToursUriRequest

طلب مستخدَم من خلال طريقة OptimizeToursUri.

الحقول
parent

string

الحقل مطلوب. استهداف مشروع أو موقع جغرافي لإجراء مكالمة

التنسيق:

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

في حال عدم تحديد موقع جغرافي، سيتم اختيار منطقة تلقائيًا.

input

Uri

الحقل مطلوب. معرّف الموارد المنتظم (URI) لكائن Cloud Storage الذي يحتوي على OptimizeToursRequest

output

Uri

الحقل مطلوب. معرّف الموارد المنتظم (URI) لعنصر Cloud Storage الذي سيحتوي على OptimizeToursResponse

OptimizeToursUriResponse

ردّ يعرضه الإجراء OptimizeToursUri.

الحقول
output

Uri

اختيارية: معرّف الموارد المنتظم (URI) لعنصر Cloud Storage الذي يحتوي على OptimizeToursResponse بترميز JSON أو textproto إذا تم ترميز الكائن بتنسيق JSON، ستكون لاحقة اسم الكائن .json. إذا تم ترميز العنصر على أنّه textproto، ستكون لاحقة اسم العنصر .txtpb.

يمكن استخدام crc32_checksum للمرجع للتحقّق من عدم تعديل محتواه.

OptimizeToursValidationError

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

الحقول
code

int32

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

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

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

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

display_name

string

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

fields[]

FieldReference

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

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

يُرجى العِلم، مع ذلك، بأنّ عدد العناصر في fields يجب ألا يتغيّر لرمز خطأ معيّن.

error_message

string

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

اسم الحقل، مثل "vehicles".

sub_field

FieldReference

حقل فرعي متداخل بشكل متكرر، إذا لزم الأمر

حقل الدمج index_or_key

يمكن أن تكون index_or_key إحدى القيم التالية فقط:

index

int32

فهرس الحقل إذا كان متكرّرًا

key

string

مفتاح إذا كان الحقل خريطة

OutputConfig

تحدِّد هذه السمة وجهة لنتائج [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

الحقول
data_format

DataFormat

الحقل مطلوب. تنسيق بيانات الإخراج

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

GcsDestination

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

RouteModifiers

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

إذا تم تحديد كل من الحدود النسبية والمطلقة في الشحنة نفسها، سيتم استخدام الحد الأكثر تقييدًا لكل زوج ممكن من عمليات الاستلام/التسليم. اعتبارًا من 10/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))

إذا تم تحديد كل من الحدود النسبية والمطلقة في الشحنة نفسها، سيتم استخدام الحد الأكثر تقييدًا لكل زوج ممكن من عمليات الاستلام/التسليم. اعتبارًا من 10/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 المقابل.

avoid_u_turns

bool

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

تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request لمزيد من التفاصيل.

ShipmentModel

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

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

Shipment

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

vehicles[]

Vehicle

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

objectives[]

Objective

مجموعة الأهداف لهذا النموذج، والتي سنحوّلها إلى تكاليف. إذا لم يكن فارغًا، يجب أن يكون نموذج الإدخال بلا تكلفة. للحصول على الطلب المعدَّل، يُرجى استخدام solving_mode = TRANSFORM_AND_RETURN_REQUEST. يُرجى العِلم أنّه لن يتم حلّ الطلب في هذه الحالة. اطّلِع على المستندات ذات الصلة.

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

global_start_time

Timestamp

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

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

مجموعات من shipment_types غير متوافقة (راجِع ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

مجموعات متطلبات shipment_type (راجِع ShipmentTypeRequirement)

precedence_rules[]

PrecedenceRule

مجموعة من قواعد الأولوية التي يجب فرضها في النموذج

ملاحظة مهمة: يؤدي استخدام قواعد الأولوية إلى الحدّ من حجم المشكلة التي يمكن تحسينها. قد يتم رفض الطلبات التي تستخدم قواعد الأولوية والتي تتضمّن عمليات شحن متعددة.

max_active_vehicles

int32

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

DurationDistanceMatrix

تحدّد هذه السمة مصفوفة المدة والمسافة من مواقع بدء الزيارة والمركبة إلى مواقع انتهاء الزيارة والمركبة.

الحقول
rows[]

Row

تحدّد هذه السمة صفوف مصفوفة المدة والمسافة. يجب أن يحتوي على عدد العناصر نفسه الموجود في ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

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

يجب أن يتطابق كل بدء تشغيل مركبة مع مصفوفة واحدة بالضبط، أي يجب أن يتطابق أحد حقول start_tags مع vehicle_start_tag لمصفوفة واحدة (وللمصفوفة هذه فقط).

يجب أن يكون لكل مصفوفة vehicle_start_tag مختلف.

الصف

تحدّد هذه السمة صفًا من مصفوفة المدة والمسافة.

الحقول
durations[]

Duration

قيم المدة لصف معيّن يجب أن يحتوي على عدد العناصر نفسه الموجود في ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

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

الهدف

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

تجريبي: يمكنك الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request لمزيد من التفاصيل.

الحقول
type

Type

نوع الهدف.

weight

double

مقدار أهمية هذا الهدف مقارنةً بالأهداف الأخرى يمكن أن يكون هذا أي رقم غير سالب، ولا يلزم أن يكون مجموع الأوزان 1. تكون الأوزان تلقائيًا 1.0.

النوع

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

عمليات التعداد
DEFAULT سيتم استخدام مجموعة تلقائية من التكاليف لضمان التوصّل إلى حلّ معقول. ملاحظة: يمكن استخدام هذا الهدف بمفرده، ولكن سيتم أيضًا إضافته دائمًا بالوزن 1.0، كأساس، إلى الأهداف التي يحدّدها المستخدم، إذا لم يكن موجودًا من قبل.
MIN_DISTANCE أهداف "الحدّ الأدنى" تقليل إجمالي المسافة المقطوعة
MIN_WORKING_TIME تقليل إجمالي وقت العمل، الذي يتم جمعه على مستوى جميع المركبات
MIN_TRAVEL_TIME كما هو موضّح أعلاه، ولكن مع التركيز على مدة الرحلة فقط.
MIN_NUM_VEHICLES تقليل عدد المركبات المستخدَمة

PrecedenceRule

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

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

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

الحقول
first_is_delivery

bool

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

second_is_delivery

bool

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

offset_duration

Duration

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

first_index

int32

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

second_index

int32

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

ShipmentRoute

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

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

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

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

الثوابت:

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

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

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

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

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

مثال (معقّد):

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
الحقول
vehicle_index

int32

المركبة التي تسلك المسار، ويتم تحديدها من خلال الفهرس في المصدر ShipmentModel.

vehicle_label

string

تصنيف المركبة التي تسلك هذا المسار، ويساوي ShipmentModel.vehicles(vehicle_index).label في حال تحديده

vehicle_start_time

Timestamp

الوقت الذي تبدأ فيه المركبة مسارها

vehicle_end_time

Timestamp

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

visits[]

Visit

تسلسل مرتّب من الزيارات يمثّل مسارًا. تمثّل visits[i] الزيارة رقم 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، حسب السياق.

vehicle_fullness

VehicleFullness

حقل VehicleFullness لاحتساب مدى اقتراب المقاييس المحدودة من حدود المركبة الخاصة بها. حقولها هي نِسب بين حقل مقياس محدود (مثل AggregatedMetrics.travel_distance_meters) والحدّ الأقصى للمركبة ذي الصلة (مثل Vehicle.route_distance_limit).

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

route_costs

map<string, double>

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

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، تكون مقاييس التنقّل ذات الصلة صفرًا.

الحقول
travel_duration

Duration

مدة السفر خلال هذه الفترة الانتقالية

travel_distance_meters

double

المسافة المقطوعة أثناء الانتقال

traffic_info_unavailable

bool

عند طلب معلومات حركة المرور من خلال OptimizeToursRequest.consider_road_traffic، وتعذُّر استرداد معلومات حركة المرور لـ Transition، يتم ضبط قيمة هذا النوع المنطقي على "صحيح". قد يكون ذلك مؤقتًا (خلل نادر في خوادم بيانات حركة المرور في الوقت الفعلي) أو دائمًا (لا تتوفّر بيانات لهذا الموقع الجغرافي).

delay_duration

Duration

مجموع مدة التأخير المطبَّقة على عملية النقل هذه إذا كان هناك أي تأخير، يبدأ التأخير قبل delay_duration ثانية بالضبط من الحدث التالي (زيارة أو نهاية رحلة المركبة). يمكنك الاطّلاع على TransitionAttributes.delay.

break_duration

Duration

مجموع مدة الفواصل الإعلانية التي تحدث أثناء هذا الانتقال، إن وُجدت. يتم تخزين تفاصيل حول وقت بدء كل استراحة ومدتها في ShipmentRoute.breaks.

wait_duration

Duration

الوقت الذي تم قضاؤه في الانتظار خلال هذا الانتقال تتوافق مدة الانتظار مع وقت عدم النشاط ولا تشمل وقت الاستراحة. يُرجى العِلم أيضًا أنّ مدة الانتظار هذه قد يتم تقسيمها إلى عدة فواصل زمنية غير متجاورة.

total_duration

Duration

إجمالي مدة الانتقال، ويتم توفيرها لتسهيل الأمر. وهي تساوي:

  • الزيارة التالية start_time (أو vehicle_end_time إذا كان هذا هو الانتقال الأخير) - start_time لهذا الانتقال
  • إذا كانت قيمة ShipmentRoute.has_traffic_infeasibilities هي false، ينطبق ما يلي أيضًا: `total_duration = travel_duration + delay_duration
  • break_duration + wait_duration`.
start_time

Timestamp

وقت بدء هذا الانتقال

route_polyline

EncodedPolyline

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

route_token

string

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

vehicle_loads

map<string, VehicleLoad>

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

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

VehicleLoad

تعرض هذه السمة حمولة المركبة الفعلية في نقطة معيّنة على طول المسار، وذلك لنوع معيّن (راجِع Transition.vehicle_loads).

الحقول
amount

int64

تعرض هذه السمة مقدار الحمولة على المركبة، للنوع المحدّد. عادةً ما يتم تحديد وحدة التحميل حسب النوع. يمكنك الاطّلاع على Transition.vehicle_loads.

زيارة

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

الحقول
shipment_index

int32

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

injected_solution_location_token

int32

رمز مميز غير شفاف يمثّل معلومات حول الموقع الجغرافي للزيارة.

قد تتم تعبئة هذا الحقل في زيارات مسارات النتائج عندما تكون قيمة VisitRequest.avoid_u_turns صحيحة لهذه الزيارة أو إذا كانت قيمة ShipmentModel.avoid_u_turns صحيحة في الطلب OptimizeToursRequest.

تجريبية: يُرجى الاطّلاع على https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request لمزيد من التفاصيل.

ShipmentTypeIncompatibility

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

الحقول
types[]

string

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

incompatibility_mode

IncompatibilityMode

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

IncompatibilityMode

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

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

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

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

ShipmentTypeRequirement

تحدّد هذه السمة المتطلبات بين الشحنات استنادًا إلى shipment_type. يتم تحديد تفاصيل المتطلبات من خلال وضع المتطلبات.

الحقول
required_shipment_type_alternatives[]

string

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

dependent_shipment_types[]

string

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

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

requirement_mode

RequirementMode

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

RequirementMode

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

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

penalty_cost

double

هذه نسخة من Shipment.penalty_cost، تم تضمينها هنا لتسهيل معرفة مدى خطورة الشحنة التي تم تخطّيها.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

estimated_incompatible_vehicle_ratio

double

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

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

السبب

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

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

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

الحقول
code

Code

يُرجى الرجوع إلى تعليقات الرمز.

example_vehicle_indices[]

int32

هي نفسها example_vehicle_index باستثناء أنّنا نقدّم قائمة بالمركبات المتعدّدة المحدّدة. يُرجى العِلم بأنّ هذه القائمة ليست شاملة بالضرورة. لا تتم تعبئة هذا الحقل إلا إذا كانت قيمة [fill_example_vehicle_indices_in_skipped_reasons][] هي "صحيح".

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

example_exceeded_capacity_type

string

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

example_vehicle_index

int32

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

الرمز

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

عمليات التعداد
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 الخاص بالشحنة ليس فارغًا وهذه المركبة لا تنتمي إليه.
VEHICLE_IGNORED

قيمة الحقل ignore للمركبة هي true.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

SHIPMENT_IGNORED

الحقل ignore الخاص بالشحنة هو true.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

تم تخطّي الشحنة في injected_solution_constraint.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

لا يسمح تخفيف قيود مسار المركبة المحدّد في injected_solution_constraint بإدراج أي زيارة.

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

ZERO_PENALTY_COST

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

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

TimeWindow

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

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

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

Timestamp

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

end_time

Timestamp

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

soft_start_time

Timestamp

تمثّل هذه السمة وقت البدء المحدّد للفترة الزمنية.

soft_end_time

Timestamp

تمثّل هذه السمة وقت انتهاء الفترة الزمنية.

cost_per_hour_before_soft_start_time

double

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

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

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

cost_per_hour_after_soft_end_time

double

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

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

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

TransitionAttributes

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

الحقول
src_tag

string

علامات تحدّد مجموعة عمليات الانتقال (من المصدر إلى الوجهة) التي تنطبق عليها هذه السمات.

تتطابق زيارة المصدر أو بدء تشغيل المركبة إذا كان الحقل 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/06، لا يمكن استخدام سوى الحدود المرنة.

delay

Duration

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

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

يوري

معرّف موارد منتظم يشير إلى مورد يمكن قراءته وكتابته من خلال Route Optimization API.

الحقول
uri

string

تمثّل هذه السمة معرّف الموارد المنتظم (URI) للمورد. قد لا يكون المرجع متوفّرًا بعد.

يتم ترميز محتوى المورد بتنسيق JSON أو textproto. يُسمح باستخدام موارد Google Cloud Storage فقط. إذا كان المورد مشفّرًا بتنسيق JSON، يجب أن ينتهي اسم المورد باللاحقة .json. إذا تم ترميز المورد على أنّه textproto، يجب أن ينتهي اسم المورد باللاحقة .txtpb. على سبيل المثال، قد يبدو معرّف الموارد المنتظم (URI) لخدمة Google Cloud Storage لملف مرمّز بتنسيق JSON على النحو التالي: gs://bucket/path/input/object.json.

مركبة

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

الحقول
display_name

string

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

travel_mode

TravelMode

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

route_modifiers

RouteModifiers

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

start_location

LatLng

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

start_waypoint

Waypoint

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

end_location

LatLng

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

end_waypoint

Waypoint

نقطة طريق تمثّل موقعًا جغرافيًا تنتهي فيه المركبة بعد إكمال VisitRequest الأخير. في حال عدم تحديد أي من end_waypoint أو end_location، ينتهي 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

الحد الأقصى المسموح به للحمل

cost_per_kilometer

LoadCost

تكلفة نقل وحدة واحدة من الحمولة لمسافة كيلومتر واحد لهذه المركبة يمكن استخدام ذلك كبديل لاستهلاك الوقود: إذا كان الحمل عبارة عن وزن (بالنيوتن)، فإنّ الحمل*كيلومتر يكون له بُعد الطاقة.

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

cost_per_traveled_hour

LoadCost

تكلفة التنقّل بوحدة حمولة واحدة خلال ساعة واحدة لهذه المركبة

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

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

فترة مبالغ التحميل المقبولة

الحقول
min

int64

الحد الأدنى المقبول للتحميل يجب أن تكون القيمة ≥ 0. إذا تم تحديد كليهما، يجب أن تكون قيمة min أصغر من أو تساوي قيمة max.

max

int64

الحد الأقصى للحمل المقبول يجب أن تكون القيمة ≥ 0. في حال عدم تحديد الحد الأقصى للحِمل، لن يتم فرض أي قيود عليه من خلال هذه الرسالة. إذا تم تحديد كليهما، يجب أن تكون قيمة min أصغر من أو تساوي قيمة max.

LoadCost

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

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

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

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

ومسارها هو البدء، والاستلام، والاستلام، والتسليم، والتسليم، والانتهاء مع عمليات الانتقال التالية:

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

عندئذٍ تكون التكلفة التي تتحمّلها هذه LoadCost هي (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • الانتقال 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • المرحلة الانتقالية 2: 2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

إذًا، يكون LoadCost على طول المسار 120.0.

ومع ذلك، إذا كان المسار هو start,pickup,delivery,pickup,delivery,end مع عمليات الانتقال:

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

عندئذٍ تكون التكلفة التي تتحمّلها LoadCost هي

  • الانتقال 0: 0.0
  • الانتقال 1: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 2: 0.0
  • الانتقال 3: 2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • الانتقال 4: 0.0

في هذه الحالة، تكون قيمة LoadCost على طول المسار 40.0.

LoadCost يجعل الحلول التي تتضمّن انتقالات محمّلة بشكل كبير أكثر تكلفة.

تجريبي: يمكنك الانتقال إلى https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request لمزيد من التفاصيل.

الحقول
load_threshold

int64

مقدار الحمولة الذي يتغيّر عنده سعر نقل وحدة الحمولة من cost_per_unit_below_threshold إلى cost_per_unit_above_threshold. يجب أن تكون القيمة >= 0.

cost_per_unit_below_threshold

double

تكلفة نقل وحدة حمولة، لكل وحدة بين 0 والحدّ الأقصى يجب أن تكون قيمة محدودة وأكبر من أو تساوي 0.

cost_per_unit_above_threshold

double

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

TravelMode

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

يجب أن تكون هذه القيم مجموعة فرعية من وسائل النقل في Google Maps Platform Routes API، راجِع: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode

ملاحظة: طرق WALKING هي في مرحلة الإصدار التجريبي وقد لا تتضمّن أحيانًا أرصفة واضحة أو ممرات للمشاة. يجب عرض هذا التحذير للمستخدم في جميع مسارات المشي التي تعرضها في تطبيقك.

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

UnloadingPolicy

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

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

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

VehicleFullness

VehicleFullness هو مقياس يحسب مدى امتلاء مركبة. تتراوح قيمة كل حقل VehicleFullness بين 0 و1، ويتم احتسابها كنسبة بين حقل مقياس محدود (مثل AggregatedMetrics.travel_distance_meters) والحد الأقصى للمركبة المرتبط به (مثل Vehicle.route_distance_limit)، إذا كان هذا الحد الأقصى متوفّرًا. وفي حال عدم إجراء ذلك، سيظلّ معدّل الامتلاء غير محدّد. إذا كان الحدّ 0، يتم ضبط الحقل على 1. ملاحظة: عندما يكون المسار عرضة لعدم إمكانية التنقّل بسبب الازدحام، قد تتجاوز بعض نسب الامتلاء الأولية القيمة 1.0، مثلاً قد تتجاوز المركبة الحدّ الأقصى للمسافة. في هذه الحالات، نضع حدًا أقصى لقيم الامتلاء عند 1.0.

الحقول
max_fullness

double

الحد الأقصى لجميع الحقول الأخرى في هذه الرسالة

distance

double

النسبة بين AggregatedMetrics.travel_distance_meters وVehicle.route_distance_limit إذا لم يتم ضبط Vehicle.route_distance_limit، سيتم إلغاء ضبط هذا الحقل.

travel_duration

double

النسبة بين [AggregatedMetrics.travel_duration_seconds][] وVehicle.travel_duration_limit إذا لم يتم ضبط Vehicle.travel_duration_limit، سيتم إلغاء ضبط هذا الحقل.

active_duration

double

النسبة بين [AggregatedMetrics.total_duration_seconds][] وVehicle.route_duration_limit إذا لم يتم ضبط Vehicle.route_duration_limit، سيتم إلغاء ضبط هذا الحقل.

max_load

double

النسبة القصوى بين جميع أنواع [AggregatedMetrics.max_load][] وVehicle.load_limits الخاص بها إذا لم يتم ضبط جميع حقول Vehicle.load_limits، سيتم إلغاء ضبط هذا الحقل.

active_span

double

تمثّل هذه السمة النسبة (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) لمركبة معيّنة. في حال عدم توفّر المقام، يتم استخدام (ShipmentModel.global_end_time - ShipmentModel.global_start_time) بدلاً منه.

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

تغليف نقطة طريق تحدّد نقاط الطريق المواقع الجغرافية للوصول والمغادرة في VisitRequests، والمواقع الجغرافية للبدء والانتهاء في Vehicles.

الحقول
side_of_road

bool

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

vehicle_stopover

bool

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

تجريبي: قد يتغيّر سلوك هذا الحقل أو يتوقف عن الوجود في المستقبل.

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

Location

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

place_id

string

تمثّل هذه السمة رقم تعريف المكان الخاص بنقطة الاهتمام المرتبط بنقطة الطريق.

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