این مثال نشان میدهد که چگونه میتوان از ویژگیهای انتقال برای اولویتبندی مسیرهایی استفاده کرد که در آن وانتها و تحویلهای مجاور توسط یک وسیله نقلیه در یک بلوک زمانی انجام میشوند. برای کسب اطلاعات بیشتر درباره ویژگیهای انتقال، به مدل منطق تجاری با ویژگیهای انتقال مراجعه کنید.
در این مثال:
- تحویل محموله های 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 |
ج → دیگر | 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 |
برای هر نسخه، کمتر از مجموع هزینه های دو راه حل با پررنگ برجسته شده است. می بینید که وقتی از هزینه بالایی بالاتر از آستانه استفاده می کنید، اکنون هزینه کل مسیر برای مسیری که بازدیدها در آن گروه بندی می شوند، بالاتر است، که برعکس چیزی است که می خواهید به دست آورید.