روش سیمپلکس (Simplex) | به زبان ساده
الگوریتم سیمپلکس (Simplex Algorithm) روشی برای به دست آوردن جواب بهینه یک تابع هدف خطی با دستگاهی از قیود است. این الگوریتم با یک رأس پایه از ناحیه شدنی (Feasible Region) شروع میشود و برای رئوس مجاور ادامه پیدا میکند. روش سیمپلکس تا رسیدن به جواب بهینه ادامه مییابد. ناحیهای که به قیود سیستم محدود میشود، ناحیه شدنی (Feasible Region) نامیده میشود. این ناحیه، مقادیر ممکن متغیرهایی را نشان میدهد که در همه قیود صدق میکنند. برای آنکه برنامهریزی خطی قابل اعمال باشد، ناحیه شدنی باید یک چندبر یا چندسقفی محدب (Convex Polytope) باشد (در حالت دوبعدی، یک چندضلعی محدب و در حالت سهبعدی، یک چندوجهی محدب و…). برای آشنایی بیشتر با ناحیه شدنی، به آموزش «برنامهریزی خطی در متلب» مراجعه کنید.


روش سیمپلکس مراحل و قواعد زیادی دارد. قبل از بیان الگوریتم کلی روش سیمپلکس، با یک مثال این مراحل و قواعد را بررسی میکنیم.
مثال ساده روش سیمپلکس
دستگاه قیود زیر را در نظر بگیرید:
میخواهیم تابع هدف زیر را با توجه به این قیود بیشینه کنیم:
حل: روش سیمپلکس با تبدیل قیود و توابع هدف به یک دستگاه معادلات آغاز میشود. این کار را میتوان با معرفی متغیرهای جدیدی به نام «متغیر لَنگی» یا «متغیر کمکی» یا «متغیر کمبود» (Slack Variables) انجام داد. متغیرهای کمکی اختلاف یا اسلک مثبت بین سمت چپ یک نامعادله و سمت راست آن را نشان میدهند.
بنابراین، نامعادله
به تساوی زیر تبدیل میشود:
به طور مشابه، نامعادله
با تساوی زیر معادل است:
علاوه بر متغیرهای کمکی، متغیر را نیز تعریف میکنیم که مقدار تابع هدف را نشان میدهد. در نتیجه، میتوان نوشت:
معادلات بالا منجر به دستگاه معادلات زیر خواهد شد:
دستگاه معادلات بالا را به فرم ماتریس افزوده مینویسیم:

این ماتریس نشان میدهد که همه متغیرهای این دستگاه (شامل ، و ) بزرگتر از یا مساوی با صفر هستند. ضرایب متغیرهای و در سطر ، صفر است. این متغیرها متغیرهای اساسی (Basic Variables) نامیده میشوند. متغیرهای و ضرایب غیرصفری در سطر دارند و متغیرهای غیراساسی (Non-basic Variables) نامیده میشوند. در هر لحظه از الگوریتم، جواب اساسی با صفر قرار دادن متغیرهای غیراساسی به دست میآید. بنابراین، اکنون جواب اساسی به صورت زیر است:
به تأثیر افزایش مقادیر متغیرهای غیراساسی روی متغیر توجه کنید. افزایش هر یک از متغیرهای و سبب افزایش خواهد شد، زیرا ضرایب و در سطر منفی است. در نتیجه، این جواب بهینه نیست.
تکرار روش سیمپلکس شامل تبادل متغیرهای اساسی و متغیرهای غیراساسی با استفاده از عملیاتی سطری مقدماتی ماتریسی است. در هر مرحله از فرایند، یک متغیر غیراساسی در سطر حذف میشود و یک متغیر اساسی دیگر جای آن را به عنوان متغیر غیراساسی میگیرد. این سطر، «لولا» (Pivot) نامیده میشود.
فرض کنید از سطر حذف شده باشد. این کار را میتوان توسط سطر یا انجام داد.
حالت ۱: حذف در سطر توسط سطر :
در این لولا، متغیر به عنوان یک متغیر اساسی وارد میشود و متغیر خارج میشود تا یک متغیر غیراساسی شود. اکنون را از سطر حذف میکنیم:
که منجر به جواب اساسی زیر خواهد شد:
این جواب نشدنی است، زیرا منجر به منفی شدن یکی از متغیرها شده است.
حالت ۲: حذف در سطر توسط سطر
در این لولا، متغیر به عنوان یک متغیر اساسی وارد شده و متغیر به یک متغیر غیراساسی تبدیل شده و خارج میشود. اکنون را از سطر حذف میکنیم:
در نتیجه، جواب اساسی زیر را خواهیم داشت:
این جواب قابل قبول است، اما بهینه نیست؛ زیرا یک ضریب منفی در سطر وجود دارد. این بدین معنی است که با افزایش میتوان را زیاد کرد. یک لولای دیگر برای یافتن جواب بهینه لازم است.
خوشبختانه میتوان با مشاهده نسبت درایه ستون سمت راست ماتریس افزوده به ضریب متغیر ورودی، مشاهده کرد که کدام لولا منجر به یک جواب شدنی خواهد شد. متغیر را به عنوان متغیر ورودی در نظر گرفته و نسبتها را محاسبه میکنیم:
برای متغیر وارد شده ، نسبت برای سطر برابر با و برای سطر برابر با است. انتخاب سطری که نسبت را کمینه میکند، تضمین خواهد کرد که لولا منجر به یک جواب شدنی شود. بنابراین، سطر را باید به عنوان سطر لولا انتخاب کرد.
با حذف در سطر با استفاده از سطر ، داریم:
حذف در سطر نیز به صورت زیر است:
در نتیجه، جواب اساسی زیر را خواهیم داشت:
این جواب باید بهینه باشد، زیرا هر افزایش در متغیرهای غیراساسی و سبب کاهش در خواهد شد. بنابراین، مقدار بیشینه تابع هدف برابر است با:

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

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

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

