بازدیدهای نزدیک را با مشخصه‌های انتقال اولویت‌بندی کنید

این مثال نشان می‌دهد که چگونه از مشخصه‌های انتقال برای اولویت‌بندی مسیرهایی استفاده کنید که در آن‌ها در یک بازه زمانی، خودرو یکسانی از مکان‌های تحویل و تحویل‌گیری نزدیک پیکاپ و تحویل انجام می‌دهد. برای کسب اطلاعات بیشتر درباره مشخصه‌های انتقال، به منطق کسب‌وکار مدل با مشخصه‌های انتقال مراجعه کنید.

در این مثال:

  • محموله‌های الف، ب، و پ در یک جاده و نزدیک به هم تحویل داده می‌شوند.
  • تحویل‌های بیشتری در ادامه مسیر وجود دارد.
  • زمان تحویل مشخصی برای ارسال‌ها وجود ندارد.
  • صرف‌نظر از زمان‌بندی بازدید، خودرو باید دو بار در این جاده رانندگی کند: یک بار صبح در مسیر رفتن از انبار، و یک بار عصر در مسیر برگشت.
  • کل مسافت و مدت سفر در مسیر همیشه یکسان است، صرف‌نظر از اینکه A،‏ B، و C چه زمانی انجام شوند.

نمونه‌ای از تحویل محموله‌ها در یک جاده. سه محموله A،‏ B، و C در مسیر از انبار به‌سمت محموله‌های دیگر وجود دارد. ‫A در فاصله ۱۰۰۰ متری از انبار است، B در فاصله ۵۰ متری از انبار است، و C در فاصله ۳۰ متری در همان جهت است. محموله‌های دیگری در فاصله ۱۰۰۰ متری از
C وجود دارد.

در این شرایط، و برای درخواستی که فقط از هزینه ساعتی و هزینه کیلومتری استفاده می‌کند، مسیر بهینه‌سازی‌شده می‌تواند A و B را در صبح و C را در عصر انجام دهد و هزینه راه‌حل همانند زمانی خواهد بود که هر سه به‌طور هم‌زمان انجام شوند.

هزینه به‌ازای هر کیلومتر با آستانه

برای گروه‌بندی بازدیدهای نزدیک، ابتدا باید فاصله آستانه را انتخاب کنید. این حداکثر فاصله بین دو بازدید است که از نظر شما نزدیک به هم هستند. این مثال از آستانه ۱۰۰ متری استفاده می‌کند که تقریباً معادل یک بلوک در منطقه شهری است. می‌توانید آستانه را افزایش یا کاهش دهید تا با نیازهای کسب‌وکارتان و اولویت‌های رانندگانتان مطابقت داشته باشد.

برای گروه‌بندی بازدیدهای نزدیک به هم در فاصله ۱۰۰ متری از یکدیگر، هزینه بالایی برای ۱۰۰ متر اول هر انتقال و هزینه کمتری برای هر متر اضافی انتقال تعیین می‌کنید. ازآنجایی‌که ۱۰۰ متر اول گران‌ترین است، بهینه‌ساز بااستفاده از انتقال‌هایی که کوتاه‌تر از آستانه ۱۰۰ متری هستند بیشترین صرفه‌جویی را انجام می‌دهد، حتی اگر به معنی افزایش طول کلی مسیر باشد.

برای راه‌اندازی هزینه‌ها، ورودی جدیدی به ShipmentModel.transition_attributes با ویژگی‌های زیر اضافه می‌کنید:

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

هیچ محموله یا وسیله نقلیه‌ای نباید از برچسب #unused_tag# برای مطابقت با همه گذارهای ممکن استفاده کند. برای اطلاعات بیشتر، نحوه مطابقت دادن همه درخواست‌های بازدید را ببینید.

نحوه عملکرد هزینه بالا زیر آستانه

این بخش نشان می‌دهد که چگونه هزینه زیر و بالای آستانه بر هزینه کلی راه‌حل‌های مختلف سناریو نمونه تأثیر می‌گذارد.

راه‌حل ۱: انجام A و B در مسیر رفت، و C در مسیر برگشت

در این راه‌حل، محموله‌ها به دو پیمایش این جاده تقسیم می‌شوند. دو مورد از آن‌ها در اولین پیمایش و مورد باقی‌مانده در پیمایش دوم تحویل داده می‌شود. ‫۵ گذر وجود دارد:

انتقال مسافت زیر آستانه بالای آستانه
مسافت هزینه مسافت هزینه
انبار →A ۱۰۰۰ متر ۱۰۰ متر 5 ۹۰۰ متر ۰٫۹
A→B ‫۵۰ متر ‫۵۰ متر ۲٫۵ ۰ متر 0
B←دیگر ‫۱۰۳۰ متر ۱۰۰ متر 5 ۹۳۰ متر ۰٫۹۳
دیگر→C ۱۰۰۰ متر ۱۰۰ متر 5 ۹۰۰ متر ۰٫۹
C→depot ۱۰۸۰ متر ۱۰۰ متر 5 ۹۸۰ متر ۰٫۹۸
مجموع ۴۵۰ متر ۲۲٫۵ ۳۷۱۰ متر دلار امریکا

