منح الأولوية للزيارات القريبة باستخدام سمات الانتقال

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

في هذا المثال:

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

مثال على عمليات تسليم شحنات على الطريق نفسه هناك ثلاث شحنات، "أ" و"ب" و"ج"، على الطريق من المستودع إلى شحنات أخرى. تبعد النقطة "أ" مسافة 1000 متر عن المستودع، وتبعد النقطة "ب" مسافة 50 مترًا عن المستودع، وتبعد النقطة "ج" مسافة 30 مترًا في الاتجاه نفسه. هناك شحنات أخرى على بُعد 1000 متر من
النقطة "ج".

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

التكلفة لكل كيلومتر مع حدّ أدنى

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

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

لإعداد التكاليف، أضِف إدخالاً جديدًا إلى ShipmentModel.transition_attributes باستخدام السمات التالية:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

يجب ألا تستخدم أي شحنات أو مركبات العلامة #unused_tag# لمطابقة جميع عمليات النقل المحتملة. لمزيد من المعلومات، يُرجى الاطّلاع على كيفية مطابقة جميع طلبات الزيارة.

آلية عمل التكلفة المرتفعة التي تقلّ عن الحدّ الأدنى

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

الحلّ 1: تنفيذ المهمتَين "أ" و"ب" في طريق الذهاب، والمهمة "ج" في طريق العودة

في هذا الحلّ، يتم تقسيم الشحنات إلى عمليتَي عبور لهذا الطريق. يتم تسليم اثنين منهما في المرة الأولى، ويتم تسليم الباقي في المرة الثانية. هناك 5 انتقالات:

الانتقال المسافة أقل من الحدّ الأدنى أعلى من الحدّ الأدنى
المسافة التكلفة المسافة التكلفة
depot →A ‫1,000 متر ‫100 متر 5 ‫900 متر 0.9
أ←ب ‫50 متر ‫50 متر 2.5 ‫0 متر 0
B←غير ذلك ‫1,030 متر ‫100 متر 5 ‫930 متر 0.93
other→C ‫1,000 متر ‫100 متر 5 ‫900 متر 0.9
C→depot ‫1,080 متر ‫100 متر 5 ‫980 متر 0.98
المجموع ‫450 متر 22.5 ‫3,710 متر 3.71

يتم احتساب التكلفة الإجمالية من خلال جمع التكلفَتين لكل كيلومتر:

  • التكلفة لكل كيلومتر أقل من الحدّ الأدنى (50) مضروبة في إجمالي المسافة المقطوعة أقل من الحدّ الأدنى (450 مترًا = 0.45 كيلومتر)،
  • التكلفة لكل كيلومتر فوق الحدّ (1) مضروبة في إجمالي المسافة المقطوعة فوق الحدّ (3710 متر = 3.71 كيلومتر).

وبالتالي، تكون التكلفة الإجمالية 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21.

الحلّ 2: تنفيذ المهام "أ" و"ب" و"ج" في طريق الذهاب، وعدم تنفيذ أي مهمة في طريق العودة

في هذا الحل، على عكس الحل 1، يتم تسليم جميع الشحنات الثلاث "كمجموعة" أثناء عبور واحد للطريق. وفي المسار الآخر، لا تتوقف المركبة على الإطلاق. مرة أخرى، هناك 5 انتقالات، ولكن أطوالها وتراكيبها مختلفة:

الانتقال المسافة أقل من الحدّ الأدنى أعلى من الحدّ الأدنى
المسافة التكلفة المسافة التكلفة
depot →A ‫1,000 متر ‫100 متر 5 ‫900 متر 0.9
أ←ب ‫50 متر ‫50 متر 2.5 ‫0 متر 0
B→C ‫30 متر ‫30 متر 1.5 ‫0 متر 0
C←غير ذلك ‫1,000 متر ‫100 متر 5 ‫900 متر 0.9
other→depot ‫2,080 متر ‫100 متر 5 ‫1,980 متر 1.98
المجموع ‫380 متر 19 ‫3,780 متر 3.78

باستخدام العملية الحسابية نفسها في الحلّ 1، تكون التكلفة الإجمالية 0.38 * 50 + 3.78 * 1 = 19 + 3.78 = 22.78، وإجراء جميع الزيارات في فترة زمنية واحدة له تكلفة أقل من إجرائها في مجموعتين. يمكنك تعزيز هذا التأثير من خلال زيادة DistanceLimit.cost_per_kilometer_below_soft_max.

لماذا لا تنجح التكلفة المنخفضة لكل كيلومتر أقل من الحد الأدنى؟

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

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

التكلفة المرتفعة أعلى من الحدّ الأدنى التكلفة المرتفعة أقل من الحدّ الأدنى
الحلّ 1 الحلّ 2 الحلّ 1 الحلّ 2
عدد الكيلومترات أقل من الحدّ الأدنى 0.45 0.38 0.45 0.38
التكلفة لكل كيلومتر أقل من الحدّ الأدنى 1.00 1.00 50.00 50.00
عدد الكيلومترات التي تتجاوز الحدّ الأدنى 3.71 3.78 3.71 3.78
التكلفة لكل كيلومتر فوق الحدّ الأدنى 50.00 50.00 1.00 1.00
إجمالي التكلفة 185.95 189.38 26.21 22.78

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