مثالی از عدم کارایی دوگان روش سیمپلکس
دستگاه قیود زیر را در نظر بگیرید.
میخواهیم تابع زیر کمینه شود:
نشان دهید این کار را نمیتوان با استفاده از روش سیمپلکس معمولی یا روش دوگان انجام داد.
پاسخ: این مسئله را به فرم یک ماتریس سیمپلکس مینویسیم و میبینیم که یک جواب اساسی اولیه نشدنی دارد:
با نوشتن دوگان مسئله به صورت یک ماتریس سیمپلکس نیز یک جواب اساسی اولیه نشدنی خواهیم داشت:
وقتی یک جواب اساسی اولیه نشدنی است، میتوان از روش M بزرگ استفاده کرد. ایده پشت این روش، معرفی متغیرهای مصنوعی یا ساختگی (Artificial Variables) برای جابهجایی جواب به ناحیه شدنی است. برخلاف متغیرهای کمکی، باید مقدار این متغیرهای ساختگی در جواب نهایی صفر باشد.
روش M بزرگ
- این روش برای هر مسئله برنامهریزی خطی که با فرمهای قبل سازگار نیست، مطابقت دارد. همچنین، برای مسائلی که شامل محدودیتهایی به صورت تساوی هستند، مناسب است.
- متغیرهای کمکی و متغیر را مانند روش سیمپلکس پایه تعیین کرده و یک ماتریس سیمپلکس را ایجاد کنید. برای هر متغیر کمکی که دارای مقدار منفی در جواب اساسی اولیه است، یک متغیر ساختگی مجزا را به آن محدودیت اضافه کنید. همچنین یک متغیر ساختگی مشخص را به هر قید تساوی اضافه کنید. متغیرهای ساختگی با ضریب در هر سطر محدودیت شروع میشوند. در سطر تابع هدف، هر متغیر مصنوعی با ضریب یکسان شروع می شود. یک مقدار ثابت مثبت دلخواه را نشان میدهد.
- اگر مسئله کمینهسازی باشد، آنگاه ضرایب سطر تابع هدف قرینه میشوند و هرف بیشینه کردن خواهد بود.
- با لولاها و با استفاده از یک متغیر کمکی منفی به عنوان یک متغیر خروجی و یک متغیر ساختگی به عنوان متغیر ورودی، جواب را به ناحیه شدنی جابهجا کنید.
- وقتی جواب اساسی در ناحیه شدنی قرار گرفت، مانند روش سیمپلکس کار را ادامه دهید.
- وقتی در حال اجرای روش سیمپلکس هستید، باید مطمئن باشید که عناصر سمت راست ماتریس مثبت هستند. اگر یک عنصر در سمت راست مثبت نباشد، آن سطر را در ضرب کنید تا مثبت شود. اگر یک عنصر در سمت راست ماتریس باشد، آنگاه مطمئن شوید ضریب متغیر اساسی در آن سطر مثبت است.
- متغیر وارد شونده را با مشاهده ضریب در سطر انتخاب کنید که از همه منفیتر است. سطرهای لولا را با انتخاب سطری که نسبت عنصر سمت راست ماتریس افزوده را به ضریب متغیر وارد شونده کمینه میکند، انتخاب کنید. این نسبت باید نامنفی بوده و ضریب متغیر وارد شونده در سطر لولا باید مثبت باشد.
- یک جواب بهینه نمیتواند شامل هرگونه متغیر ساختگی باشد. اگر سطر ماتریس شامل ضرایب نامنفی نباشد، و جواب شامل یک متغیر ساختگی باشد، آنگاه مسئله جواب نخواهد داشت.

