Package google.maps.routeoptimization.v1

الفهرس

RouteOptimization

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

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

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

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

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

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

يمكن للمستخدم إجراء استطلاع على operations.get للتحقّق من حالة العملية الطويلة الأمد:

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

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

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

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

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

يتطلّب ذلك إذن إدارة الهوية وإمكانية الوصول التالي في المورد parent:

  • routeoptimization.operations.create

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

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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

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

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

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

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

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

يتطلّب ذلك إذن إدارة الهوية وإمكانية الوصول التالي في المورد parent:

  • routeoptimization.locations.use

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

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

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

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

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

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

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

يتطلّب ذلك إذن إدارة الهوية وإمكانية الوصول التالي في المورد 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" هو OptimizeToursUriMetadata. نوع الحقل response هو OptimizeToursUriResponse، في حال نجاح العملية.

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

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

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

يتطلّب ذلك إذن إدارة الهوية وإمكانية الوصول التالي في المورد 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. يجب أن تستوفيها جميعًا BreakRequests في 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

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

اعتبارًا من نوفمبر 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 (resp. Shipment.label) يحدّد بشكل فريد كيان مركبة (أو شحنة) مستخدَم في الطلبَين ذوي الصلة: الطلب السابق الذي أنتج OptimizeToursResponse المستخدَم في الحلّ المُدخَل والطلب الحالي الذي يتضمّن الحلّ المُدخَل. لا تكفي عمليات التحقّق من التفرد الموضحة أعلاه لضمان هذا المطلب.

consider_road_traffic

bool

يُرجى مراعاة تقدير عدد الزيارات عند احتساب حقول ShipmentRoute Transition.travel_duration وVisit.start_time وvehicle_end_time، وعند ضبط حقل ShipmentRoute.has_traffic_infeasibilities، وعند احتساب حقل OptimizeToursResponse.total_cost.

populate_polylines

bool

في حال ضبط هذه المَعلمة على "صحيح"، ستتم تعبئة الخطوط المتعدّدة في الردود ShipmentRoute.

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

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

use_geodesic_distances

bool

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

label

string

تصنيف يمكن استخدامه لتحديد هذا الطلب، ويتم إرساله مرة أخرى في OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

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

max_validation_errors

int32

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

SearchMode

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

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

SolvingMode

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

