الگوریتم تجزیه بندرز خودکار CPLEX

در نسخه‌ی ۱۲٫۷ نرم‌افزار  CPLEX رویه‌ی جدیدی جایگزین هسته‌ای اصلی الگوریتم حل یعنی شاخه و برش Branch and Cut مطرح گردید. تحت این رویه مساله‌ی اولیه به یک مساله‌ی اصلی Master و یک یا چند زیرمساله Worker تجزیه می‌شود. این رویه در ادبیات علم بهینه‌سازی به الگوریتم تجزیه بندرز Benders Decomposition مشهور است. در این پست نحوه‌ی بکارگیری رویه بندرز در پلتفرم پایتون PYTHON در رابط کاربری SPYDER نرم‌افزار  ANACONDA به همراه مثال تشریح خواهد شد. جهت کسب اطلاعات بیشتر به راهنمای  Prescriptive Analytics for Python مراجعه نمایید.

 

توجه !
این راهنما برای کاربرانی قابل استفاده است که اشتراک نسخه‌ی ابری Decision Optimization on the Cloud شرکت IBM را تهیه نموده‌اند.

بیشتر بخوانید

محدودیت های تنبل در CPLEX


بسته به شرایط فضای شدنی و تابع هدف، محدودیت‌ها عملکردهای متفاوتی از خود نشان می‌دهند: محدودیت‌های کارکردی، غیرکارکردی، الزام‌آور، غیرالزام‌آور، فعال، زائد و غیره. محدودیت‌های دیگری نیز در این فضا قابل ارائه است که برخی از خواص محدودیت‌های سنتی را دارا هستند: هم الزام‌آور و هم غیرالزام‌آور. جای تعجب نیست که چنین محدودیت‌هایی در علم بهینه‌سازی محاسباتی نقش‌آفرینی می‌کنند. یک دسته از این محدودیت‌ها به محدودیت‌های تنبل lazy constraints مشهور هستند. در این پست قصد داریم این دسته محدودیت‌ها را معرفی و با ویژگی‌ها و کارکردهای آن در نرم‌افزار CPLEX آشنا شویم.

بیشتر بخوانید

الگوریتم های تجزیه تا چه اندازه ای موثر هستند؟

  اکثر علاقه مندان علم تحقیق در عملیات و بهینه سازی شاید برای یک بار هم که شده کتاب آقای ویلیامز (Williams) تحت عنوان مدل‌سازی در برنامه‌ریزی ریاضی (Model building in mathematical programming) را در طول دوره تحصیل‌شان مطالعه یا شنیده باشند. بدون شک یکی از منابع ارزشمند در زمینه دانش مدل‌سازی این مرحع هست. در بخش تجزیه (decomposition) این کتاب، آقای ویلیامز شرح می دهد:

الگوریتم های تجزیه از اهمیت محاسباتی قابل توجهی برخوردار هستند به این ترتیب که این الگوریتم ها امکان حل مسایل یکپارچه را در ابعاد وسیع میسر می سازند. علی رغم این مساله،‌ روش های تجزیه با موفقیت های محاسباتی محدودی روبرو شده اند. الگوریتم دانتزیگ-ولف (Dantzig-Wolfe) محبوبیت بیشتری را در میان سایر الگوریتم های تجزیه بدست آورده است. علی رغم این محبوبیت اغلب اوقات حل مدل به صورت یکپارچه بسیار کاراتر از حل مدل توسط الگوریتم های تجزیه خواهد بود! مهمترین توصیه به شخصی که علاقه مند به تجزیه مساله مورد نظر خود و حل آن توسط یکی از روش های تجزیه می باشد اینه که این تصمیم حتما بایستی مبنای تجربی داشته باشد و صرفا جنبه تلاش-برای-حل-موثر نباشد.

بسیاری از علاقه‌مندان این روش‌ها از این موضوع شکایت دارند که ماه‌ها تلاش برای پیاده‌سازی روش‌های تجزیه همانند دانتزیگ ولف (dantzig wolf) یا بندرز (Benders) در نهایت منجر به بهبود اندکی در زمان حل و اجرای مدل شده‌اند.

پروفسور مارکو لوبکه (Marco Lübbecke) در پاسخ به این ابهام اذعان دارند که سرعت بخشی به این دسته الگوریتم‌ها دانش و مهارت‌های خاصی می‌طلبد. ایشان اشاره دارند که بسیاری از دانشجویان نسخه‌های ساده و پیش پا افتاده‌ای از این الگوریتم‌ها را بکار می‌گیرند که از عهده حل مثال‌هایی در مقیاس بزرگتر بر نخواهند آمد.

ایشان دو solver متن‌باز Dip و GCG را جهت شناسایی مشخصه‌های ساختاری مساله و پیاده‌سازی الگوریتم‌های تجزیه پیشنهاد کرده‌اند.

 

پشتیبانی CPLEX از روش های شاخه، برش و قیمت‌گذاری

با توجه به تعدد سوالات دوستان مبنی بر قابلیت‌های نرم‌افزار CPLEX در پیاده‌سازی دو الگوریتم شاخه و قیمت‌گذاری (branch&price) و شاخه و برش (branch&cut)، سه نکته مهم را بایستی خدمت این بزرگواران برسانیم:

۱- سالور cplex از الگوریتم branch&price پشتیبانی نمی‌کند. چرا؟ به این دلیل که این نرم‌افزار اجازه ایجاد متغیر جدید در حین فرایند حل را نمی‌دهد (حتی با استفاده از تکنیک‌های callbacks). توجه داشته باشیم که cplex از تکینک تولید ستون (column generation) حمایت می‌کند.

۲- هسته اصلی الگوریتم حل cplex مجهز به الگوریتم branch&cut است. همه برش‌هایی که در حین فرایند حل تولید می‌شوند در فایل option قابل سفارشی شدن هستند.

۳- سالور cplex از الگوریتم branch&cut اختصاصی پشتیبانی می‌کند. این موضوع در محیط نرم‌افزاری clplex پشتیانی نمی‌شود ولی در سایر پلتفرم‌های برنامه‌نویسی قابلیت‌های متنوعی برای اختصاصی کردن این الگوریتم وجود دارد. با استفاده از یکی از زبان‌های سطح بالا و همچنین قابلیت concert technology، می‌توان از کلاس ها و توابع UserCutCallback در این خصوص بهره گرفت.