InjectedSolutionConstraint

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

تمثيل JSON
{
  "routes": [
    {
      object (ShipmentRoute)
    }
  ],
  "skippedShipments": [
    {
      object (SkippedShipment)
    }
  ],
  "constraintRelaxations": [
    {
      object (ConstraintRelaxation)
    }
  ]
}
الحقول
routes[]

object (ShipmentRoute)

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

skippedShipments[]

object (SkippedShipment)

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

constraintRelaxations[]

object (ConstraintRelaxation)

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

ConstraintRelaxation

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

تمثيل JSON
{
  "relaxations": [
    {
      object (Relaxation)
    }
  ],
  "vehicleIndices": [
    integer
  ]
}
الحقول
relaxations[]

object (Relaxation)

جميع إجراءات تخفيف قيود الزيارات التي ستسري على الزيارات في المسارات التي تتضمّن مركبات في vehicleIndices.

vehicleIndices[]

integer

تُحدِّد مؤشرات المركبات التي ينطبق عليها قيد الزيارة relaxations. إذا كانت السمة فارغة، سيتم اعتبار هذه السمة القيمة التلقائية، وتنطبق السمة relaxations على جميع المركبات غير المحدّدة في السمة constraintRelaxations الأخرى. يمكن أن يكون هناك حقل تلقائي واحد على الأكثر، أي أنّه يُسمح بحقل واحد لتخفيف القيود (vehicleIndices) فارغًا على الأكثر. يمكن إدراج فهرس المركبات مرة واحدة فقط، حتى في عدة constraintRelaxations.

يتم ربط فهرس المركبات بالترميز ShipmentRoute.vehicle_index، إذا كانت قيمة السمة interpretInjectedSolutionsUsingLabels صحيحة (اطّلِع على تعليق واحد (fields).

استرخاء

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

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

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

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

  • vehicleStartTime >= relaxations(i).threshold_time و
  • relaxations(i).threshold_visit_count == 0 ونهاية المركبة هادئة إلى relaxations(i).level إذا كانت تستوفي المعايير التالية:
  • vehicleEndTime >= relaxations(i).threshold_time و
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

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

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

تمثيل JSON
{
  "level": enum (Level),
  "thresholdTime": string,
  "thresholdVisitCount": integer
}
الحقول
level

enum (Level)

مستوى تخفيف القيود الذي ينطبق عند استيفاء الشروط في أو بعد thresholdTime وthresholdVisitCount على الأقل.

thresholdTime

string (Timestamp format)

تمثّل هذه السمة الوقت الذي يمكن فيه تطبيق الاسترخاء level أو بعده.

طابع زمني بتنسيق RFC3339 UTC "Zulu" ، مع دقة نانوثانية وما يصل إلى تسعة أرقام كسرية. أمثلة: "2014-10-02T15:01:23Z" و"2014-10-02T15:01:23.045123456Z"

thresholdVisitCount

integer

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