رفع مشکل تحدب در مسایل درجه دو در نرم‌افزار IBM Ilog CPLEX

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

CPLEX Error 5002: Q in objective is not positive semi-definite (psd)

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

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

سه راهکار عمده جهت رفع خطای کمبود حافظه در نرم افزار CPLEX

در پست قبلی اشاره شد که چه عواملی منجر به ایجاد خطای کمبود حافظه (out of memory) در نرم افزار IBM Ilog CPLEX می‌شود. در این پست سه راهکار عمده جهت برطرف‌سازی این خطا را بررسی می کنیم. اولین و ساده‌ترین راهکار ممکن تغییر پارامتر thread به مقدار ۱ است. برای این منظور کافی است که یک بلوک پیش‌پردازنده‌ی execute به صورت زیر در ابتدای کد قرار داده شود.

execute {
 cplex.threads = 1;
}

با انجام این عمل، پردازش از حالت موازی خارج شده و جستجو به صورت تک نخی (single threading) صورت می‌گیرد. در این حالت به حجم حوضچه‌ی جواب (solution pool) کمتری نیاز خواهد بود.

راهکار بعدی اجازه دسترسی به مقدار بیشتری از حافظه موقت (RAM) هست. در حالت عادی نرم افزار تنها اجازه‌ی دسترسی به ۲ گیگابایت از فضای موقت را دارد.

execute {
 cplex.workmem = 4000;
}

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

execute {
 cplex.lpmethod = 1;
}