دیباگ کردن در GAMS چیست؟
دیباگ کردن فرآیند شناسایی و رفع خطاها در کد GAMS یا مدل بهینهسازی است. خطاها ممکن است شامل مشکلات سینتکس، دادههای نادرست، یا مدل غیرقابلحل (Infeasible/Unbounded) باشند.
انواع خطاهای رایج در GAMS
- خطای سینتکس: اشتباه در نوشتن کد (مثل typo یا ساختار نادرست).
- خطای داده: دادههای ورودی نامعتبر (مثل تقاضای منفی).
- خطای مدل: مدل Infeasible (بدون جواب) یا Unbounded (جواب نامحدود).
- خطای مسیر فایل: مشکل در دسترسی به فایلهای اکسل یا GDX.
ابزارهای دیباگ در GAMS IDE
- پنجره Output: نمایش پیامهای خطا.
- فایل .lst: گزارش دقیق اجرا و خطاها.
- دستور Display: بررسی مقادیر متغیرها و پارامترها.
- حلکنندهها: پیامهای حلکننده (مثل CPLEX) برای مشکلات مدل.
دیباگ کردن در GAMS IDE
برای این آموزش، یک مسئله حملونقل چندمحصولی را مدل میکنیم که عمداً یک خطا (تقاضای کل بیشتر از ظرفیت) دارد. سپس مراحل دیباگ را نشان میدهیم. دادهها از اکسل وارد میشوند.
مرحله ۱: ساختار فایل اکسل
فایل اکسل (data_debug.xlsx) برای مسئله حملونقل چندمحصولی:
Sheet1 (هزینهها):

Sheet2 (تقاضاها):

فایل را در پوشه پروژه GAMS IDE (مثل C:\GAMS\workdir) ذخیره کنید.
مرحله ۲: تبدیل اکسل به GDX
- فایل GAMS جدید (convert_debug.gms) در GAMS IDE:
- تبدیل اکسل به GDX برای مسئله دیباگ
Sets
i "شهرها"
j "محصولات";
Parameters
c(i,j) "هزینه حمل"
d(i,j) "تقاضا";
$call gdxxrw data_debug.xlsx par=c rng=Sheet1!A1:C7 par=d rng=Sheet2!A1:C7
$gdxout data_debug.gdx
$unload i j c d
$gdxout
- با کلید F9 اجرا کنید تا data_debug.gdx ایجاد شود.
مرحله ۳: کد GAMS با خطا و دیباگ
کد زیر مدل را اجرا میکند و ما خطای Infeasible را شناسایی و رفع میکنیم:
* مدل حملونقل با خطا برای دیباگ در GAMS IDE
$Ontext
این مدل هزینه حمل را کمینه میکند و خطای Infeasible را بررسی میکنیم.
$Offtext
* تعریف مجموعهها
Sets
i "شهرهای مقصد"
j "محصولات";
* تعریف پارامترها
Parameters
c(i,j) "هزینه حمل (هزار تومان)"
d(i,j) "تقاضای هر شهر و محصول (واحد)"
cap "ظرفیت انبار (واحد)"
x_result(i,j) "نتایج مقدار حمل برای ذخیره"
z_result "نتیجه هزینه کل برای ذخیره";
* وارد کردن دادهها از فایل GDX
$gdxin data_debug.gdx
$load i j c d
$gdxin
cap = 1500;
* بررسی دادهها
Display c, d, cap;
* تعریف متغیرها
Variables
x(i,j) "مقدار حمل هر محصول به هر شهر (واحد)"
z "هزینه کل (هزار تومان)";
Positive Variable x;
* تعریف معادلات
Equations
Cost "هزینه کل"
Demand(i,j) "تقاضای هر شهر و محصول"
Supply "محدودیت ظرفیت انبار";
Cost.. z =e= sum((i,j), c(i,j)*x(i,j));
Demand(i,j).. x(i,j) =g= d(i,j);
Supply.. sum((i,j), x(i,j)) =l= cap;
* تعریف و حل مدل
Model TransportDebug /all/;
Solve TransportDebug using LP minimizing z;
* ذخیره نتایج در پارامترها
x_result(i,j) = x.l(i,j);
z_result = z.l;
* ذخیره نتایج در فایل GDX
$gdxout results_debug.gdx
$unload x_result z_result
$gdxout
* انتقال نتایج به فایل اکسل
$call gdxxrw results_debug.gdx par=x_result rng=Sheet1!A1 par=z_result rng=Sheet2!A1 o=results_debug.xlsx

دیباگ کردن خطا
- اجرای اولیه:
- با اجرای کد، مدل به دلیل تقاضای کل (۲۰۰ + ۱۵۰ + ۳۰۰ + ۱۰۰ + ۲۵۰ + ۲۰۰۰ = 3000) بیشتر از ظرفیت (۱۵۰۰) Infeasible میشود.
- پیام خطا در پنجره Output یا فایل .lst ظاهر میشود:
**** MODEL STATUS 4 Infeasible **** SOLVER STATUS 4 Terminated by Solver
- بررسی فایل .lst:
- بخش EQUATION LISTING را بررسی کنید:
Demand(Isfahan,Product2).. x(Isfahan,Product2) =g= 2000 Supply.. sum((i,j), x(i,j)) =l= 1500 - مشکل: تقاضای ۲۰۰۰ برای Isfahan-Product2 با ظرفیت ۱۵۰۰ قابلتأمین نیست.
- بخش EQUATION LISTING را بررسی کنید:
- رفع خطا:
- تقاضای Isfahan,Product2 را در فایل اکسل به ۱۲۰ (مقدار معقول) تغییر دهید.
- فایل GDX را دوباره با convert_debug.gms تولید کنید.
- کد را دوباره اجرا کنید.
- خروجی پس از رفع خطا: در فایل اکسل (results_debug.xlsx):
- Sheet1 (مقدار حمل):ijx_resultTehranProduct1200TehranProduct2150ShirazProduct1300ShirazProduct2100IsfahanProduct1250IsfahanProduct2120
- Sheet2 (هزینه کل):z_result31750
- توضیح: پس از رفع خطا، مدل قابلحل شده و تقاضاها تأمین میشوند.
نکات مهم در GAMS IDE
- پیامهای خطا: پنجره Output و فایل .lst را برای جزئیات خطا بررسی کنید.
- دستور Display: برای بررسی دادههای ورودی (مثل c, d) قبل از حل.
- رفع خطا: دادههای ورودی (مثل تقاضا) یا محدودیتها (مثل ظرفیت) را اصلاح کنید.
- تست مدل: با دادههای کوچک شروع کنید تا خطاها راحتتر شناسایی شوند.
نکات کلیدی
- دیباگ کردن: شناسایی و رفع خطاها با بررسی .lst و Output.
- خطای Infeasible: معمولاً به دلیل ناسازگاری محدودیتها (مثل تقاضا > ظرفیت).
- GAMS IDE: استفاده از Display و فایل .lst برای دیباگ.
- کاربرد: برای اطمینان از صحت مدل و دادهها.
گام بعدی
در قسمت بعدی، با مقیاسپذیری مدلها (Scaling Models) آشنا میشوید تا مدلهای بزرگتر را بهینه اجرا کنید. فایلهای نمونه و ویدئوهای این دوره را از سایت بهینهیار دانلود کنید!
کلمات کلیدی: آموزش GAMS، دیباگ کردن در GAMS IDE، رفع خطا، مدلسازی بهینهسازی، بهینهیار