هزینه کلی از مجموع دو هزینه در هر کیلومتر محاسبه می‌شود:

  • هزینه هر کیلومتر زیر آستانه (۵۰) ضربدر کل مسافت طی‌شده زیر آستانه (۴۵۰ متر = ۰٫۴۵ کیلومتر)،
  • هزینه هر کیلومتر بالاتر از آستانه (۱) ضربدر کل مسافت طی‌شده بالاتر از آستانه (۳۷۱۰ متر = ۳٫۷۱ کیلومتر).

بنابراین هزینه کلی عبارت است از ۰٫۴۵ * ۵۰ + ۳٫۷۱ * ۱ = ۲۲٫۵ + ۳٫۷۱ = ۲۶٫۲۱.

راه‌حل ۲: در مسیر رفت A،‏ B،‏ C را انجام دهید، در مسیر برگشت هیچ کاری انجام ندهید

در این راه‌حل، برخلاف راه‌حل ۱، هر سه محموله درطول یک سفر در جاده «به‌صورت گروهی» تحویل داده می‌شوند. در عبور دیگر، وسیله نقلیه اصلاً توقف نمی‌کند. دوباره ۵ انتقال وجود دارد، اما طول و ترکیب آن‌ها متفاوت است:

انتقال مسافت زیر آستانه بالای آستانه
مسافت هزینه مسافت هزینه
انبار →A ۱۰۰۰ متر ۱۰۰ متر 5 ۹۰۰ متر ۰٫۹
A→B ‫۵۰ متر ‫۵۰ متر ۲٫۵ ۰ متر 0
شرکت‌به‌فرد ۳۰ متر ۳۰ متر ۱٫۵ ‫۰ متر 0
C→دیگر ۱۰۰۰ متر ۱۰۰ متر 5 ۹۰۰ متر ۰٫۹
other→depot ‫۲۰۸۰ متر ‫۱۰۰ متر 5 ۱۹۸۰ متر ۱٫۹۸
مجموع ۳۸۰ متر 19 ۳۷۸۰ متر ۳.۷۸

بااستفاده از همان محاسبات راهکار ۱، هزینه کلی عبارت است از ۰٫۳۸ * ۵۰ + ۳٫۷۸ * ۱ = ۱۹ + ۳٫۷۸ = ۲۲٫۷۸، و انجام همه بازدیدها در یک بلوک زمانی هزینه کمتری نسبت به انجام آن‌ها در دو گروه دارد. می‌توانید این تأثیر را با افزایش DistanceLimit.cost_per_kilometer_below_soft_max تقویت کنید.

چرا هزینه پایین به‌ازای هر کیلومتر زیر آستانه کار نمی‌کند

ازآنجایی‌که می‌خواهید گذرهای کوتاه را بر گذرهای طولانی ترجیح دهید، ممکن است وسوسه شوید که برای گذرهای طولانی «تبدیل‌بهای هر کیلومتر» بالایی درنظر بگیرید و «تبدیل‌بهای هر کیلومتر» پایین را برای گذرهای کوتاه حفظ کنید. اما این درواقع تأثیر معکوس دارد: ازآنجایی‌که ۱۰۰ متر اول انتقال ارزان‌ترین است، بهینه‌ساز از این مترهای «ارزان» برای بیشترین تأثیر استفاده می‌کند و انتقال‌هایی را که نزدیک به یا بیش‌از ۱۰۰ متر هستند ترجیح می‌دهد.

می‌توانید این تأثیر را در دو راهکار نمونه ببینید. اگر هزینه هر کیلومتر را در بالا و پایین آستانه جابه‌جا کنید، هزینه مسیر تغییر می‌کند:

هزینه بالا بالاتر از آستانه هزینه بالا زیر آستانه
راه‌حل ۱ راه‌حل ۲ راه‌حل ۱ راه‌حل ۲
کیلومتر زیر آستانه ۰٫۴۵ ۰٫۳۸ ۰٫۴۵ ۰٫۳۸
هزینه به‌ازای هر کیلومتر زیر آستانه ۱٫۰۰ ‫۱٫۰۰ ۵۰٫۰۰ ۵۰٫۰۰
کیلومتر بالاتر از آستانه ۳.۷۱ ۳٫۷۸ ۳.۷۱ ۳٫۷۸
هزینه به‌ازای هر کیلومتر بالاتر از آستانه ۵۰٫۰۰ ۵۰٫۰۰ ‫۱٫۰۰ ‫۱٫۰۰
کل هزینه ۱۸۵.۹۵ ۱۸۹.۳۸ 26.21 ۲۲٫۷۸

برای هر نسخه، کمترین هزینه کل دو راه حل با حروف پررنگ برجسته می‌شود. می‌توانید ببینید که وقتی از هزینه بالای آستانه استفاده می‌کنید، هزینه کل مسیر اکنون برای مسیری که بازدیدها در آن گروه‌بندی شده‌اند بالاتر است، که برعکس چیزی است که می‌خواستید به آن برسید.