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 أو بعده

يستخدم المعيار RFC 3339، حيث يكون الناتج الذي يتم إنشاؤه مُمثلاً بالتوقيت العالمي المنسَّق مع حرف Z في النهاية ويستخدم الأرقام الجزئية 0 أو 3 أو 6 أو 9. تُقبل أيضًا المعادلات الأخرى التي لا تستخدم حرف Z. أمثلة: "2014-10-02T15:01:23Z" أو "2014-10-02T15:01:23.045123456Z" أو "2014-10-02T15:01:23+05:30".

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، ولكن يتم أيضًا تخفيف القيود على المركبة: تكون الزيارات مجانية تمامًا في الوقت المحدد أو بعده، وقد لا يتم تنفيذها.