آموزش برنامه ریزی صفر و یک و روش بالاس

روش بالاس و برنامه ریزی صفر و یک

 

 

 

برنامه‌ریزی صفر و یک

هر متغیر صحیح که کراندار باشد را می‌توان به صورت متغیرهای صفر و یک نوشت. ساده‌ترین حالت آن می‌تواند به این صورت باشد که اگر

    \[0 \le x \le u\]

 صحیح باشد، که در آن u یک کران بالا برای متغیر x است. x را می‌توان به صورت زیر نوشت:

 

    \[x = {y_1} + {y_2} + ... + {y_n}\]

 

که در آن‌ y ها صفر و یک هستند. ولی این روش، روش مناسبی برای نشان دادن یک متغیر صحیح به صورت صفر و یک نمی‌باشد، زیرا تعداد متغیرهای صفر و یک مسئله زیاد می‌باشند. به عنوان مثال فرض کنید

    \[0 \le x \le 10000\]

 باشد آن‌گاه رابطه قبل به صورت زیر در خواهد آمد:

 

    \[x = {y_1} + {y_2} + ... + {y_{10000}}\]

 

روش دیگر (بهتر)، نمایش متغیر x به صورت زیر می‌باشد.

 

    \[x = {y_0} + 2{y_1} + {2^2}{y_2} + ... + {2^k}{y_k}\]

 

که در آن y ها صفر و یک هستند. و در آن k کوچک‌ترین عدد صحیحی است که در رابطه زیر صدق کند:

 

    \[{2^{k + 1}} - 1 \ge u\]

 

به عنوان مثال، فرض کنید

    \[0 \le x \le 7\]

 باشد، ابتدا بایستی k را بدست آوریم. کوچک‌ترین k ای که می‌توان بدست آورد که در رابطه بالا صدق کند برابر 2 می‌باشد.

پس داریم:

 

    \[x = {y_0} + 2{y_1} + {2^2}{y_2}\]

 

مثال: فرض کنید در یک مسئله IP متغیرهای عدد صحیح وجود دارد. با استفاده از محدودیت‌های موجود در مسئله به این نتیجه رسیده‌ایم که

    \[x \le 137\]

پاسخ:

 

    \[{2^{k + 1}} - 1 \ge 137 \to k = 7\]

 

پس داریم:

 

    \[x = {y_0} + 2{y_1} + 4{y_2} + 8{y_3} + 16{y_4} + 32{y_5} + 64{y_6} + 128{y_7}\]

 

الگوریتم حل مسائل صفر و یک

الگوریتم جمعی (روش بالاس، شمارش ضمنی)

برای استفاده از روش بالاس بایستی یکسری شرایط در مسئله حتما برقرار باشد، در صورت برقرار نبودن با یکسری تغییرات می‌توان شرایط مد نظر را ایجاد کرد.

شرایط اولیه حل مسائل با روش بالاس آن است که تمام متغیرها بایستی صفر و یک باشند، مسئله باید حتما max سازی و ضرایب تابع هدف همگی منفی (کمتر مساوی صفر) باشند. همچنین محدودیت‌ها باید حتما از جنس کمتر مساوی باشند، در غیر اینصورت با ضرب منفی می‌توان آن را درست کرد.

نکته: اگر ضرایب تابع هدف  مثبت بود آن را با

    \[1 - x'\]

 تعویض می‌کنیم.

 

مثال: مسئله زیر را با استفاده از روش بالاس حل نمایید.

 

    \[\begin{array}{l} \max z = - 10{x_1} - 20{x_2} - 30{x_3}\\ 3{x_1} - 5{x_2} - 2{x_3} \le - 6\\ - 2{x_1} - 8{x_2} - {x_3} \le - 7\\ {x_1},{x_2},{x_3} \in \{ 0,1\} \end{array}\]

 

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

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

 

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

    \[\begin{array}{l} 0 \le - 6\\ 0 \le - 7 \end{array}\]

که درست نمی‌باشند یعنی صفر از 6- و 7- کوچکتر نیست.

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

 

    \[\begin{array}{l} 0 + {s_1} = - 6 \to {s_1} = - 6\\ 0 + {s_2} = - 7 \to {s_2} = - 7 \end{array}\]

 

پس ما باید کاری کنیم که متغیرهای اسلک یعنی s1 و s2 بزرگتر از صفر شوند تا محدودیت‌ها شدنی شوند.

 

روش بالاس

 

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

 

    \[\begin{array}{l} 3{x_1} - 5{x_2} - 2{x_3} + {s_1} = - 6\\ - 2{x_1} - 8{x_2} - {x_3} + {s_2} = - 7 \end{array}\]

 

اگر به جای هر کدام از متغیرها، مقدار یک را قرار بدهیم، مقادیر s ها به صورت جدول زیر خواهند بود:

 

روش بالاس

 

آن متغیری بهتر است انتخاب شود، که مجموع s1 و s2 آن نزدیک صفر باشد. یعنی بتواند بهتر مقادیر اسلک را مثبت کند. پس متغیر x2 انتخاب می‌شود.

 

روش بالاس

 

شاخه سمت چپ به این خاطر نشدنی است (بسته شده است) که ما حتی اگر دو متغیر باقی مانده دیگر را هم مقدار یک بدهیم، محدودیت‌ها شدنی نخواهند شد. شاخه سمت راست هم هنوز s1 منفی است، پس باید هنوز شاخه زنی را ادامه بدهیم.

 

    \[\begin{array}{l} 3{x_1} - 2{x_3} + {s_1} = - 1\\ - 2{x_1} - {x_3} + {s_2} = 1 \end{array}\]

 

روش بالاس

 

پس بهتر است متغیر x3 را برای شاخه زدن انتخاب کنیم.

 

روش بالاس

 

جواب بهینه و نهایی مسئله، بدست آمد.

زیرا در شاخه زیر، مقادیر اسلک همگی مثبت شده‌اند و از طرفی سایر شاخه‌ها هم بسته شده‌اند.

زمان مطالعه : 3 دقیقه
تاریخ انتشار : 30 فروردین 1403تعداد بازدید : 10نویسنده : دسته بندی : برنامه ریزی عدد صحیح
ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

توسط
تومان