این راهنما کاربردهای احتمالی ویژگیهای انتقال را نشان میدهد. به شما یاد میدهد که چگونه سناریوهای دنیای واقعی را با دو مثال مدلسازی کنید: گنجاندن زمان پارک وسیله نقلیه در مسیرهای بهینه، و اطمینان از اینکه هر مسیر با بازدید از یک مکان خاص به پایان میرسد.
قبل از اینکه شروع کنی
شما از ویژگیهای انتقال برای اضافه کردن هزینهها و تأخیرهای خاص مدل به انتقالهای خاص در مسیرهای بهینه استفاده میکنید. این هزینهها و تأخیرها علاوه بر مدت زمان انتقال و هزینههای محاسبهشده از دادههای نقشه بر اساس پارامترهای وسیله نقلیه مورد استفاده، اضافه میشوند.
یک گذار ، بخشی از مسیر است که یک مکان را به مکان بعدی متصل میکند.
یک مکان به هر یک از نقاط زیر در مسیر یک وسیله نقلیه اشاره دارد:
- نقطه شروع مسیر.
- ایستگاهی که در آن تحویل یا دریافت کالا انجام میشود.
- نقطه پایان مسیر.
شما تمام ویژگیهای انتقال را برای مدل با اضافه کردن آنها به لیست ShipmentModel.transition_attributes تعریف میکنید. هر عنصر از لیست، یک مجموعه از ویژگیهای انتقال را تعریف میکند و با استفاده از برچسبهایی در محل شروع و محل پایان انتقال، با انتقالها در مسیرها مطابقت داده میشود. برای کسب اطلاعات بیشتر در مورد ویژگیهای انتقال، به مستندات مرجع TransitionAttributes مراجعه کنید.
سناریوهای دنیای واقعی را مدلسازی کنید
این بخش دو مثال کوچک از چگونگی پیادهسازی محدودیتهای کسبوکار در دنیای واقعی با استفاده از ویژگیهای انتقال را نشان میدهد.
رزرو وقت برای پارکینگ
در این سناریو، راننده قبل از اینکه بتواند به محل A مراجعه کند، باید وسیله نقلیه را پارک کند. محل B در همان نزدیکی است و راننده میتواند از همان محل پارک برای هر دو مراجعه استفاده کند. اگر راننده بلافاصله پس از A به محل B مراجعه کند، در زمان صرفهجویی میکند زیرا نیازی به ترک محل پارک و پارک مجدد وسیله نقلیه ندارد. در API بهینهسازی مسیر، میتوانید از ویژگیهای انتقال برای اضافه کردن زمان اضافی برای پارک کردن وسیله نقلیه فقط زمانی که راننده از یک محل پارک به محل دیگر میرود، استفاده کنید.
وقتی زمان پارک را جدا از مدت زمان بازدید مدلسازی میکنید، مسیرهایی ایجاد میکنید که در آنها بازدیدهایی که از پارکینگ یکسان استفاده میکنند، گروهبندی شده و زمان کمتری صرف میکنند. شما مدل را دقیقتر میکنید و همچنین بهینهساز را وادار میکنید مسیرهایی را ترجیح دهد که در آنها بازدیدها گروهبندی شدهاند.
برای انجام این کار در یک درخواست API بهینهسازی مسیر، از مراحل زیر استفاده کنید:
VisitRequest.durationفقط برای زمان لازم برای انجام بازدید استفاده کنید. به عنوان مثال، برای تحویل بسته و گرفتن امضا از مشتری.برای هر جای پارک مجزا که در مدل استفاده شده است، از یک برچسب جدید استفاده کنید که برای هیچ چیز دیگری در مدل استفاده نشده باشد، مثلاً
PARKING_123.این تگ را به تگ زیر اضافه کنید:
VisitRequest.tagsدر تمام درخواستهای بازدیدی که از این جای پارک استفاده میکنند.Vehicle.start_tagsاگر وسیله نقلیه مسیر خود را از این نقطه پارکینگ شروع کند.Vehicle.end_tagsاگر وسیله نقلیه شروع به حرکت کند، مسیر خود را در این نقطه پارکینگ به پایان میرساند.
برای هر برچسب پارکینگ جدید، یک ورودی به
ShipmentModel.transition_attributesاضافه کنید که با انجام موارد زیر، تأخیری را برای پارکینگ هنگام آمدن از یک نقطه پارکینگ متفاوت اضافه کند:TransitionAttributes.excluded_src_tagوTransitionAttributes.dst_tagرا رویPARKING_123تنظیم کنید.مقدار
TransitionAttributes.delayرا برابر با زمان مورد نیاز برای پارک کردن وسیله نقلیه قرار دهید.
برای مثال، وقتی تگ یک مکان
PARKING_123است و پارک کردن وسیله نقلیه ۱۵۰ ثانیه طول میکشد، ورودی زیر را بهShipmentModel.transition_attributesاضافه میکنید:{ "excluded_src_tag": "PARKING_123", "dst_tag": "PARKING_123", "delay": "150s" }
نظافت اجباری در انتهای مسیر
در این سناریو، وسیله نقلیه باید در انتهای مسیر تمیز شود، با محدودیتهای اضافی زیر:
- نظافت قبل از بازگشت به انبار خودرو، در یک مرکز نظافت تخصصی انجام میشود. مسیر بهینهشده از بهترین مرکز نظافت بر اساس موقعیت مکانی و محلهای بارگیری و تحویل بار توسط خودرو استفاده میکند.
- پس از تمیز کردن، وسیله نقلیه نباید هیچگونه برداشت یا تحویل اضافی انجام دهد.
- زمان رانندگی تا آنجا و تمیز کردن وسیله نقلیه جزو ساعات کاری راننده محسوب میشود و باید در حداکثر مدت زمان مسیر گنجانده شود.
شما این الزام را با مجاز کردن فقط مسیرهایی که خالی هستند یا آخرین بازدیدشان از یک مرکز نظافت بوده است، مدلسازی میکنید. در API بهینهسازی مسیر، شما این کار را با ممنوع کردن انتقال به نقطه پایان مسیر از هر مکانی به جز از مرکز نظافت یا از نقطه شروع مسیر انجام میدهید:
- دو برچسب جدید انتخاب کنید که در هیچ کجای مدل استفاده نشدهاند، مثلاً
CLEANEDوROUTE_END. اولی برای مکانهایی است که وسیله نقلیه تمیز است یا تمیز میشود و دومی برای پایان مسیر است. - برای هر وسیله نقلیه، یک محموله جدید فقط برای تحویل اضافه کنید که نشاندهنده مراجعه به یک مرکز نظافت با ویژگیهای زیر باشد:
- هر مکان تأسیسات نظافتی باید به عنوان درخواست بازدید تحویل این محموله ارائه شود.
-
CLEANEDبهVisitRequest.tagsهر درخواست بازدید از محمولهی مرکز نظافت اضافه کنید. این نشان میدهد که وسیلهی نقلیهای که از این مکان خارج میشود، تمیز است. سایر درخواستهای بازدید در مدل نباید از این برچسب استفاده کنند تا وسیلهی نقلیه هنگام خروج از آنها "تمیز" تلقی نشود. - با تنظیم مقدار
penalty_costروی یک عدد کوچک، به بهینهساز اجازه دهید تا در صورت بلااستفاده بودن وسیله نقلیه، از این محموله صرف نظر کند.
برای هر وسیله نقلیه،
CLEANEDبهVehicle.start_tagsاضافه کنید. این برای علامتگذاری وسیله نقلیه به عنوان تمیز قبل از انجام هرگونه برداشت یا تحویل، با فرض اینکه در پایان روز کاری قبل تمیز شده است، استفاده میشود و به آن اجازه میدهد تا از نقطه شروع مستقیماً به نقطه پایان خود برود. حتی اگر چنین مسیرهایی در عمل اتفاق نیفتد، فعال کردن این سناریو به بهینهساز کمک میکند تا مسیرهای بهینه را با کارایی بیشتری جستجو کند.برای هر وسیله نقلیه،
ROUTE_ENDبهVehicle.end_tagsاضافه کنید.یک ورودی جدید به
ShipmentModel.transition_attributesاضافه کنید که مانع از رسیدن وسایل نقلیه به نقطه پایان مسیر در صورت تمیز نبودن آنها شود، با ویژگیهای زیر:TransitionAttributes.excluded_src_tagرا رویCLEANEDتنظیم کنید.TransitionAttributes.dst_tagرا رویROUTE_ENDتنظیم کنید.مقدار
TransitionAttributes.delayرا روی یک مقدار بزرگ تنظیم کنید. وقتی تأخیر را بیشتر از حداکثر مدت زمان مسیر تنظیم میکنید، عملاً بهینهساز را از استفاده از این انتقال در یک مسیر منع میکنید.
برای مثال، وقتی مقیاس زمانی مدل یک روز کاری است، میتوانید از تأخیر ۲۴ ساعته (۸۶۴۰۰ ثانیه) برای جلوگیری از انتقال به انتهای مسیر از هر جایی به جز یک مرکز نظافت و ابتدای مسیر استفاده کنید:
{ "excluded_src_tag": "CLEANED", "dst_tag": "ROUTE_END", "delay": "86400s" }
چگونه بین تأخیرها و هزینهها یکی را انتخاب کنیم
انتخاب بین تأخیرها و هزینهها به ماهیت منطق کسبوکار پیادهسازیشده و محدودیتها بستگی دارد. تنظیم TransitionAttributes.delay برای پیادهسازی محدودیتهای سخت یا بیان یک بدهبستان بر حسب زمان صرفشده بهترین گزینه است. TransitionAttributes.cost هنگام پیادهسازی ترجیحات نرم یا بدهبستانهایی که به صورت یک هزینه اضافی بیان میشوند، مناسبتر است. میتوانید تأخیرها و هزینهها را به طور دلخواه ترکیب کنید، زمانی که هم زمان صرفشده و هم هزینه مطرح باشد.
در مثال تمیز کردن وسیله نقلیه از یک تأخیر بسیار طولانی استفاده شده است، زیرا تمیز کردن وسیله نقلیه در انتهای مسیر یک نیاز دشوار است و تأخیر طولانی مانع از آن میشود که بهینهساز از این نیاز صرف نظر کند. اگر فقط یک هزینه تعیین کنید، بهینهساز میتواند از تمیز کردن صرف نظر کند، البته اگر راهی برای جبران هزینه در جای دیگری پیدا کند، به عنوان مثال با تحویل محمولههای بیشتر در زمان «صرفهجویی شده» با تمیز نکردن وسیله نقلیه.
در مثال پارکینگ از یک تأخیر کوتاه استفاده میشود که معادل زمان اضافی مورد نیاز برای پارک کردن وسیله نقلیه است. همچنین میتوانید در صورتی که راننده در یک پارکینگ پولی توقف کند، از هزینهها به همراه تأخیرها استفاده کنید.
چگونه یک ویژگی انتقال اضافه کنیم که با همه درخواستهای بازدید مطابقت داشته باشد
مثالهای بالا از ویژگیهای انتقالی استفاده میکنند که با مکانهایی که برچسب مشخصی دارند یا ندارند، مطابقت دارند. اما اگر نیاز به اضافه کردن ویژگیهای انتقالی داشته باشید که برای همه انتقالها اعمال شود، چه باید کرد؟
شما نمیتوانید تگها را حذف کنید، زیرا هر پیام TransitionAttributes باید یکی از TransitionAttributes.src_tag و TransitionAttributes.excluded_src_tag و یکی از TransitionAttributes.dst_tag و TransitionAttributes.excluded_dst_tag را داشته باشد.
با این حال، میتوانید با تنظیم TransitionAttributes.excluded_src_tag یا TransitionAttributes.excluded_dst_tag روی برچسبی که در هیچ کجای مدل استفاده نشده است، همه برچسبها را مطابقت دهید. این کار همه مکانهایی را که این برچسب را ندارند، مطابقت میدهد، اما از آنجایی که شما عمداً برچسبی را انتخاب کردهاید که توسط هیچ مکانی استفاده نمیشود، این ویژگیهای انتقال با همه مکانها مطابقت خواهند داشت.