تابع هدف و محدودیتها در گمز
این پست زیر مجموعه دوره آموزش رایگان نرمافزار گمز میباشد، که به تابع هدف و محدودیتها در گمز میپردازد. در صورتی که تمایل دارید کل دوره را مشاهده کنید، از این لینک استفاده کنید. در ضمن اگه حال و حوصله خوندن متن ندارید، از ویدیو آخر این پست استفاده کنید.
تابع هدف و محدودیتها از عناصر حیاتی هر مدل ریاضی هستند که بدون اونها، مدل اصلا معنی نداره. اگرچه اکثر مدلهایی که دیدهایم یا خواهیم دید یک تابع هدف دارند ولی بعضی از مدلها میتوانند چند تابع هدف داشته باشند یا به اصطلاح مدل چند هدفه باشند. در مورد محدودیتها هم مثل تابع هدف کرانی وجود نداره، مدل میتونه از یک محدودیت تا هزاران محدودیت داشته باشه.
لازم به ذکر هست که برای تدوین این مجموعه آموزشی، کتاب راهنمای کاربران گمز نوشته دکتر مهدی طلوع و سمانه جوشقانی به من خیلی کمک کرد، پس حتما براشون آرزوی موفقیت کنید.
پیشنیاز این آموزش، مطالعه پست آموزش رایگان نرمافزار گمز میباشد.
تعریف تابع هدف و محدودیتها
مدل زیر را در نظر بگیرید:
با اینکه در تصویر بالا نوشتهام که x و بقیه اجزا مدل چه معنایی دارند، ولی در این آموزش اصلا مهم نیست که این علائم نشانگر چه هستند! اولین معادلهای که میبینید، تابع هدف مدل هست چون قبل این معادله عبارت min را آوردهام، یعنی من لازم است برای حل مدل، معادله مجموع حاصل ضرب xها در cها را با در نظرگیری معادلات بعدی که به اونها محدودیت میگیم، به حداقل مقدار ممکن برسونم. در ضمن به تابع هدف یا هر کدام از محدودیتها، قید هم میگویند.
در پاراگراف بالا خیلی خیلی خلاصه به مفهوم تابع هدف و محدودیت اشاره کردم، اگه اصلا با این مفاهیم آشنا نیستید، حتما قبل از ادامه آموزش عبارت مدل ریاضی یا تحقیق در عملیات را در گوگل سرچ کنید.
تعریف تابع هدف و محدودیتها در گمز
مثل بقیه اجزای گمز، قیدها هم باید قبل از استفاده تعریف شوند. برای تعریف قیدها از کلمه کلیدی equation یا equations استفاده میکنیم. بعد از این کلمه لازمه برای هر قید یک اسم انتخاب کنیم، مثلا کد زیر را در نظر بگیرید، من برای تابع هدفم نام obj را انتخاب کردهام و برای محدودیتهای اول و دوم مدل خودم، نامهای c1 و c2 را انتخاب کردم.
قطعا بعد از اینهمه آموزش گمز دیگه لازم نیست که بگم، بعد از تعریف قیدها، ; یادتون نره!
equations
obj,
c1,
c2
;
خب الان فقط لازمه که معادله ریاضی مربوط به هر قید را بنویسیم. مثلا کد مرتبط با معادله ریاضی تابع هدف به شکل زیر هست:
obj.. z =e= sum((i , j) , x(i , j) * c(i , j));
چند نکته خیلی مهم اینجا وجود داره که باید رعایت کنید:
- در ابتدا حتما باید نام قید را بنویسید. مثلا من اینجا قصد داشتم معادله تابع هدف را کد کنم، پس از نامی که برای تابع هدف در نظر گرفته بودم (یعنی obj)، استفاده کردم. بعدا میفهمید که چرا این نامها اینقدر مهم هستند.
- بعد از نام قید، دو تا نقطه (..) بزارید. البته همیشه دو نقطه بلافاصله بعد از نام قید نمیآید ولی عجله نکنید، بهش میرسیم.
- اگه درس قبلی یعنی متغیرها در گمز را خونده باشید، میدونید که z متغیر تابع هدف ما هست. درسته که تابع هدف برخلاف متغیرها مقداری در سمت چپ یا راست خودش ندارد ولی هنگام کدنویسی تابع هدف در گمز حتما لازمه اول متغیر تابع هدف را بنویسیم. پس بعد از دو نقطه z را قرار میدهیم و بعد z هم باید علامت مساوی قرار دهید که در بند بعدی بهش میرسیم.
- در هنگام نوشتن قیدها مساوی (=) به صورت =e= نوشته میشه! همچنین کوچتر به صورت =l= و بزرگتر به صورت =g= نوشته میشه.
- در رابطه با کاربرد تابع sum و ادامه قید هم که در پست آموزش رایگان نرمافزار گمز توضیح دادهام. حواستون باشه که این آموزش در ادامه درسهای قبلی هست و پیشنیاز داره.
- در پایان معادله یا قید ; یادتون نره!
- در تعریف یا کد کردن معادلات، مجبور به رعایت ترتیب خاصی نیستید.
کد کردن محدودیتها هم مثل تابع هدف هست، برای مثال من تو دو تا محدودیت مدل را به شکل زیر تعریف کردم:
c1(i).. sum(j , x(i , j)) =l= a(i);
c2(j).. sum(i , x(i , j)) =g= b(j);
نکته خیلی مهم در اینجا، علائمی هست که بین نام محدودیت و دو نقطه اومده! به محدودیت اول مدل دوباره نگاه کنید، یک سور عمومی روی i وجود داره (∀). در کدنویسی گمز این سور را به صورت (i) بعد از نام قید نشان میدهیم. این یعنی این محدودیت برای هر i لازمه که صدق کنه.
توابع ریاضی در تابع هدف و محدودیتها در گمز
در کد کردن تابع هدف و محدودیتها هم میتونید مثل آنچه در درس پارامترهای محاسباتی در گمز دیدیم، از توابع ریاضی از پیش نوشته شده گمز استفاده کنید. توابع زیادی از قبل برای راحتی کار در گمز نوشته شده که شما فقط با آوردن اسم اونها میتونید ازشون استفاده کنید. مثلا در کد زیر من در یک محدودیت فرضی به نام c3 گفتم که سینوس xها به ازای هر i و j باید کمتر از 0.1 باشد.
c4(i , j).. sin(x(i,j)) =l= 0.1;
توابع از پیش نوشته شده زیادی در گمز وجود داره که شما با یک سرچ ساده میتونید همه اونها ببینید. (از این لینک هم میتونید برای دیدن توابع استفاده کنید – وسطای صفحه زیر عنوان Mathematical Functions لیست توابع هست)
نکته خیلی مهمه اینه که استفاده از این توابع معمولا میتونه مدل شما را از حالت خطی دربیاره و به حالت غیر خطی تبدیل کنه.
پسوند l. برای قیدها در گمز
اگه آموزش متغیرها در گمز را خونده باشید، میدونید که پسوند l. مقدار یک متغیر را نشون میده، مثلا اگه نیاز داشتیم که بعد از حل مدل مقادیر متغیرهای خودمان را ببینیم، از این پسوند استفاده میکردیم. این پسوند در معادلات هم کاربرد داره، یعنی اگه بعد از حل مدل از l. بعد از نام قید استفاده کنیم، طرف چپ معادله را به ازای مقدار بهینه متغیرهای مدل به ما برمیگردونه. اگر متوجه این قسمت نشدید، اصلا نگران نباشید، فقط ویدیو آخر پست را ببینید.
display c2.l;
ویدیو تابع هدف و محدودیتها در گمز
من به جز اینجا، ویدیوها را در چنل یوتوب خودم هم آپلود میکنم. خیلی خوشحال میشم اگه اونجا هم من را همراهی کنید. برای دیدن چنل یوتوب من روی این لینک کلیک کنید.