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

في هذه الحالة، وبالنسبة إلى طلب لا يستخدم سوى التكلفة لكل ساعة والتكلفة لكل كيلومتر، يمكن أن يتضمّن المسار المحسّن عمليات التسليم A وB في الصباح وعملية التسليم C في المساء، وستكون تكلفة الحلّ هي نفسها كما لو تم تنفيذ جميع عمليات التسليم الثلاث في الوقت نفسه.
التكلفة لكل كيلومتر مع حدّ
لتجميع الزيارات القريبة، عليك أولاً اختيار مسافة الحدّ. وهي الحد الأقصى للمسافة بين زيارتَين تعتبرهما قريبتَين. يستخدم هذا المثال حدًا يبلغ 100 متر يتوافق تقريبًا مع مبنى واحد في منطقة حضرية. يمكنك زيادة الحد أو خفضه ليناسب احتياجات مؤسستك وتفضيلات السائقين.
لتجميع الزيارات القريبة التي تبعد عن بعضها مسافة 100 متر، يمكنك ضبط تكلفة عالية على أول 100 متر من كل انتقال وتكلفة أقل لأي أمتار إضافية من الانتقال. بما أنّ أول 100 متر هي الأغلى، يحقّق المحسِّن أكبر وفورات من خلال استخدام عمليات الانتقال التي تكون أقصر من الحدّ البالغ 100 متر، حتى لو كان ذلك يعني إطالة الطول الإجمالي للمسار.
لضبط التكاليف، يمكنك إضافة إدخال جديد إلى
ShipmentModel.transition_attributes
بالخصائص التالية:
- لمطابقة جميع عمليات الانتقال الممكنة، اختَر علامة غير مستخدَمة في أي مكان في النموذج، مثل
UNUSED_TAG. اضبطTransitionAttributes.excluded_src_tagوTransitionAttributes.excluded_dst_tagعلى هذه العلامة. - اضبط
TransitionAttributes.distance_limitباستخدام مسافة الحد والتكاليف:- اضبط
DistanceLimit.soft_max_metersعلى الحدّ الذي تم اختياره. - اضبط
DistanceLimit.cost_per_kilometer_below_soft_maxعلى التكلفة لكل كيلومتر أقل من الحدّ. - اضبط
DistanceLimit.cost_per_kilometer_above_soft_maxعلى التكلفة لكل كيلومتر أعلى من الحدّ.
- اضبط
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG",
"excluded_src_tag": "UNUSED_TAG",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
يجب عدم استخدام العلامة #unused_tag# من قِبل أي شحنات أو مركبات لمطابقة جميع عمليات الانتقال الممكنة. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة كيفية مطابقة جميع طلبات الزيارات.
كيفية عمل التكلفة العالية أقل من الحدّ
يوضّح هذا القسم كيف تؤثر التكلفة أقل من الحدّ وأعلى منه في التكلفة الإجمالية للحلول المختلفة في سيناريو المثال.
الحلّ 1: تنفيذ عمليات التسليم A وB في طريق الذهاب، وعملية التسليم C في طريق العودة
في هذا الحلّ، يتم تقسيم الشحنات إلى عمليتَي اجتياز لهذا الطريق. يتم تسليم اثنتَين منهما في عملية الاجتياز الأولى، ويتم تسليم الشحنة المتبقية في عملية الاجتياز الثانية. هناك 5 عمليات انتقال:
| الانتقال | المسافة | أقل من الحدّ الأدنى | أعلى من الحدّ الأدنى | ||
|---|---|---|---|---|---|
| المسافة | التكلفة | المسافة | التكلفة | ||
| المستودع ←A | 1000 م | 100 م | 5 | 900 م | 0.9 |
| A←B | 50 م | 50 م | 2.5 | 0 م | 0 |
| B←أخرى | 1030 م | 100 م | 5 | 930 م | 0.93 |
| أخرى←C | 1000 م | 100 م | 5 | 900 م | 0.9 |
| C←المستودع | 1080 م | 100 م | 5 | 980 م | 0.98 |
| المجموع | 450 م | 22.5 | 3710 م | 3.71 | |
يتم احتساب التكلفة الإجمالية على أنّها مجموع التكلفتَين لكل كيلومتر:
- التكلفة لكل كيلومتر أقل من الحدّ (50) مضروبة في إجمالي المسافة المقطوعة أقل من الحدّ (450 م = 0.45 كم)،
- التكلفة لكل كيلومتر أعلى من الحدّ (1) مضروبة في إجمالي المسافة المقطوعة أعلى من الحدّ (3710 م = 3.71 كم).
وبالتالي، تكون التكلفة الإجمالية 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21.
الحلّ 2: تنفيذ عمليات التسليم A وB وC في طريق الذهاب، وعدم تنفيذ أي عمليات في طريق العودة
في هذا الحلّ، على عكس الحلّ 1، يتم تسليم جميع الشحنات الثلاث "كمجموعة" خلال عملية اجتياز واحدة للطريق. في عملية الاجتياز الأخرى، لا تتوقف المركبة على الإطلاق. مرة أخرى، هناك 5 عمليات انتقال، ولكن تختلف أطوالها ومكوّناتها:
| الانتقال | المسافة | أقل من الحدّ الأدنى | أعلى من الحدّ الأدنى | ||
|---|---|---|---|---|---|
| المسافة | التكلفة | المسافة | التكلفة | ||
| المستودع ←A | 1000 م | 100 م | 5 | 900 م | 0.9 |
| A←B | 50 م | 50 م | 2.5 | 0 م | 0 |
| B←C | 30 م | 30 م | 1.5 | 0 م | 0 |
| C←أخرى | 1000 م | 100 م | 5 | 900 م | 0.9 |
| أخرى←المستودع | 2080 م | 100 م | 5 | 1980 م | 1.98 |
| المجموع | 380 م | 19 | 3780 م | 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 |
لكل إصدار، يتم تمييز التكلفة الأقل من إجمالي تكاليف الحلّين بالخط العريض. يمكنك ملاحظة أنّه عند استخدام تكلفة عالية أعلى من الحدّ، يصبح إجمالي تكلفة المسار الآن أعلى للمسار الذي يتم فيه تجميع الزيارات، وهو عكس ما أردت تحقيقه.