عمليات التعداد
DEFAULT_SOLVE حلّ النموذج قد يتم إصدار تحذيرات في [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.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"] هو مجموع كل تكاليف الاستلام في الحلّ. يتم هنا عرض تفاصيل جميع التكاليف المحدّدة في النموذج، باستثناء التكاليف المرتبطة بسمات TransitionAttributes التي يتم عرضها بشكل مجمّع فقط اعتبارًا من يناير 2022.

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

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

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

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

error_message

string

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

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

offending_values

string

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

FieldReference

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

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

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

الحقول
name

string

اسم الحقل، مثل "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 في Routes Preferred API ضمن "منصة خرائط Google". يُرجى الاطّلاع على: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

الحقول
avoid_tolls

bool

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

avoid_highways

bool

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

avoid_ferries

bool

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

avoid_indoor

bool

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

الشحن

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

الحقول
display_name

string

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

pickups[]

VisitRequest

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

deliveries[]

VisitRequest

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

load_demands

map<string, Load>

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

allowed_vehicle_indices[]

int32

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

costs_per_vehicle[]

double

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

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

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

costs_per_vehicle_indices[]

int32

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

pickup_to_delivery_absolute_detour_limit

Duration

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

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

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

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

pickup_to_delivery_time_limit

Duration

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

shipment_type

string

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

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

label

string

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

ignore

bool

إذا كانت القيمة "صحيح"، يتم تخطّي هذه الشحنة، ولكن لا يتم تطبيق penalty_cost.

يؤدي تجاهل شحنة إلى حدوث خطأ في عملية التحقّق في حال توفّر أي shipment_type_requirements في النموذج.

يُسمح بتجاهل شحنة يتم تنفيذها في injected_first_solution_routes أو injected_solution_constraint، ويزيل الحلّال زيارات الاستلام/التسليم ذات الصلة من المسار الذي يتم تنفيذه. وسيتم أيضًا تجاهل precedence_rules التي تشير إلى الشحنات التي تم تجاهلها.

penalty_cost

double

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

ملاحظة مهمة: إذا لم يتم تحديد هذه الغرامة، تُعتبر غير محدودة، أي يجب إكمال الشحنة.

pickup_to_delivery_relative_detour_limit

double

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

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

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

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

التحميل

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

الحقول
amount

int64

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

VisitRequest

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

الحقول
arrival_location

LatLng

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

arrival_waypoint

Waypoint

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

departure_location

LatLng

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

departure_waypoint

Waypoint

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

tags[]

string

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

time_windows[]

TimeWindow

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

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

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

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

duration

Duration

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

cost

double

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

load_demands

map<string, Load>

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

visit_types[]

string

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

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

label

string

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

avoid_u_turns

bool

يحدّد ما إذا كان يجب تجنُّب الانعطافات على شكل حرف 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 أقل من 31,536,000 ثانية.

عند استخدام حقول 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 وتنتهي في locA.
  • طلب زيارة واحد لاستلام الطرود في الموقع B
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، باستخدام المصفوفة "fast".
  • مركبة واحدة تبدأ مسارها في locB وتنتهي في locB، باستخدام المصفوفة "slow".
  • مركبة واحدة تبدأ مسارها من الموقع B وتنتهي في الموقع B، باستخدام مصفوفة "سريعة".
  • طلب زيارة واحد لاستلام الطلب في الموقع الجغرافي C
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

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

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

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

                               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"] هو مجموع كل تكاليف الاستلام على المسار. يتم هنا عرض تفاصيل جميع التكاليف المحدّدة في النموذج، باستثناء التكاليف المرتبطة بسمات TransitionAttributes التي يتم عرضها بشكل مجمّع فقط اعتبارًا من يناير 2022.

route_total_cost

double

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

استراحة

بيانات تمثّل تنفيذ فاصل إعلاني

الحقول
start_time

Timestamp

وقت بدء الاستراحة

duration

Duration

مدة الاستراحة

EncodedPolyline

التمثيل المرمّز لشكل متعدّد الخطوط يمكنك الاطّلاع على مزيد من المعلومات حول ترميز الخطوط المتعدّدة هنا: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

الحقول
points

string

سلسلة تمثّل النقاط المرمّزة للخطوط المتعدّدة

الانتقال

الانتقال بين حدثَين على المسار يمكنك الاطّلاع على وصف ShipmentRoute.

إذا لم تكن المركبة تحتوي على start_location و/أو end_location، تكون مقاييس السفر المقابلة هي 0.

الحقول
travel_duration

Duration

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

travel_distance_meters

double

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

traffic_info_unavailable

bool

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

delay_duration

Duration

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

break_duration

Duration

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

wait_duration

Duration

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

total_duration

Duration

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

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

Timestamp

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

route_polyline

EncodedPolyline

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

route_token

string

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

visit_type

VisitType

اختيارية: تحدّد هذه السمة نوع الزيارة. يؤدي ذلك إلى إلغاء الحقل Visit.is_pickup.

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 لمزيد من التفاصيل.

VisitType

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

عمليات التعداد
VISIT_TYPE_UNSPECIFIED نوع الزيارة غير محدّد.
PICKUP_SHIPMENT تمثّل الزيارة عملية استلام شحنة.
DELIVER_SHIPMENT تتوافق الزيارة مع تسليم شحنة.

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 للمركبة صحيح.

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

SHIPMENT_IGNORED

الحقل ignore للشحنة صحيح.

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

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، لا تتوفّر سوى الحدود غير الصارمة.

delay

Duration

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

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

يوري

معرّف موارد منتظم (URI) يشير إلى مورد يمكن قراءته وكتابته من خلال 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.

ومع ذلك، إذا كان المسار هو "البداية"، "الاستلام"، "التسليم"، "الاستلام"، "التسليم"، "النهاية" مع عمليات الانتقال:

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

أنماط السفر التي يمكن للمركبات استخدامها

يجب أن تكون هذه مجموعة فرعية من أوضاع السفر في Routes API ضمن "منصة خرائط Google". يُرجى الاطّلاع على: 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

The ratio (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) for a given vehicle. إذا لم يكن المقام متوفّرًا، يتم استخدام (ShipmentModel.global_end_time - ShipmentModel.global_start_time) بدلاً منه.

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

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

الحقول
side_of_road

bool

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

vehicle_stopover

bool

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

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

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

Location

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

place_id

string

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

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