خروجی گمز
این پست زیرمجموعه دوره آموزش رایگان نرمافزار گمز میباشد، که به آموزش تفسیر خروجی گمز میپردازد. در صورتی که تمایل دارید کل دوره را مشاهده کنید، از این لینک استفاده کنید. در ضمن اگه حال و حوصله خوندن متن ندارید، میتونید به جای خوندن متن، از ویدیو آخر این پست استفاده کنید.
پیشنیاز این آموزش، مطالعه پست آموزش رایگان نرمافزار گمز و حل مدل در گمز میباشد.
اجرا گرفتن در گمز
کدهای مدلی که من برای این آموزش قصد دارم از اون اجرا بگیرم به شکل زیر هست، این مدل ارور نداره و بدون خطا اجرا میشه ولی در ادامه آموزش، نحوه سر و کله زدن با خطاها را هم به صورت مختصر آموزش میدم:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/;
parameter
a(i) capocity of factory /zanjan 400
tehran 600/
b(j) demand of market /qazvin 375
hamedan 300
arak 325/;
table d(i , j) distance
qazvin hamedan arak
zanjan 329 160 505
tehran 337 160 239
;
scalars
f The cost of transporting a product per kilometer /25/;
parameter c(i , j) transport cost;
c(i , j) = f * d(i , j);
positive variable x(i , j);
free variable z;
equations
obj,
c1,
c2
;
obj.. z =e= sum((i , j) , x(i , j) * c(i , j));
c1(i).. sum(j , x(i , j)) =l= a(i);
c2(j).. sum(i , x(i , j)) =g= b(j);
Model transport1 some text /all/;
Solve transport1 using LP Minimizing z;
display c2.l
display z.l , x.l;
بعد از اینکه مدل خودتون را در گمز نوشتید، میتونید با کلیک روی دکمه Run Gams از مدلتون اجرا بگیرید:
تفسیر خروجی گمز
وقتی گمز مدل را حل کرد (حل مدل با توجه به پیچیدگی مدل و سختافزار سیستم شما ممکنه حتی چندین ساعت طول بکشه)، صفحهای به شکل زیر باز میشه که حاوی خروجی گمز هست:
سمت چپ خروجی گمز، عنوان هر قسمت از خروجی را به شما نشون میده که میتونید با دابل کلیک روی هر عنوان، مستقیم همون قسمت خروجی را ببینید.
نکته بعدی اینه که این خروجی در یک فایل با پسوند lst ذخیره میشه و امکان خوندنش با هر ویرایشگر متنی مثل ورد وجود داره، بنابراین هر قسمت از این خروجی را میتونید شخصی سازی کنید.
در اولین قسمت از این خروجی عبارت General Algebraic Modeling System را میبینید، اگه دوست ندارید این عبارت در شروع خروجی مدل شما باشه یا قصد دارید از عبارت دیگهای استفاده کنید، در ابتدای کد گمزتون دستور زیر را اضافه کنید. فقط به جای عبارت MyTitle از عنوان دلخواه خودتون استفاده کنید:
$title MyTitle
در قسمت بعدی از خروجی گمز، این نرمافزار کدهای مدلتون را به شما نشون میده:
اگه دارید پایان نامه مینویسید، این قسمت براتون خیلی مفیده چون سه چهار صفحهای براتون پر میکنه ولی در غیر اینصورت با دستور زیر میتونید حذفش کنید (این دستور را به ابتدای کد گمزتون اضافه کنید):
$offlisting
قسمت Equation Listing
در این قسمت، گمز قیدهای مدلتون را به صورت مبسوط به شما نشون میده:
حواستون باشه که تعداد قیدهایی که اینجا به شما نشون میده محدوده و اگه مدل شما قیدهای زیادی داره و نیاز دارید که همشون را ببینید، دستور زیر را قبل از دستور Solve در کدتون بنویسید:
option limrow = 10;
دستور بالا، از هر قید شما، 10 تا را باز میکنه و به صورت مبسوط در خروجی بهتون نشون میده، شما بجای عدد 10، عدد مورد نیاز خودتون را قرار بدید.
قسمت Column Listing
در این قسمت از خروجی از گمز، ضریب متغیرهای خودتون را در هر قید میتونید ببینید:
مثلا الان متغیر x(zanjan,qazvin) در قید obj ضریب 8225- و در قیدهای c1 و c2 ضریب 1 داره. در رابطه با LO. و بقیه نمادهایی که اینجا میبینید، در ادامه بیشتر توضیح میدم ولی همینقدر بدونید که LO یعنی کران پایین متغیر، L یعنی مقدار فعلی، UP یعنی کران بالا و M هم مقدار Marginal را نشون میده که مفصل در انتهای پست در موردش توضیح میدم. در ضمن اگه هر جایی از آموزش براتون مبهمه، حتما ویدیو آخر پست را ببینید چون قطعا ابهامتون برطرف میشه.
در اینجا هم مثل قسمت Equation Listing تمامی ضرایب متغیرها بهتون نشون داده نمیشه، برای اینکه این قسمت را به صورت مفصلتری داشته باشید، از دستور زیر قبل از دستور Solve استفاده کنید (به جای عدد 10، مقدار مورد نیازتون را وارد کنید):
option limcol = 10;
Model Statistics و Solution Report
قسمت Model Statistics یک سری اطلاعات از مدل بهتون میده که نیازی به توضیح ندارند و خودتون با یک نگاه متوجه میشید که این قسمت چیکار میکنه. حالا میرسیم به Solution Report، این قسمت اطلاعات خیلی مهمی از حل مدل به شما میده:
در این قسمت، اول اسم مدل یعنی transport1، بعد نوع مدل یعنی LP یا خطی، سالور مدل که اینجا Baron هست، متغیر هدف که در مدل من اسمش z هست و نوع مسأله که از نوع کمینه کردن یا Minimize هست را آورده.
در قسمت بعدی ما Solver Status را داریم که مقدار Normal Completion را گرفته، این یعنی سالور به خوبی مساله را حل کرده و خطایی پیش نیامده ولی این ویژگی 12 تا مقدار دیگه هم میتونه داشته باشه، مثلا ITERATION INTERRUPT که یعنی سالور در تعداد تلاش یا تکراری که براش مشخص شده به جواب نرسیده و نیاز به تکرار بیشتری داره، البته این تعداد تکرار در گمز قابل تنظیمه. یا Solver Status میتونه مقدار RESOURCE INTERRUPT را بگیره که یعنی سالور در زمان مشخص شده، نتونسته به جواب برسه که این زمان هم قابل تغییره. با کلیک روی این لینک تمام حالات Solver Status را میتونید مشاهده کنید.
بریم سراغ Model Status، این گزینه برخلاف گزینه قبلی که اطلاعاتی در مورد سالور به ما میداد، درباره خود مدل اطلاعات خوبی در اختیار ما قرار میده. الان مقدارش روی Optimal هست، یعنی جوابی که گمز به شما داده، جواب بهینه مساله هست. غیر از این حالت، این خصوصیت 18 حالت دیگه میتونه به خودش بگیره. مثلا LOCALLY OPTIMAL که یعنی مدل جواب بهینه محلی داره یا INFEASIBLE که یعنی مدل نشدنی هست و ناحیه موجه تهی داره (در این حالت اکثرا ایراد از خود مدل هست نه گمز و باید دوباره مدل خودتون را بررسی کنید که آیا خطای منطقی داره یا نه!). با کلیک روی این لینک تمام حالات Model Status را میتونید ببینید.
قسمت SolEQU
در این قسمت گمز اطلاعاتی در رابطه با قیدهای مدل به ما میده ولی فرقی که با قسمت Equation Listing داره اینه که این اطلاعات مربوط به بعد از حل مدل و بدست آوردن متغیرهای تصمیم هست:
در اینجا برای هر قید یک جدول وجود داره که تعداد سطرهای این جدول به اندیسهای قید بستگی داره و تعداد ستونها چهارتا هست. ستون اول کران پایین اون قید را مشخص میکنه، ستون دوم مقدار فعلی قید (منظور از مقدار فعلی قید اینه که اون قید به ازای مقدار بهینه یا فعلی متغیرهای تصمیم چه مقداری داره!)، ستون سوم کران بالا و ستون چهارم مقدار حاشیهای اون قید را در خودش جا داده.
اینکه مقدار حاشیهای یا Marginal چیه را هم لازمه توضیح بدم. این عدد یعنی اگه سمت راست قید (RHS) یک واحد اضافه بشه، متغیر تابع هدف چند واحد اضافه میشه. اگه متوجه این قسمت نشدید، لطفا صبر کنید چون این مفهوم را در بخش مربوط به متغیرها هم توضیح خواهم داد.
قسمت SolVAR
این قسمت مشابه SolEQU هست، فقط با این تفاوت که اطلاعاتی در رابطه با متغیرها بعد از حل مدل میده نه قیدها:
توضیح سطرها و ستونهای این جدول، دقیقا مثل همون توضیحی هست که در بخش قبلی برای قیدها دادم ولی بد نیست دوباره توضیحی بدم! سطر مربوط به zanjan.arak را در نظر بگیرید، اگه مدل را یکبار دیگه نگاه کنید، متوجه میشوید که x یک متغیر دو بعدی روی مجموعههای i و j هست، این یعنی در این سطر i برابر zanjan و j برابر arak هست. ستون اول میگه که کران پایین این متغیر صفر هست که منطقیه، چون x به صورت positive تعریف شده و یک متغیر مثبت هست. ستون دوم مقدار بهینه این متغیر را نمایش میده که یعنی برای حداقل کردن تابع هدف، این متغیر باید صفر باشد. ستون سوم حد بالا را نشون میده که برای این متغیر روی مثبت بینهایت (INF+) تنظیم شده و ستون چهارl به ما میگه که اگه یک واحد به این متغیر اضافه کنیم، یعنی اینجا، این متغیر برابر یک شود، تابع هدف 6650 واحد بیشتر میشه. با استفاده از اعداد ستون Marginal میتونید روی هر متغیر تحلیل حساسیت کنید، واضحه که x(zanjan.arak) تاثیر منفی زیادی روی مدل ما داره و باید هر طور شده روی مقدار صفر نگه داشته بشه.
قسمت Display
این قسمت از خروجی گمز، حاصل دو خط 42 و 43 مدل هست و اگه شما این دو خط را حذف کنید، دیگه در خروجی گمز این قسمت را ندارید. مثلا کد زیر فرض کنید:
display x.l;
نتیجه اجرای این کد در گمز اینجوریه که در خروجی یک قسمت به نام Display ایجاد میکنه، و مقدار فعلی x را بهتون اونجا نشون میده. پسوند l. یعنی level یا مقدار فعلی متغیر x را به من نشون بده که اگه این دستور را بعد از حل مدل نوشته باشید، مقدار فعلی یا level برابر همون مقدر بهینه x هست.
قسمت Execution هم چیز خاصی نداره، برای همین از توضیح دادنش صرف نظر میکنم.
خروجی گمز در حالت ارور
اگه مدلتون ارور داشته باشه (یعنی در نوشتن قسمتی از کد اشتباهی کرده باشید)، اون موقع وقتی از گمز اجرا بگیرید، در پنجره log یک سری خطوط با رنگ فونت قرمز خواهید دید که با دابل کلیک روی هر کدام از آنها، شما را به اون خطی از کد میبره که خطا داره:
همیشه یادتون باشه که فرایند برطرف کردن خطا را از اولین ارور شروع کنید، یعنی در پنجره log به سمت بالا اسکرول کنید تا برسید به اولین خطی که با فونت قرمز مشخص شده، بعدش توضیحات زیر اون خط را بخونید و سپس روی اون خط دابل کلیک کنید تا شما را به قسمتی از کد ببره که خطا داره و حالا اونجا ارور را برطرف کنید.
ویدیو آموزش تفسیر خروجی گمز
من به جز اینجا، ویدیوها را در چنل یوتوب خودم هم آپلود میکنم. خیلی خوشحال میشم اگه اونجا هم من را همراهی کنید. برای دیدن چنل یوتوب من روی این لینک کلیک کنید.