این مثال نحوه استفاده از ویژگیهای انتقال را برای اولویتبندی مسیرهایی نشان میدهد که در آنها دریافت و تحویلهای نزدیک توسط یک وسیله نقلیه در یک بلوک زمانی انجام میشود. برای کسب اطلاعات بیشتر در مورد ویژگیهای انتقال، به منطق کسبوکار مدل با ویژگیهای انتقال مراجعه کنید.
در این مثال:
- تحویل محمولههای A، B و C در یک جاده نزدیک به یکدیگر است.
- تحویلهای اضافی در ادامهی مسیر انجام خواهد شد.
- تحویلها زمان تحویل مشخصی ندارند.
- صرف نظر از برنامه بازدید، وسیله نقلیه باید دو بار در این جاده رانندگی کند: یک بار صبح در مسیر رفت از ایستگاه و یک بار عصر در مسیر برگشت.
- مسافت کلی سفر و مدت زمان مسیر، صرف نظر از زمان انجام مراحل A، B و C، همیشه یکسان است.

در این شرایط، و برای درخواستی که فقط از هزینه در ساعت و هزینه در کیلومتر استفاده میکند، مسیر بهینه میتواند به گونهای باشد که A و B در صبح و C در عصر رسیدگی شوند و هزینه راهحل مشابه حالتی باشد که هر سه مورد به طور همزمان رسیدگی شوند.
هزینه به ازای هر کیلومتر با یک آستانه
برای گروهبندی بازدیدهای نزدیک، ابتدا باید یک فاصله آستانه انتخاب کنید. این حداکثر فاصله بین دو بازدیدی است که شما آنها را نزدیک میدانید. در این مثال از آستانه ۱۰۰ متری استفاده شده است که تقریباً معادل یک بلوک در یک منطقه شهری است. میتوانید این آستانه را متناسب با نیازهای تجاری و ترجیحات رانندگان خود افزایش یا کاهش دهید.
برای گروهبندی بازدیدهای نزدیک در فاصله ۱۰۰ متری از یکدیگر، شما هزینه بالایی را برای ۱۰۰ متر اول هر انتقال و هزینه کمتری را برای هر متر اضافی از انتقال تعیین میکنید. از آنجایی که ۱۰۰ متر اول گرانترین هستند، بهینهساز با استفاده از انتقالهایی که کوتاهتر از آستانه ۱۰۰ متر هستند، بیشترین صرفهجویی را انجام میدهد، حتی اگر به معنای افزایش طول کلی مسیر باشد.
برای تنظیم هزینهها، یک ورودی جدید به 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# استفاده کند. برای اطلاعات بیشتر، به بخش «نحوه مطابقت با تمام درخواستهای بازدید» مراجعه کنید.
چگونه هزینه بالای زیر آستانه کار میکند
این بخش نشان میدهد که چگونه هزینه پایینتر و بالاتر از آستانه، بر هزینه کلی راهحلهای مختلف سناریوی مثال تأثیر میگذارد.
راه حل ۱: در مسیر رفت، مراحل A و B و در مسیر برگشت، مراحل C را انجام دهید
در این راهحل، محمولهها به دو مسیر پیمایش این جاده تقسیم میشوند. دو تا از آنها در مسیر اول و بقیه در مسیر دوم تحویل داده میشوند. 5 انتقال وجود دارد:
| گذار | فاصله | زیر آستانه | بالاتر از آستانه | ||
|---|---|---|---|---|---|
| فاصله | هزینه | فاصله | هزینه | ||
| انبار →A | ۱۰۰۰ متر | ۱۰۰ متر | ۵ | ۹۰۰ متر | ۰.۹ |
| الف → ب | ۵۰ متر | ۵۰ متر | ۲.۵ | 0 متر | 0 |
| ب→ سایر | ۱۰۳۰ متر | ۱۰۰ متر | ۵ | ۹۳۰ متر | ۰.۹۳ |
| دیگر →C | ۱۰۰۰ متر | ۱۰۰ متر | ۵ | ۹۰۰ متر | ۰.۹ |
| انبار C→ | ۱۰۸۰ متر | ۱۰۰ متر | ۵ | ۹۸۰ متر | ۰.۹۸ |
| مجموع | ۴۵۰ متر | ۲۲.۵ | ۳۷۱۰ متر | ۳.۷۱ | |
هزینه کلی از مجموع دو هزینه در هر کیلومتر محاسبه میشود:
- هزینه هر کیلومتر پایینتر از آستانه (50) ضربدر کل مسافت طی شده پایینتر از آستانه (450 متر = 0.45 کیلومتر)،
- هزینه هر کیلومتر بالاتر از آستانه (1) ضربدر کل مسافت طی شده بالاتر از آستانه (3710 متر = 3.71 کیلومتر).
بنابراین هزینه کلی برابر است با 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21.
راه حل ۲: در مسیر رفت، مراحل الف، ب، ج را انجام دهید، در مسیر برگشت هیچ کاری نکنید
در این راهحل، برخلاف راهحل ۱، هر سه محموله «بهصورت گروهی» در طول یک پیمایش جاده تحویل داده میشوند. در پیمایش دیگر، وسیله نقلیه اصلاً توقف نمیکند. باز هم، ۵ گذار وجود دارد، اما طول و ترکیب آنها متفاوت است:
| گذار | فاصله | زیر آستانه | بالاتر از آستانه | ||
|---|---|---|---|---|---|
| فاصله | هزینه | فاصله | هزینه | ||
| انبار →A | ۱۰۰۰ متر | ۱۰۰ متر | ۵ | ۹۰۰ متر | ۰.۹ |
| الف → ب | ۵۰ متر | ۵۰ متر | ۲.۵ | 0 متر | 0 |
| ب→ج | ۳۰ متر | ۳۰ متر | ۱.۵ | 0 متر | 0 |
| ج→دیگر | ۱۰۰۰ متر | ۱۰۰ متر | ۵ | ۹۰۰ متر | ۰.۹ |
| سایر→انبار | ۲۰۸۰ متر | ۱۰۰ متر | ۵ | ۱۹۸۰ متر | ۱.۹۸ |
| مجموع | ۳۸۰ متر | ۱۹ | ۳۷۸۰ متر | ۳.۷۸ | |
با استفاده از همان محاسباتی که در راه حل ۱ انجام شد، هزینه کلی برابر است با ۰.۳۸ * ۵۰ + ۳.۷۸ * ۱ = ۱۹ + ۳.۷۸ = ۲۲.۷۸، و انجام همه بازدیدها در یک بلوک زمانی هزینه کمتری نسبت به انجام آنها در دو گروه دارد. میتوانید این اثر را با افزایش DistanceLimit.cost_per_kilometer_below_soft_max تقویت کنید.
چرا هزینه پایین به ازای هر کیلومتر زیر آستانه، جواب نمیدهد؟
از آنجایی که میخواهید گذارهای کوتاه را به گذارهای بلند ترجیح دهید، ممکن است وسوسه شوید که هزینه به ازای هر کیلومتر بالایی را به گذارهای بلند اختصاص دهید و هزینه به ازای هر کیلومتر پایین را برای گذارهای کوتاه حفظ کنید. اما این در واقع یک اثر معکوس دارد: از آنجایی که ۱۰۰ متر اول گذار ارزانترین هستند، بهینهساز با ترجیح گذارهایی که نزدیک به ۱۰۰ متر یا بیشتر دارند، از این کنتورهای «ارزان» برای بیشترین تأثیر استفاده میکند.
میتوانید این تأثیر را در دو راهحل مثال مشاهده کنید. اگر هزینه هر کیلومتر پایینتر و بالاتر از آستانه را جابجا کنید، هزینههای مسیر تغییر میکند:
| هزینه بالا بالاتر از آستانه | هزینه بالا زیر آستانه | |||
|---|---|---|---|---|
| راه حل ۱ | راه حل ۲ | راه حل ۱ | راه حل ۲ | |
| کیلومترها زیر آستانه | ۰.۴۵ | ۰.۳۸ | ۰.۴۵ | ۰.۳۸ |
| هزینه هر کیلومتر کمتر از آستانه | ۱.۰۰ | ۱.۰۰ | ۵۰.۰۰ | ۵۰.۰۰ |
| کیلومترها بالاتر از آستانه | ۳.۷۱ | ۳.۷۸ | ۳.۷۱ | ۳.۷۸ |
| هزینه هر کیلومتر بالاتر از آستانه | ۵۰.۰۰ | ۵۰.۰۰ | ۱.۰۰ | ۱.۰۰ |
| کل هزینه | ۱۸۵.۹۵ | ۱۸۹.۳۸ | ۲۶.۲۱ | ۲۲.۷۸ |
برای هر نسخه، کمترین هزینه از بین کل هزینههای دو راهحل با حروف پررنگ مشخص شده است. میتوانید ببینید که وقتی از هزینه بالایی بالاتر از آستانه استفاده میکنید، کل هزینه مسیر اکنون برای مسیری که بازدیدها در آن گروهبندی شدهاند، بیشتر است، که برعکس چیزی است که میخواستید به آن برسید.