خطایابی در GAMS چیست؟
خطایابی به معنای پیدا کردن و رفع اشکالات در کد GAMS است که مانع اجرای صحیح مدل میشوند. GAMS خطاها را در فایل خروجی (.lst) یا پنجره Log گزارش میدهد. این خطاها ممکن است به دلیل مشکلات نگارشی (Syntax Errors) یا منطقی (Logical Errors) باشند.
انواع خطاها
- خطاهای نگارشی (Syntax Errors):
- مشکلات در ساختار کد، مثل اشتباه در نوشتن دستورات یا فراموش کردن سمیکالن (;).
- مثال: نوشتن Set بهجای Sets.
- خطاهای منطقی (Logical Errors):
- مدل درست اجرا میشود، اما نتایج نادرست است (مثلاً به دلیل محدودیتهای ناسازگار).
- مثال: تقاضای بیشتر از ظرفیت انبار.
- خطاهای حلکننده:
- مدل قابلحل نیست (مثلاً Infeasible یا Unbounded).
- مثال: محدودیتهایی که هیچ راهحلی ندارند.
چگونه خطاها را پیدا کنیم؟
GAMS خطاها را در فایل خروجی (.lst) یا پنجره Log در GAMS Studio گزارش میدهد. برای خطایابی:
- پنجره Log: پیامهای خطا (Error Messages) را بررسی کنید. خطاها با کد (مثل *** Error 149) و توضیح نمایش داده میشوند.
- فایل .lst: جزئیات خطا، شماره خط، و توضیحات را نشان میدهد.
- نکات کلیدی:
- شماره خط (Line Number) را بررسی کنید.
- پیام خطا را بخوانید (مثل Unknown symbol برای متغیر تعریفنشده).
- از کامنتها برای غیرفعال کردن بخشهای کد و تست استفاده کنید.
مثال عملی: خطایابی در مسئله حملونقل
فرض کنید کد زیر برای کمینه کردن هزینه حمل کالا نوشته شده، اما خطا دارد:
* مدل حملونقل با خطا
Sets
i "شهرهای مقصد" /Tehran, Shiraz, Isfahan/;
Parameters
c(i) "هزینه حمل" /Tehran 50, Shiraz 100, Isfahan 80/
d(i) "تقاضا" /Tehran 200, Shiraz 300, Isfahan 250/
s "ظرفیت انبار" /۵۰۰/;
Variables
x(i) "مقدار حمل"
z "هزینه کل";
Positive Variable x;
Equations
Cost "هزینه کل"
Demand(i) "تقاضای هر شهر"
Supply "محدودیت ظرفیت";
Cost z =e= sum(i, c(i)*x(i)); * خطا: سینتکس نادرست
Demand(i).. x(i) =g= d(i)
Supply.. sum(i, x(i)) =l= s;
Model Transport /all/;
Solve Transport using LP minimizing z;
Display x.l, z.l;
خطاها و رفع آنها
- خطای نگارشی:
- خط: Cost z =e= sum(i, c(i)*x(i));
- مشکل: سینتکس نادرست (Cost z اشتباه است، باید Cost.. باشد).
- رفع: به Cost.. z =e= sum(i, c(i)*x(i)); تغییر دهید.
- خطای نگارشی دیگر:
- خط: Demand(i).. x(i) =g= d(i) (بدون سمیکالن).
- مشکل: سمیکالن (;) فراموش شده.
- رفع: به Demand(i).. x(i) =g= d(i); تغییر دهید.
کد اصلاحشده
* مدل حملونقل اصلاحشده
$Ontext
این مدل هزینه حمل کالا را کمینه میکند.
$Offtext
Sets
i "شهرهای مقصد" /Tehran, Shiraz, Isfahan/;
Parameters
c(i) "هزینه حمل (هزار تومان)" /Tehran 50, Shiraz 100, Isfahan 80/
d(i) "تقاضا (واحد)" /Tehran 200, Shiraz 300, Isfahan 250/
s "ظرفیت انبار (واحد)" /۵۰۰/;
Variables
x(i) "مقدار حمل به هر شهر (واحد)"
z "هزینه کل (هزار تومان)";
Positive Variable x;
Equations
Cost "هزینه کل"
Demand(i) "تقاضای هر شهر"
Supply "محدودیت ظرفیت انبار";
Cost.. z =e= sum(i, c(i)*x(i));
Demand(i).. x(i) =g= d(i);
Supply.. sum(i, x(i)) =l= s;
Model Transport /all/;
Solve Transport using LP minimizing z;
Display x.l, z.l;
خروجی نمونه
در فایل .lst:
x.l(Tehran) 200.000
x.l(Shiraz) 300.000
x.l(Isfahan) 250.000
z.l 29500.000
- توضیح: مدل اصلاحشده درست اجرا میشود و هزینه کل ۲۹۵۰۰ هزار تومان است.
نکات مهم در خطایابی
- پیامهای خطا: کد خطا (مثل Error 149) و توضیحات را در Log یا .lst بخوانید.
- شماره خط: خطای دقیق را با شماره خط پیدا کنید.
- تست تدریجی: بخشهای کد را با Display یا کامنتگذاری ($Ontext/$Offtext) تست کنید.
- محدودیتهای منطقی: مطمئن شوید تقاضا و ظرفیت سازگارند (مثلاً تقاضای کل ≤ ظرفیت).
ویدئوی آموزشی (۲ دقیقه)
در ویدئوی این قسمت:
- مفهوم خطایابی را با یک نمودار ساده (کد → خطا → رفع) توضیح میدهیم.
- کد با خطا را در GAMS Studio اجرا میکنیم و پیام خطا را نشان میدهیم.
- کد اصلاحشده را اجرا و خروجی Display x.l, z.l را نمایش میدهیم.
لینک ویدئو: [لینک آپارات یا یوتیوب، پس از آپلود اضافه کنید]
نکات کلیدی
- خطایابی: پیدا و رفع اشکالات نگارشی و منطقی.
- ابزارها: فایل .lst و پنجره Log برای شناسایی خطاها.
- روشها: بررسی شماره خط، تست تدریجی، و کامنتگذاری.
- تمرین: همیشه دادهها و سینتکس را قبل از حل بررسی کنید.
گام بعدی
در قسمت بعدی، با وارد کردن دادهها از اکسل آشنا میشوید تا مدلهای بزرگتر را مدیریت کنید. فایلهای نمونه و ویدئوهای این دوره را از سایت بهینهیار دانلود کنید!
کلمات کلیدی: آموزش GAMS، خطایابی در GAMS، رفع خطا در مدلسازی، GAMS برای مبتدیان، بهینهیار