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