مثال اول روش M بزرگ
دستگاه قیود زیر را در نظر بگیرید.
میخواهیم تابع زیر را کمینه کنیم:
با توجه به مثال قبل، میدانیم که قید سوم منجر به جواب نشدنی میشود. برای جبران این موضوع، متغیر ساختگی را معرفی میکنیم. در تابع هدف، این متغیر دارای ضریب خواهد بود. یک مقدار ثابت بزرگ دلخواه است. قیود و تابع هدف جدید به صورت زیر خواهند بود:
و به فرم ماتریسی، داریم:
هدف نخست در روش M بزرگ، جابهجایی مسئله به ناحیه شدنی است. جواب اساسی کنونی دارای است. این متغیر، متغیر خروجی خواهد بود و متغیر ساختگی ، متغیر ورودی است:
اکنون جواب در ناحیه شدنی است و تمام متغیرهای اساسی مثبت هستند:
واضح است که این جواب صحیح نیست، زیرا شامل یک متغیر ساختگی غیرصفر است. علاوه بر این، ضرایب منفی در سطر وجود دارد. اکنون میتوان از روش M بزرگ مانند سیمپلکس استفاده کرد. هدف جدید، آوردن متغیرهای با ضرایب منفی به سطر است. از آنجا که منفیترین ضریب در سطر است، ابتدا این متغیر وارد خواهد شد. سطری که نسبت درایه ستون سمت راست و ضریب را کمینه میکند، است، بنابراین، به این سطر وارد خواهد شد:
این جواب، دیگر شامل متغیر ساختگی نیست، اما هنوز هم بهینه نیست، زیرا ضریب سطر منفی است. باید متغیر بعدی برای ورود باشد. حداقل نسبت مثبت برای این متغیر در سطر است:
اکنون باید متغیر ورودی باشد و تنها سطر با نسبت مثبت است:
واضح است که جواب بهینه برابر خواهد بود با:
مثال دوم روش M بزرگ
شرکتی در حال برنامهریزی برای تنظیم ساعت کاری هفته آینده کاگرانش است. در خط مونتاژ، بهروز ۵ واحد در ساعت مونتاژ میکند و هنگامی که در خط بستهبندی است، ۱۰ واحد در ساعت بستهبندی میکند. فردین فقط روی خط مونتاژ کار میکند و ۴ واحد در ساعت مونتاژ میکند. دستمزد بهروز ۱۲ دلار در ساعت و دستمزد فردین ۹ دلار است. شرکت تا پایان هفته باید حداقل ۲۰۰ واحد مونتاژ شده و بستهبندی شده را تحویل دهد و میتواند حداکثر ۴۰ ساعت به هر کدام اختصاص دهد. این شرکت برای به حداقل رساندن دستمزد کارگران چگونه باید برنامهریزی کند؟

پاسخ: این مسئله را میتوان با روشهای سادهتری حل کرد، اما در اینجا از روش M بزرگ استفاده میکنیم تا روش کار با قیود مختلف را بررسی کنیم.
فرض کنید و ، به ترتیب، تعداد ساعتهایی باشند که بهروز و فردین در خط مونتاژ کار میکنند. همچنین، تعداد ساعتهایی است که بهروز در خط بستهبندی کار میکند. هرکدام از این دو نفر، حداکثر میتوانند ۴۰ ساعت کار کنند. بنابراین، قیود زیر را خواهیم داشت:
شرکت نمیخواهد وقتی واحد مونتاژ شده برای بستهبندی وجود ندارد، وقتی تلف شود. بنابراین، تعداد واحدهای مونتاژ شده باید برابر با تعداد واحدهای بستهبندی شده باشد. این گفته را میتوان به صورت زیر نوشت:
تعداد واحدهای مونتاژ شده و باید حداقل ۲۰۰ باشد. این موضوع را میتوان با قیود زیر نوشت:
در نتیجه، دستگاه قیود زیر را خواهیم داشت:
تابع هدف به صورت زیر است:
دستگاه قیود و تابع هدف را به یک ماتریس سیمپلکس تبدیل میکنیم:
جواب اساسی کنونی نشدنی است:
از آنجا که یک مقدار نشدنی دارد، سطری که شامل آن است، به یک متغیر ساختگی نیاز دارد. قید تساوی نیز به یک متغیر ساختگی نیاز دارد. این متغیرهای ساختگی دارای ضریب در سطر هستند:
برای جابهجا کردن جواب به ناحیه شدنی، متغیر خارج شونده و متغیر وارد شونده خواهد بود. لولا را میتوان در سطر انجام داد:
متغیر ساختگی دیگر نیز باید به جواب اساسی جابهجا شود.
اکنون الگوریتم را مانند روش سیمپلکس ساده اجرا میکنیم. هدف، حذف ضرایب منفی سطر است. از آنجا که هر مقدار ثابت مثبت بزرگ دلخواهی میتواند باشد، منفیترین ضریب در سطر است. بنابراین، متغیر وارد شونده خواهد بود. انتخاب سطر لولا نسبت به روش سیمپلکس ساده چالش بیشتری دارد.
مشاهده میکنیم که هر مقدار در سمت راست سطرهای قیود به جز مقدار سطر مثبت است. در این سطر، سمت راست است و متغیر اساسی آن، ، دارای یک ضریب مثبت است. دو مورد زیر مهم هستند:
- مقادیر سمت راست سطرهای قیود مثبت هستند، یا
- اگر مقدار سمت راست باشد، آنگاه ضریب متغیر اساسی در آن سطر مثبت است.
این امر انتخاب صحیح سطر لولا را تضمین خواهد کرد. سطر لولا با انتخاب سطری که در آن، نسبت عنصر سمت راست ماتریس افزوده به ضریب متغیر وارد شونده کمینه است، انتخاب میشود و ضریب متغیر وارد شونده مثبت است.
بنابراین، حداقل نسبت برای متغیر وارد شونده از سطر است. این سطر، سطر لولا خواهد بود:
اکنون، منفیترین ضریب در سطر است. بنابراین، متغیر وارد شونده خواهد بود. سطر دوباره به عنوان سطر لولا انتخاب نخواهد شد، زیرا یک ضریب منفی برای این متغیر دارد. سطری که نسبت را کمینه میکند، سطر است:
حال، منفیترین ضریب در سطر است. متغیر وارد شونده و نسبت کمینهکننده در سطر خواهد بود:
اکنون منفیترین ضریب در سطر است. متغیر وارد شونده و نسبت کمینهساز در سطر است:
با مثبت بودن همه ضرایب در سطر و نبود متغیر ساختگی در جواب، جواب بهینه است و به صورت زیر خواهد بود:
بنابراین، شرکت باید از بهروز به مدت ۸ ساعت در خط مونتاژ و ۲۰ ساعت در خط بستهبندی استفاده کند. همچنین، فردین باید ۴۰ ساعت در خط مونتاژ کار کند. این منجر به ۹۶۹ دلار برای یک هفته میشود.

