22 نکات، مفاهیم و اصول مهم گمز+ روش یادگیری آن

سیستم مدل سازی جبر عمومی (GAMS) یک سیستم مدل سازی سطح بالا برای بهینه سازی و برنامه ریزی ریاضیاتی است. این برنامه از یک کامپایلر زبان و یک حل کننده یکپارچه با کارایی بالا تشکیل شده است. GAMS برای برنامه های مدلسازی در مقیاس بزرگ و پیچیده مناسب است و به شما امکان می دهد مدلهای بزرگ قابل نگهداری بسازید که بتوانند به سرعت در موقعیتهای جدید سازگار شوند. GAMS به طور خاص برای مدل سازی مسئله های بهینه سازی عدد صحیح مختلط خطی ، غیرخطی و مختلط طراحی شده است.
مدل سازی بر اساس آخرین متد علمی
تمرکز روی طراح
GAMS به کاربران خود اجازه می دهد تا مدل های ریاضی را به روشی تهیه کنند که بسیار شبیه به توضیحات ریاضیاتی آنها می باشد. به این مثال ساده نگاهی بیندازید که ساختار و ویژگیهای اساسی یک مدل GAMS و نحوه ارتباط آن با فرمول ریاضی را نشان می دهد. مقاله های آموزش GAMS همان مدل را با روشی گسترده تر توضیح می دهد ، برای اطلاعت بیشتر می توانید به این ویدیو در کانال یوتیوب ما نگاهی بیاندازید.
از این طریق ، GAMS به کاربر اجازه می دهد تا روی مدل سازی متمرکز شود. GAMS با الزام به خصوصیات مختصر و دقیق موجودات و روابط ، خود عادات مدل سازی خوب را می پرورد. زبان GAMS به طور رسمی مشابه زبانهای برنامه نویسی رایج است. بنابراین برای هر کس که دارای تجربه برنامه نویسی باشد، آشنا است. اما از آنجا که این مدل به شکلی تدوین شده است که شبیه به توضیحات ریاضی آن است، نه تنها توسط برنامه نویسان بلکه توسط کارشناسان واقعی این حوزه نیز قابل درک و استنباط است. GAMS بر روی طراح مدل سازی تمرکز می کند و به او اجازه می دهد تا همه کارهای مرتبط را خودش انجام دهد.
آموزش فارسی و گام به گام GAMS (گمز) توسط ریچارد روزنتال (مبتدی-متوسط)
ترکیبی متعادل از عناصر بیانی و رویه ای؛ امکان ساخت الگوریتم های پیچیده و حتی پیاده سازی روش های تجزیه در GAMS را فراهم می کند. این امر به ویژه برای مدلهایی که به مسئله های غیرمعمول که اغلب اوقات همراه با مسائل مربوط به عملکرد هستند می پردازد.
اصول طراحی که تفاوت ایجاد می کنند
“ما تلاش می کنیم به جای آنکه چیزی را کنترل کنیم؛ آن را متناسب نماییم”.
GAMZ بر ویژگی اصلی خود متمرکز است: توانمندسازی کاربران برای ساختن مدلهای قابل خواندن و قابل حفظ و حل آنها با بهترین حل کننده های موجود در هر نقطه. معماری باز ما و بسیاری از داده های واسطه ی ارائه شده امکان برقراری ارتباط یکپارچه با سیستم های خارجی را فراهم می آورد.
مرز بین مدل ، حل کننده ، داده ها ، پلتفرم و کاربر در لایه های مستقل از هم تفکیک می شوند و امکان جابجایی یک حل کننده را آسان می کنند؛ از چندین مجموعه داده استفاده می کنند، روی چندین سیستم عامل اجرا می شوند و GAMZ را در برنامه ها ، ساختارها و روندهای کاری ادغام می کنند.
استقلال مدل و حل کننده
ما یک نمونه کار فوق العاده گسترده و متنوع از بیش از ۲۵ حل کننده را ارائه می دهیم
، که همه حل کننده های تجاری مورد انتظار را شامل میشود.
LP/MIP/QCP/MIQCP: CPLEX, GUROBI, MOSEK, XPRESS
NLP: CONOPT, IPOPTH, KNITRO, MINOS, SNOPT
MINLP: ALPHAECP, ANTIGONE, BARON, DICOPT, OQNLP, SBB
حل کننده برای مشکلات متمم مختلط (MCP) ، برنامه های ریاضی با محدودیت تعادل (MPEC) ، و سیستم های غیرخطی محدود (CNS)
جایگزین های رایگان که با هر سیستم GAMS همراه شده است (به عنوان مثال BONMIN (MINLP) ، CBC (LP ، MIP) ، COUENNE (MINLP) ، IPOPT (NLP) ؛ برای مجوزهای دانشگاهی نیز SCIP و SOPLEX
انتخاب حل کننده برای استفاده ساده است – فقط یک خط کد را تغییر دهید یا یک گزینه را تنظیم کنید. برای مقایسه عملکرد حل کننده یا مشاهده ی اینکه چه پیشرفت هایی وجود دارد، نیازی به استفاده مجدد از چیزی نیست. به طور مشابه ، شما می توانید به راحتی بین انواع مدل (مانند مدل های خطی و غیر خطی) جابجا شوید، بنابراین آزمایش با فرمول های مختلف آسان است.
با GAMS شما می توانید محیطی برای محدوده ی گسترده ای از انواع مدل و حل کننده ها داشته باشید.
استقلال مدل و داده ها
شما می توانید مدل را بطور مستقل از داده ها بنویسید، و داده هایی را از انواع بسیار متفاوت منابع شامل می شود؛ از ASCII ساده گرفته تا اکسل یا اکسس و بسیاری موارد دیگر، به عنوان مثال می توانید از فرمت فایل GDX (GAMS Data eXchang) استفاده کنید.
پرونده GDX فایلی است که مقادیر یک یا چند نماد GAMS مانند مجموعه ها، متغیر های پارامترها و معادلات را ذخیره می کند. از فایل های GDX می توان برای تهیه داده برای یک مدل GAMS ، نتایج حاضر از یک مدل GAMS ، ذخیره نتایج همان مدل با استفاده از پارامترهای مختلف و غیره استفاده کرد. یک فایل GDX فرمول مدل یا عبارات قابل اجرا را ذخیره نمی کند.
دانلود رایگان آموزش صفر تا صد نرم افزار گمز (فیلم فارسی+ جزوه pdf)
فایل های GDX فایل های باینری هستند که بین سیستم عامل های مختلف قابل حمل هستند. ویدئوی GAMS و Excel – با استفاده از GDX برای انتقال داده ها در کانال یوتیوب ما، این موضوع برای اکسل نشان داده می شود.
استقلال مدل و بسترهای نرم افزاری
مدل ها بین سیستم عامل ها کاملاً قابل حمل هستند – یک بار بنویسید، و در هر نقطه برنامه را اجرا کنید. GAMS روی ویندوز، لینوکس، سیستم عامل مک X، سولاریس، اسپارس سولاریس و IBM Power AIX اجرا می شود.
استقلال مدل و رابط کاربری
API های شی گرا GAMS با تهیه کلاسهای مناسب برای تعامل با GAMS ، امکان ادغام یکپارچه GAMS را در برنامه فراهم می کنند. سه نسخه از GAMS API شی گرا عبارت است از: دات نت، جاوا و پایتون، که با .NET framework 4 (ویژوال استودیو ۲۰۱۰)، جاوا SE 5 به بالا و همچنین پایتون ۳٫۴ ، ۲٫۷ و ۲٫۶ بر این اساس کار می کنند.
علاوه بر API های GAMS شی گرا ، API های GAMS در سطح متخصص (یا سطح پایین) نیز وجود دارد که استفاده از آنها نیاز به دانش پیشرفته ای در مورد کتابخانه های مؤلفه GAMS دارد. برای اطلاعات بیشتر در مورد API ، به مقاله های ما مراجعه کنید.
دانلود ۲ تا از بهترین و جدیدترین کتاب های آموزش نرم افزار گمز به زبان فارسی
علاوه بر API ها ، GAMS پیوندهای هوشمندانه ای را برای برنامه هایی مانندMS اکسل، متلب یا R فراهم می آورد. از این طریق کاربر می تواند در محیط تولید کننده ابزار، کار خود را ادامه دهد در حالی که برنامه از طریق API به کلیه قابلیت های بهینه سازی GAMS دسترسی دارد. به عنوان مثال امکان تجسم و تجزیه و تحلیل داده های مدل و نتایج در برنامه را فراهم می کند.
مفاهیم، اصول و نکات پایه GAMS برای مبتدیها
GAMS (گمز) یک نرمافزار و زبان مدلسازی برای حل مسائل بهینهسازی ریاضی است. نام آن از General Algebraic Modeling System گرفته شده و میتوان آن را «سیستم عمومی مدلسازی جبری» ترجمه کرد.
GAMS در رشتههایی مانند مهندسی صنایع، اقتصاد، مدیریت، انرژی، برق، حملونقل، برنامهریزی تولید و زنجیره تأمین کاربرد دارد.
مثلاً یک کارخانه میخواهد تعیین کند:
از هر محصول چه مقدار تولید شود تا سود بیشینه شود، درحالیکه محدودیت مواد اولیه و ظرفیت دستگاهها رعایت شود.
این دقیقاً نمونهای از مسئلهای است که GAMS برای آن مناسب است.
منطق کلی کار در GAMS چنین است:
تعریف دادهها → تعریف متغیرها → نوشتن محدودیتها → تعریف تابع هدف → انتخاب نوع مدل → حل → بررسی نتیجه
بهینهسازی یعنی چه؟
Optimization یا بهینهسازی یعنی پیدا کردن بهترین تصمیم از بین چند گزینه ممکن.
مثلاً:
- بیشترین سود
- کمترین هزینه
- کوتاهترین مسیر
- کمترین مصرف انرژی
- بهترین برنامه تولید
فرض کنید کارخانه دو محصول A و B تولید میکند.
سود محصول A برابر 30 و سود محصول B برابر 20 واحد است.
تابع هدف میتواند بهصورت ساده چنین باشد:
Maximize:
30A + 20Bیعنی مقدار A و B را طوری انتخاب کنیم که سود کل بیشترین مقدار شود.
اما معمولاً محدودیتهایی هم داریم.
مثلاً:
2A + B <= 100یعنی مصرف یک منبع نباید از 100 واحد بیشتر شود.
GAMS وظیفه دارد بهترین مقادیر A و B را پیدا کند.
اجزای اصلی یک مدل GAMS
تقریباً بیشتر مدلهای GAMS شامل این قسمتها هستند:
Sets → Parameters → Variables → Equations → Model → Solve → Display
یعنی:
مجموعهها → پارامترها → متغیرها → معادلات → مدل → حل → نمایش نتیجه
اگر این ترتیب را بفهمید، بخش مهمی از منطق GAMS را یاد گرفتهاید.
Set یا مجموعه
Set یعنی مجموعه و برای تعریف اعضای یک گروه استفاده میشود.
مثلاً سه محصول داریم:
Set i / product1, product2, product3 /;در اینجا i مجموعه محصولات است.
یا ممکن است چند کارخانه داشته باشیم:
Set j / factory1, factory2, factory3 /;مجموعهها در مدلهای بزرگ بسیار مهم هستند، زیرا اجازه میدهند بهجای نوشتن صدها معادله تکراری، یک رابطه عمومی بنویسیم.
مثلاً بهجای نوشتن محدودیت جداگانه برای 100 محصول، یک محدودیت روی مجموعه i تعریف میکنیم.
Index یا شاخص
وقتی از مجموعه استفاده میکنیم، متغیری مانند:
i
یا:
j
نقش شاخص را دارد.
مثلاً:
x(i)
یعنی مقدار متغیر x برای هر عضو مجموعه i.
اگر مجموعه محصولات باشد:
x(product1)
x(product2)
x(product3)هرکدام میتوانند مقدار متفاوتی داشته باشند.
شاخصگذاری یکی از مهمترین مفاهیم GAMS است.
Scalar یا مقدار تکی
Scalar یا مقدار تکی برای عددی استفاده میشود که فقط یک مقدار دارد.
مثلاً:
Scalar capacity /100/;یعنی ظرفیت برابر 100 است.
Scalar برای مواردی مانند:
- ظرفیت کل
- بودجه
- نرخ مالیات
- مقدار ثابت
کاربرد دارد.
Parameter یا پارامتر
Parameter یا پارامتر برای نگهداری دادههای مدل استفاده میشود.
مثلاً سود هر محصول:
Parameter profit(i)
/
product1 30
product2 20
product3 40
/;اینجا GAMS میفهمد سود هر محصول چقدر است.
یک اصل مهم:
Parameter داده ورودی است؛ Variable تصمیمی است که باید توسط حلگر پیدا شود.
این دو را با هم اشتباه نگیرید.
Table یا جدول
وقتی دادهها دو یا چند بعد دارند، Table یا جدول بسیار کاربردی است.
مثلاً هزینه انتقال کالا از چند کارخانه به چند شهر:
Table cost(i,j)
city1 city2
factory1 10 15
factory2 12 8;در مسائل حملونقل، شبکه و زنجیره تأمین استفاده از جدول بسیار رایج است.
Variable یا متغیر تصمیم
Variable یا متغیر مقداری است که GAMS باید آن را پیدا کند.
مثلاً:
Variable x;اگر x مقدار تولید محصول باشد، GAMS مقدار مناسب آن را تعیین میکند.
در بهینهسازی معمولاً به اینها:
Decision Variables یا متغیرهای تصمیم
گفته میشود.
مثلاً:
- چند واحد تولید کنیم؟
- چند کامیون ارسال کنیم؟
- چه مقدار انرژی مصرف شود؟
- کدام کارخانه فعال شود؟
همگی میتوانند متغیر تصمیم باشند.
انواع مهم متغیرها
متغیرها در GAMS انواع مختلفی دارند.
Positive Variable
متغیر نامنفی یعنی مقدار آن نمیتواند منفی باشد.
Positive Variable x;مثلاً مقدار تولید نمیتواند منفی باشد.
Binary Variable
متغیر دودویی فقط مقدار صفر یا یک میگیرد.
Binary Variable y;مثلاً:
y = 1 → کارخانه باز شود
y = 0 → کارخانه باز نشوداین نوع متغیر در تصمیمهای بله/خیر بسیار مهم است.
Integer Variable
متغیر صحیح فقط مقدار صحیح میگیرد.
مثلاً تعداد کامیون:
0, 1, 2, 3, ...نه 2.7 کامیون!
Equation یا معادله
در GAMS محدودیتها و تابع هدف معمولاً ابتدا در قسمت:
Equation یا معادله
معرفی میشوند.
مثلاً:
Equations
objective
capacity;سپس رابطه آنها نوشته میشود.
علامت .. در GAMS
بعد از نام معادله معمولاً از:
..استفاده میشود.
مثلاً:
capacity..
2*x1 + x2 =l= 100;این ساختار خاص زبان GAMS است.
علامتهای مساوی و نامساوی
در GAMS معمولاً:
=e= مساوی
=l= کوچکتر یا مساوی
=g= بزرگتر یا مساویاستفاده میشود.
مثلاً:
x =l= 100;یعنی:
x ≤ 100
و:
x =g= 10;یعنی:
x ≥ 10
این علامتها را باید از همان ابتدا یاد بگیرید.
تابع هدف
هر مسئله بهینهسازی معمولاً یک:
Objective Function یا تابع هدف
دارد.
مثلاً میخواهیم سود را بیشینه کنیم:
Variable z;
objective..
z =e= 30*x1 + 20*x2;z مقدار تابع هدف است.
سپس هنگام حل مشخص میکنیم که z باید بیشینه شود.
دستور Model
بعد از تعریف معادلات، مدل را معرفی میکنیم.
مثلاً:
Model production /all/;production نام مدل است.
/all/
یعنی همه معادلات تعریفشده وارد مدل شوند.
در پروژه بزرگ میتوان فقط تعدادی از معادلات را انتخاب کرد.
دستور Solve
برای حل مدل از:
Solveاستفاده میشود.
مثلاً:
Solve production using LP maximizing z;یعنی:
مدل production را با روش برنامهریزی خطی حل کن و مقدار z را بیشینه کن.
LP چیست؟
LP یا Linear Programming یعنی برنامهریزی خطی.
در این مدل:
- تابع هدف خطی است.
- محدودیتها خطی هستند.
- معمولاً متغیرهای پیوسته داریم.
مثلاً:
Max Z = 30x + 20yبا محدودیتهایی مانند:
2x + y <= 100یک مسئله خطی است.
برنامهریزی خطی معمولاً بهترین نقطه شروع برای یادگیری GAMS است.
MIP چیست؟
MIP یا برنامهریزی عدد صحیح مختلط زمانی استفاده میشود که بعضی متغیرها صحیح یا دودویی باشند.
مثلاً تصمیم بگیریم کارخانه باز شود یا خیر:
0 یا 1در چنین مسائلی معمولاً از مدل MIP استفاده میشود.
NLP چیست؟
NLP یا برنامهریزی غیرخطی برای مسائلی است که روابط غیرخطی دارند.
مثلاً اگر داشته باشیم:
x*yیا:
x^2ممکن است مسئله غیرخطی باشد.
حل مسائل NLP معمولاً دشوارتر از LP است و مقدار اولیه و ساختار مسئله اهمیت بیشتری پیدا میکند.
MINLP چیست؟
MINLP یا برنامهریزی غیرخطی عدد صحیح مختلط ترکیبی از:
- روابط غیرخطی
- متغیرهای صحیح یا دودویی
است.
این مدلها معمولاً از دشوارترین مسائل بهینهسازی هستند.
برای مبتدی توصیه میشود ابتدا LP و MIP را خوب یاد بگیرد.
Sum چیست؟
یکی از مهمترین دستورهای GAMS:
sumاست.
Sum یعنی مجموعگیری.
مثلاً:
sum(i, profit(i)*x(i))یعنی:
برای همه محصولات i، حاصلضرب سود در مقدار تولید را جمع کن.
بهجای اینکه بنویسیم:
profit1*x1 + profit2*x2 + profit3*x3 + ...فقط یک Sum مینویسیم.
این ویژگی باعث میشود مدلهای بسیار بزرگ کوتاه و قابل مدیریت شوند.
Loop با مدلسازی فرق دارد
افرادی که از زبانهای برنامهنویسی میآیند گاهی میخواهند همه چیز را با حلقه بنویسند.
اما قدرت GAMS در مدلسازی مجموعهای و جبری است.
مثلاً معمولاً بهتر است:
sum(i, x(i))استفاده کنیم تا اینکه همه متغیرها را یکییکی محاسبه کنیم.
یعنی در GAMS بیشتر باید به «رابطه ریاضی» فکر کنید تا «مراحل اجرای برنامه».
سطح بالا و پایین متغیر
میتوان برای متغیر محدودیت مستقیم تعیین کرد.
مثلاً:
x.lo = 10;
x.up = 100;lo یعنی حد پایین
و:
up یعنی حد بالا
پس:
10 ≤ x ≤ 100مقدار ثابت متغیر
اگر بخواهیم متغیر را روی یک مقدار مشخص ثابت کنیم، میتوانیم از:
x.fx = 50;استفاده کنیم.
fx یعنی Fixed یا ثابتشده.
این قابلیت برای آزمایش سناریوها بسیار مفید است.
مقدار اولیه
در بعضی مدلها میتوان مقدار اولیه متغیر را تعیین کرد:
x.l = 20;l معمولاً به Level یا مقدار فعلی/سطح متغیر اشاره دارد.
بعد از حل نیز جواب متغیر در همین بخش قرار میگیرد.
مثلاً:
display x.l;مقدار بهینه x را نشان میدهد.
Display چیست؟
برای نمایش نتیجه میتوان از:
displayاستفاده کرد.
مثلاً:
display x.l, z.l;یعنی مقدار نهایی x و تابع هدف z نمایش داده شود.
همیشه خروجی مدل را بررسی کنید و فقط به عبارت «حل شد» اعتماد نکنید.
Solver چیست؟
Solver یا حلگر موتور ریاضی است که مسئله را حل میکند.
GAMS خودش بیشتر محیط مدلسازی است و میتواند مدل را به حلگرهای مختلف ارسال کند.
حلگرهای مختلف برای LP، MIP، NLP و مسائل دیگر وجود دارند.
در شروع لازم نیست همه Solverها را بشناسید. مهمتر این است که نوع مدل را درست تشخیص دهید.
Model Status و Solver Status
بعد از حل باید وضعیت مدل را بررسی کنید.
صرف اینکه GAMS عددی نمایش داده، به معنی جواب بهینه و معتبر نیست.
ممکن است مدل:
- جواب بهینه داشته باشد.
- شدنی نباشد.
- نامحدود باشد.
- حلگر متوقف شده باشد.
بنابراین وضعیت حل را همیشه کنترل کنید.
Infeasible چیست؟
Infeasible یعنی مدل نشدنی است.
یعنی محدودیتها طوری نوشته شدهاند که هیچ جوابی نمیتواند همه آنها را همزمان رعایت کند.
مثلاً:
x >= 100
x <= 50واضح است که هیچ x نمیتواند هر دو شرط را رعایت کند.
اگر مدل Infeasible شد، معمولاً باید دادهها و محدودیتها را بررسی کنید.
Unbounded چیست؟
Unbounded یعنی نامحدود.
مثلاً میخواهید سود را بیشینه کنید ولی هیچ محدودیتی روی تولید نگذاشتهاید.
در این حالت ممکن است نرمافزار بگوید سود میتواند تا بینهایت افزایش پیدا کند.
این معمولاً نشان میدهد محدودیتی در مدل فراموش شده است.
خطاهای رایج مبتدیان
چند اشتباه مهم:
- تعریف نکردن درست مجموعهها
- اشتباه گرفتن Parameter و Variable
- فراموشکردن
; - اشتباه در
=l=و=g= - انتخاب نوع مدل اشتباه
- تعریف تابع هدف نادرست
- قرار ندادن محدودیت کافی
- استفاده از متغیر پیوسته بهجای Binary
- توجه نکردن به واحدها
- اعتماد به جواب بدون بررسی وضعیت مدل
- نوشتن مدل بزرگ قبل از آزمایش نمونه کوچک
یک توصیه مهم:
اول مدل را با چند عضو و داده ساده حل کنید؛ بعد اندازه آن را بزرگ کنید.
پروژه مناسب برای شروع
یک مسئله ساده برنامهریزی تولید بسازید.
مثلاً کارخانه دو محصول تولید میکند.
هدف:
بیشینهکردن سود
محدودیتها:
- مواد اولیه
- زمان دستگاه
- تقاضای بازار
متغیرها:
مقدار تولید هر محصول
با همین پروژه میتوانید:
- Set
- Parameter
- Variable
- Equation
- Sum
- Model
- Solve
- Display
را تمرین کنید.
بعد از آن میتوانید سراغ:
- مسئله حملونقل
- تخصیص
- زمانبندی
- مکانیابی
- برنامهریزی انرژی
بروید.
مسیر پیشنهادی یادگیری GAMS
برای مبتدی:
مبانی تحقیق در عملیات
↓
برنامهریزی خطی
↓
Set و Parameter
↓
Variable
↓
Equation
↓
Sum
↓
Model و Solve
↓
بررسی خروجی
↓
LP
↓
MIP و Binary
↓
مسائل حملونقل و تخصیص
↓
NLP و مدلهای پیشرفتهتر
جمعبندی
مهمترین نکته برای یادگیری GAMS این است که GAMS را مانند یک زبان برنامهنویسی معمولی نبینید. هدف اصلی آن بیان یک مدل ریاضی به شکلی است که حلگر بتواند بهترین جواب را پیدا کند.
هسته هر مسئله تقریباً از چهار بخش تشکیل میشود:
دادهها + متغیرهای تصمیم + محدودیتها + تابع هدف
سپس GAMS با استفاده از Solver جواب را پیدا میکند.
پس قبل از نوشتن کد از خود بپرسید:
چه چیزی را میخواهم بیشینه یا کمینه کنم؟ چه تصمیمهایی مجهولاند؟ چه محدودیتهایی دارم؟ چه دادههایی معلوم هستند؟
اگر بتوانید این چهار سؤال را پاسخ دهید، بخش دشوار مسئله را حل کردهاید؛ نوشتن آن در GAMS مرحله بعدی است.
