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