روش سیمپلکس در متلب
برای پیادهسازی روش سیمپلکس در متلب، میتوانید از برنامه زیر استفاده کنید.
در برنامه بالا، تابع هدف به صورت زیر تعریف شده است:
قیود نیز به شکل زیر هستند:
برای مثال، فرض کنید میخواهیم را با توجه به قیود زیر کمینه کنیم:
قیود را به فرم استاندارد برنامه مینویسیم:
که در آن، است.
بنابراین:
و
و

برای حل مسئله با متلب، از nma_simplex استفاده میکنیم:
که نتیجه اجرای آن به صورت زیر خواهد بود:
>>>>Current tableau [phase one] 4 2 -1 0 1 0 12 1 4 0 -1 0 1 6 0 0 0 0 1 1 0 *********************** Current tableau [phase one] 4 2 -1 0 1 0 12 1 4 0 -1 0 1 6 -5 -6 1 1 0 0 0 pivot row is 2 current basic feasible solution is 0 1.5000 0 0 9.0000 0 *********************** Current tableau [phase one] 3.5000 0 -1.0000 0.5000 1.0000 -0.5000 9.0000 0.2500 1.0000 0 -0.2500 0 0.2500 1.5000 -3.5000 0 1.0000 -0.5000 0 1.5000 9.0000 pivot row is 1 current basic feasible solution is 2.5714 0.8571 0 0 0 0 *********************** Current tableau [phase one] 1.0000 0 -0.2857 0.1429 0.2857 -0.1429 2.5714 0 1.0000 0.0714 -0.2857 -0.0714 0.2857 0.8571 0 0 0 0 1.0000 1.0000 18.0000 *********************** Current tableau [phase two] 1.0000 0 -0.2857 0.1429 2.5714 0 1.0000 0.0714 -0.2857 0.8571 2.0000 3.0000 0 0 0
میبینیم که جواب و است. مقدار بهینه تابع هدف نیز به شکل زیر خواهد بود:
با استفاده از نرمافزار اکسل نیز میتوان مسائل را به روش سیمپلکس به آسانی حل کرد. برای آشنایی با پیادهسازی روش سیمپلکس در اکسل، پیشنهاد میکنیم مطلب «سیمپلکس در اکسل — راهنمای کاربردی» را مطالعه کنید.
آزمون روش سیمپلکس
۱. الگوریتم سیمپلکس برای حل چه نوع مسائلی مناسب است و تابع هدف خطی در این روش چه نقشی دارد؟
برای بهینهسازی شبکههای عصبی و یادگیری عمیق توسعه یافته است.
تنها برای جستوجوی تصادفی در فضای جواب به کار میرود.
برای حل مسائل برنامهریزی خطی با تابع هدف خطی و قیود خطی استفاده میشود.
برای حل مسائل غیرخطی که تابع هدف پیچیده دارند کاربرد دارد.
الگوریتم سیمپلکس برای حل مسائل برنامهریزی خطی مناسب است که شامل یک تابع هدف خطی و مجموعهای از قیود خطی است. نقش تابع هدف خطی این است که مقداری که باید بیشینه یا کمینه شود را مشخص میکند و کل روند جابهجایی میان راسهای ناحیه شدنی بر اساس بهبود همین مقدار است.
۲. در برنامهریزی خطی، برای اینکه الگوریتم سیمپلکس قابل اجرا باشد، ناحیه شدنی باید چه ویژگی هندسی مهمی داشته باشد؟
ناحیه باید بدون هیچ راس هندسی باشد.
ناحیه باید کاملا دایرهای شکل باشد.
ناحیه باید به صورت یک چندبر محدب باشد.
ناحیه باید تنها از خطوط موازی تشکیل شده باشد.
اجرای موفق سیمپلکس نیازمند آن است که ناحیه شدنی یک چندبر محدب باشد، زیرا فقط در این حالت میتوان تضمین کرد با حرکت از یک راس به راس دیگر به بهینهترین نقطه رسید. ویژگی «چندبر محدب بودن» امکان بررسی راسها را فراهم میکند، در حالی که «دایرهای بودن»، «تشکیل از خطوط موازی» یا «فاقد راس بودن» هیچکدام شرایط ضروری برای اجرای سیمپلکس نیستند و حتی با این اشکال هندسی، روند سیمپلکس به درستی عمل نمیکند.
۳. متغیر اسلک در سیمپلکس به چه منظوری معرفی میشود و در کدام گام از حل استفاده میگردد؟
برای تعریف شروط توقف در پایان تکرارها مورد استفاده قرار میگیرد.
برای تبدیل تابع هدف به فرم استاندارد هنگام یافتن بهینه نهایی وارد میشود.
برای تعیین متغیرهای اساسی و غیر اساسی پس از محاسبه ماتریس افزوده لازم است.
برای تبدیل قیود نامعادله به معادله در مرحله نخست حل کاربرد دارد.
عبارت «برای تبدیل قیود نامعادله به معادله در مرحله نخست حل کاربرد دارد» صحیح است چون طبق توضیح، متغیر اسلک هنگام تبدیل دستگاه نامعادلات به معادلات اضافه میشود تا شرایط قیود مازاد جبران گردد و فرم استاندارد ماتریسی ایجاد شود.
۴. در حل مسائل به روش سیمپلکس، منظور از متغیرهای اساسی و غیراساسی چیست و نقش آنها در هر تکرار الگوریتم چیست؟
متغیرهای غیراساسی همیشه نقش متغیر کمکی دارند و در معادلات وارد نمیشوند.
متغیرهای غیراساسی فقط برای تبدیل نامعادلات به معادلات استفاده میشوند و تغییر نمیکنند.
متغیرهای اساسی تعیینکننده وضعیت نقطه فعلی روی راس ناحیه شدنی هستند و غیراساسیها صفر باقی میمانند.
متغیرهای اساسی مقدار غیرصفر میگیرند و در تکرار بعدی تعیین میشوند.
متغیرهای اساسی در هر مرحله مشخص میسازند که نقطه فعلی روی کدام راس ناحیه شدنی قرار دارد و مقادیر آنها غیرصفر است. در مقابل، متغیرهای غیراساسی مقدار صفر دارند و تا انتخاب جدید وارد روند حل نمیشوند. نقش کلیدی متغیرهای اساسی، تعیین وضعیت راس فعلی و امکان جابهجایی به راسهای مجاور با تغییر ترکیب اساسیها است. عبارات مربوط به «متغیر کمکی» یا «تبدیل نامعادلات» مفهوم اصلی اساسی و غیراساسی را بیان نمیکنند، و تنها ترکیب فعلی اساسیها و غیراساسیها اهمیت دارد.
۵. در فرایند حل مسائل کمینهسازی با روش سیمپلکس، چه رابطهای میان مساله اصلی و مساله دوگان برقرار است؟
مقدار کمینه مسئله اصلی همیشه بزرگتر از مقدار بیشینه دوگان است.
هر جواب شدنی در مسئله اصلی متناظر با یک جواب نشدنی در دوگان خواهد بود.
مسئله کمینهسازی را میتوان به یک مساله دوگان بیشینهسازی با ترانهاده ضرایب تبدیل کرد.
در کمینهسازی، متغیرهای کمکی تنها در دوگان ظاهر میشوند.
در روش سیمپلکس برای مسائل کمینهسازی، ضریبهای ماتریس را ترانهاده میکنند و مساله به یک مسئله دوگان بیشینهسازی تبدیل میشود، به طوری که مقدار بیشینه در دوگان دقیقا با مقدار کمینه در اصلی برابر خواهد شد.
۶. در روش سیمپلکس، چرا الگوریتم به جای حرکت درون ناحیه شدنی، فقط بین راسهای آن حرکت میکند و این راسها چه نقشی دارند؟
چون فقط داخل ناحیه شدنی میتوان متغیرها را آزادانه تغییر داد و راسها اهمیت خاصی ندارند.
زیرا هر راس نمایانگر یک نقطه ممکن بهینه است و الگوریتم با جابجایی بین راسها سریعتر به جواب میرسد.
جابهجایی میان راسها از اتلاف محاسباتی جلوگیری میکند اما ممکن است به جواب بهینه نرسد.
الگوریتم برای حفظ محدب بودن ناحیه، مسیر خود را فقط در مرز ناحیه طی میکند، نه راسها.
در سیمپلکس، نقاط راس ناحیه شدنی مکانهایی هستند که تمامی قیود برقرار بوده و اغلب جواب بهینه نیز در یکی از این نقاط قرار دارد. حرکت بین راسها باعث میشود الگوریتم تنها نقاط اساسی را بررسی کند و این فرایند اثربخش است، زیرا جستجو در تمام ناحیه شدنی ضرورتی ندارد. جمله «هر راس نمایانگر یک نقطه ممکن بهینه است و الگوریتم با جابجایی بین راسها سریعتر به جواب میرسد» صحیح است، زیرا معمولا پاسخ در همین نقاط رخ میدهد؛ سایر گزینهها نادرست یا ناقصاند، چرا که فقط راسها تضمینکننده شدنی و بهینگیاند و تمرکز سیمپلکس روی آنهاست.
۷. در روش سیمپلکس، در چه شرایطی باید اجرای الگوریتم را متوقف کرد و چرا توجه به علامت ضرایب تابع هدف اهمیت دارد؟
هنگامی که همه ضرایب تابع هدف در سطر آخر مثبت باشند، الگوریتم متوقف میشود چون پاسخ بهینه به دست آمده است.
اگر مجموع تمام عناصر سطر Pivot کمتر از صفر شود، باید کار را متوقف کرد چون شرط بهینگی نقض شده است.
زمانی که هیچ متغیر اسلک در دستگاه معادلات وجود نداشته باشد، حل متوقف میشود چون به جواب شدنی میرسیم.
در صورتی که متغیرهای غیراساسی مقدار صفر داشته باشند، عملیات سیمپلکس پایان مییابد.
در اجرای الگوریتم سیمپلکس زمانی که همه ضرایب تابع هدف در سطر آخر جدول سیمپلکس مثبت شوند، معنی آن این است که دیگر هیچ متغیری وجود ندارد که افزایش مقدارش، مقدار تابع هدف را بهبود دهد. بنابراین بهترین مقدار ممکن حاصل شده است و عملیات باید متوقف شود.
۸. در صورت وجود قید تساوی یا جواب اولیه نشدنی در یک مساله برنامهریزی خطی، چرا نمیتوان فقط از روش سیمپلکس معمولی بهره برد؟
چون سیمپلکس معمولی فقط برای کمینهسازی طراحی شده و به بیشینهسازی پاسخ نمیدهد.
چون سیمپلکس معمولی همیشه لازم است ضرایب تابع هدف منفی باشند.
زیرا سیمپلکس معمولی نمیتواند متغیرهای اسلک را به طور خودکار حذف کند.
زیرا سیمپلکس معمولی صرفا برای مسائل با قیود نامساوی مناسب است و با تساوی یا نشدنی بودن جواب اولیه شروع نمیشود.
زمانی که قید تساوی یا نشدنی بودن جواب اولیه وجود دارد، سیمپلکس معمولی قادر به آغاز حرکت از یک نقطه شدنی نیست و ابزار لازم برای مدیریت این شرایط خاص را ندارد، چون اساسا این روش برای قیود نامساوی و پیدا کردن راسی شدنی طراحی شده است. برای شرایط تساوی یا نشدنی بودن، باید از ابزارهایی مثل متغیرهای ساختگی (Artificial Variable) و روش M بزرگ بهره گرفت تا محل شروع شدنی فراهم شود. دیگر گزینهها نادرستند؛ سیمپلکس برای هر دو نوع بهینهسازی استفاده میشود، حذف اسلک به صورت خودکار نیست و ضرایب تابع هدف لازم نیست همیشه منفی باشند.
۹. چه تفاوت ساختاری مهمی میان فرم سیمپلکس برای بیشینهسازی و کمینهسازی وجود دارد؟
در بیشینهسازی، تابع هدف همواره منفی در نظر گرفته میشود.
در کمینهسازی، تنها قیود با علامت کمتر مساوی وارد میشوند.
در بیشینهسازی، متغیر اسلک (Slack) حذف و فقط متغیر مصنوعی اضافه میشود.
در کمینهسازی، ماتریس ضرایب ترانهاده میشود تا به دوگان تبدیل شود.
تفاوت کلیدی این است که برای حل مسائل کمینهسازی، ماتریس ضرایب ترانهاده و به فرم دوگان بازنویسی میشود تا امکان استفاده از ساختار سیمپلکس برای بیشینهسازی فراهم شود. دیگر گزینهها صحیح نیستند؛ زیرا در مسائل بیشینهسازی حذف متغیر اسلک وجود ندارد و الزامی به افزودن فقط متغیر مصنوعی نیست، در کمینهسازی الزاما قیود فقط با علامت کمتر مساوی وارد نمیشوند، و در بیشینهسازی تابع هدف به عنوان مقدار منفی تعریف نمیشود.
۱۰. در چه موقعیتهایی در حل مسائل برنامهریزی خطی لازم است از متغیر ساختگی و روش M بزرگ بهره بگیریم؟
وقتی همه قیود صرفا نامساوی از نوع بیشینه باشند و جواب شدنی باشد.
وقتی دستگاه معادلات به صورت استاندارد و ساده قابل حل باشد.
وقتی جواب اولیه به دلیل قیدهای تساوی یا نشدنی وجود نداشته باشد.
وقتی ضرایب تابع هدف در شروع همه مثبت باشند.
در شرایطی که مسئله دارای قیدهای تساوی یا قیدهایی باشد که جواب اولیه شدنی تولید نمیکنند، باید از متغیر ساختگی و روش M بزرگ استفاده شود. این ابزار کمک میکند تا وارد ناحیه شدنی شویم و حل سیمپلکس قابل شروع شود.
۱۱. در روش سیمپلکس، انتخاب سطر و ستون Pivot در هر تکرار بر چه اساسی صورت میگیرد و این انتخاب چه نقشی در فرایند حل دارد؟
انتخاب Pivot به صورت تصادفی انجام میشود و هدف فقط تکرارسازی بیشتر است.
ستون Pivot از ضرایب منفی تابع هدف و سطر Pivot براساس نسبت مقدار سمت راست به مقدار ستون Pivot انتخاب میشود تا حرکت به سمت راس مجاور شدنی انجام شود.
سطر و ستون Pivot براساس کمترین مقدار در ماتریس افزوده انتخاب میشوند تا سریعترین همگرایی حاصل شود.
همیشه اولین سطر و ستون غیرصفر ماتریس به عنوان Pivot انتخاب میشوند تا کار الگوریتم سادهتر شود.
در هر تکرار سیمپلکس، ابتدا ستونی با ضریب منفی در سطر تابع هدف به عنوان ستون Pivot انتخاب میشود، زیرا ورود این متغیر میتواند مقدار تابع هدف را بهبود بخشد. سپس برای تعیین سطر Pivot، نسبت مقدار سمت راست هر سطر به عنصر مثبت همان ستون محاسبه میشود و کمترین نسبت انتخاب میگردد تا حرکت به سوی راسی مجاور که همچنان شدنی باقی میماند انجام شود. این روش موجب ادامه مسیر روی رئوس ناحیه شدنی و تضمین پیشروی به سمت بهینگی میشود. انتخاب بر اساس سطر و ستون غیرصفر، مقدار کمترین کل ماتریس یا به صورت تصادفی، هیچکدام روند حل درست سیمپلکس و حرکت به سمت جواب بهینه را تضمین نمیکنند.
۱۲. در هنگام مدلسازی قیود مختلف در یک مساله سیمپلکس، معیار اصلی انتخاب بین متغیر اسلک و متغیر ساختگی چیست؟
اگر قید بهصورت نامساوی بیشینه باشد، متغیر اسلک بهکار میرود.
تنها برای قیود کمینه، متغیر ساختگی الزامی است.
در هر قید، ابتدا متغیر اسلک و سپس متغیر ساختگی افزوده میشود.
برای قیدهای تساوی یا نشدنی، متغیر ساختگی لازم است.
زمانی که یک قید بهصورت نامساوی بیشینه باشد، متغیر اسلک اضافه میشود تا به معادله تبدیل شود. اما اگر قید از نوع تساوی باشد یا مقدار اولیه آن امکانپذیر نباشد (نشدی)، به متغیر ساختگی نیاز داریم تا بتوان روند سیمپلکس را شروع کرد.
۱۳. اگر در طول حل سیمپلکس، پس از انتخاب سطر و ستون Pivot، عنصر اصلی صفر شود، چه نتیجهای میتوان گرفت و چه باید کرد؟
تغییر سطر Pivot و انتخاب عنصر غیرصفر در همان ستون Pivot
متوقف کردن حل و قبول عدم وجود جواب شدنی برای مساله
ادامه تکرارها بدون تغییر، زیرا این حالت معمولا مشکلی ایجاد نمیکند.
مسئله دارای جواب بنیادی غیر یکتا یا بینهایت جواب است و باید بررسی دقیقتر انجام شود.
وقتی عنصر Pivot برابر صفر شود، نشاندهنده وجود وضعیت خاصی مانند بنیادی غیر یکتا یا بینهایت جواب است. در این حالت باید ساختار ماتریس بررسی شود تا مشخص شود آیا همه نسبتها نامحدود یا چند Pivot محتمل وجود دارد، نه این که بلافاصله آن را نشانه عدم وجود جواب شدنی یا ضرورت توقف بدانیم. صرفا ادامه روند بدون توجه میتواند موجب خطا شود.
۱۴. در هنگام اجرای سیمپلکس در متلب، چه معیاری برای تشخیص رسیدن به جواب بهینه مورد استفاده قرار میگیرد؟
همه متغیرهای اسلک مقدار صفر بگیرند.
مقدار تابع هدف با مقدار اولیه برابر شود.
همه ضرایب ستونهای قیود منفی شوند.
تمام ضرایب سطر تابع هدف در ماتریس افزوده مثبت شده باشند.
اگر پس از پایان اجرای سیمپلکس در متلب، تمامی ضرایب موجود در سطر تابع هدف در ماتریس افزوده مثبت باشند، این نشانه بهینگی محسوب میشود. در این حالت، هیچ متغیر غیراساسی با ضریب منفی باقی نمانده که امکان بهبود مقدار تابع هدف را داشته باشد.
۱۵. اگر یک مساله دارای قیود از نوع کمینه، بیشینه و تساوی باشد و هیچ یک از روشهای سیمپلکس معمولی یا دوگان به جواب نرسند، چه نتیجهای میتوان درباره شرایط این مساله گرفت؟
مساله دارای جواب بینهایت و غیر یکتا است.
هیچ روشی برای حل این گونه مسائل وجود ندارد.
بهینهسازی با سیمپلکس نیازمند استفاده از روش M بزرگ است.
ناحیه شدنی این مساله وجود ندارد یا خالی است.
در مسائلی که ترکیبی از قیود کمینه، بیشینه و تساوی دارند و سیمپلکس معمولی و حتی دوگان جواب نمیدهد، باید از روش M بزرگ (Big M method) و افزودن متغیرهای ساختگی استفاده کرد. این راهکار به دلیل نشدنی بودن اولیه یا ترکیب قیود لازم است، در حالی که نبود ناحیه شدنی یا بینهایت جواب، علت اصلی نیست. همچنین، نتیجه اینکه هیچ روشی وجود نداشته باشد نادرست است؛ زیرا روش M بزرگ یا مشابه آن قابلیت رفع این مشکل را دارند.
۱۶. در پایان حل یک مساله با روش M بزرگ، چگونه میتوان اطمینان یافت که جواب به دست آمده واقعا بهینه است؟
اگر مقدار متغیرهای اسلک بزرگتر از صفر شود.
اگر متغیرهای ساختگی در جواب نهایی مقدار صفر داشته باشند.
اگر تمام ضرایب M در سطر تابع هدف مثبت باشند.
اگر متغیرهای اصلی مقدار منفی پیدا کنند.
زمانی که با روش M بزرگ مسئله را حل میکنیم، علامت بهینگی واقعی زمانی به دست میآید که تمام متغیرهای ساختگی در پایان مقدار صفر داشته باشند. این نشانه آن است که هیچ وابستگی به متغیرهای ساختگی در ساختار جواب وجود ندارد و الگوریتم به ناحیه شدنی اصلی رسیده است. در حالی که مثبت بودن ضرایب M در سطر تابع هدف، مقدار مثبت متغیرهای اسلک یا منفی بودن متغیرهای اصلی هیچکدام به معنای تضمین بهینگی کامل نیست و ممکن است جواب شدنی یا بهینه نباشد، به ویژه اگر متغیر ساختگی حضور فعال داشته باشد.
۱۷. در زمان تبدیل دستگاه نامعادلات به دستگاه معادلات با روش سیمپلکس، تعداد متغیرهای اسلک یا ساختگی چگونه با تعداد قیود مرتبط است؟
تعداد متغیرهای ساختگی نصف تعداد قیود خطی است.
برای هر متغیر اصلی یک متغیر اسلک وارد میشود.
برای هر قید یک متغیر اسلک یا ساختگی افزوده میشود.
همیشه تعداد متغیرهای اسلک برابر با تعداد متغیرهای اصلی است.
در تنظیم دستگاه معادلات سیمپلکس، به ازای هر قید نامعادله یک متغیر اسلک یا ساختگی اضافه میشود تا تبدیل به معادله گردد؛ بنابراین جمله «برای هر قید یک متغیر اسلک یا ساختگی افزوده میشود» صحیح است.
۱۸. در صورت مواجهه با یک مساله برنامهریزی خطی که سیمپلکس پاسخی برای آن نمیدهد، چه نشانهای وجود دارد و چه کاری باید انجام داد؟
وجود قیود متعدد و انتخاب سرستون دلخواه برای Pivot
منفی ماندن ضرایب سطر تابع هدف و استفاده از روش M بزرگ
توقف الگوریتم پس از یک تکرار و انتخاب متغیر ساختگی
وجود نسبتهای نامعین در Pivot و بررسی حالتهای دوگان
وقتی نسبتهای سطرها در مرحله Pivot نامعین باقی میماند، الگوریتم سیمپلکس به بنبست یا حالتهای غیرعادی مانند جواب نشدنی یا بینهایت جواب برخورد میکند. در این مواقع، علت میتواند قیود نامناسب یا عدم وجود جواب اساسی شدنی باشد و باید به سراغ بررسی ساختار دوگان یا تست راهحلهای دیگر برای تحلیل وضعیت رفت. روشهای دیگر، مانند انتخاب دلخواه ستون یا توقف پس از یک تکرار، دلیل علمی و ساختاری برای پاسخگو نبودن سیمپلکس ارائه نمیدهند و باقی ماندن ضرایب منفی تنها برای شرایط عدم بهینگی مصداق دارد، نه لزوما برای نشدنی بودن یا بینهایت بودن جواب.













با سلام و احترام کد متلب سیمپلکس برای این نمونه سوال
max z=-8×1+2×2
s.t
x2-x1<6
x1<12
x1+x2<16
x2<8
جواب متفاوتی با حل هدی و اکسل دارد.
امکانش هست راهنمایی فرمایید؟
سلام در عملیات سطری مقدماتی برای صفر کردن x در ماتریس اول در ضریب y سطر 0 اشتباه رخ داده است
R0=7/2R1+R0 میباشد
با سلام،
متن بازبینی و ویرایش شد،
با تشکر از همراهی شما با مجله فرادرس