بخشی از مقاله
راهنمای عملیاتی نرمافزار GAMS
GAMS چیست؟
سیستم GAMS یک زبان برنامهنویسی مدلسازی با قابلیت بالاست.
از GAMS برای حل مسائل برنامهریزی خط (LP)، برنامهریزی غیرخطی (NLP)، برنامهریزی صحیح مختلط (MIP)، برنامهریزی خطی صحیح مختلط (MINLP) و مسائل مکمل خطی (MCP) استفاده میکنند.
روش نصب و راهاندازی GAMS بر روی کامپیوتر شخصی
GAMS در محیطهای DOS ، WINDOWS و UNIX قابل اجراست. در این جا راهاندازی GAMS را برای اجرا تحت DOS بیان میکنیم.
توجه کنید که سیستم GAMS تحت DOS شامل 4 فلاپی 44/1 میباشد.
1- ابتدا یک شاخه دلخواه روی کامپیوتر شخصی خود (مثلاً GAMS) درست کنید. سپس هر چهار فلاپی را روی شاخۀ GAMS کپی کنید. (ترتیب کپی کردن فلاپیها مهم نیست.)
2- برنامۀ gamsinst را اجرا کنید.
این برنامه تمام فایلهای فشردۀ *.Pck را باز میکند.
چگونه یک برنامه GAMS بنویسیم
برای حل یک مسأله توسط GAMS اولین مرحله عبارت است از تشکیل یک فایل متن که بیانکننده مسأله شما به زبان GAMS است. از ویرایشگر متن مثلا Edit در سیستم عامل DOS یا هر ویرایشگر متنی که در اختیار دارید میتوانید استفاده کنید. معمولا فایل حاصل را با پسوند GMS مشخص میکنیم. مثلا اگر برنامهای به نام TEST مینویسید فایلی به نام TEST.GMS ایجاد کنید.
نکاتی در مورد نحوۀ نوشتن برنامۀ GAMS
1- برای رفتن به خط بعدی از ENTER استفاده کنید.
2- هرگز از کلید TAB استفاده نکنید، زیرا موجب پیغام خطا میشود.
3- هر خطی که با '*' شروع شود به عنوان توضیح در نظر گرفته میشود و در برنامه خوانده نمیشود.
4- برای GAMS حروف کوچک و بزرگ فرقی ندارد.
5- یک برنامۀ GAMS شامل بخشهای متعددی است، هر بخش با یک سیمیکالون (؛) خاتمه مییابد.
یک برنامۀ نمونۀ GAMS
قبل از پرداختن به توضیحات مربوط به بخشهای مختلف یک برنامۀ GAMS کلیات برنامۀ زیر را ملاحظه نمائید.
مسأله:
min
به طوری که
برنامۀ مربوط به این مسأله در بخشهای بعدی به عنوان TEST ارجاع داده خواهد شد.
* OPTION LAMRO = 0 , LIMCOL = 0
SETS
J / C1*C6 /
I / B1*B3 / ;
PAPAMETERS
B ( I )
/ B1 6
B2 4
B3 4 /
C ( J )
/ C1 -1
C2 -2
C3 1
C4 -1
C5 -4
C6 2 / ;
TABLE
A ( I , J )
C1 C2 C3 C4 C5 C6
B1 1 1 1 1 1 1
B2 2 -1 -2 4 0 0
B3 0 0 1 1 2 1 ;
VARIABLES
COSTS
POSITIVE VARIABLES
X ( J ) ;
EQUATION
OBJECTIVE
Y ( I ) ;
OBJECTIVE . . COSTS = E = SUM ( J , C ( J ) X ( J ) ) ;
Y ( I ) . . SUM ( J , A ( I , J ) * X ( J ) ) = L = B ( I ) ;
MODEL TEST / ALL / ;
SOLVE TEST USING LP MINIMIZING COSTS ;
DISPLAY X . L , X . M ;
توضیح
بخش SETS
در این بخش تمام اندیسهایی که در نوشتن معادلات مدل استفاده میشوند معرفی میگردند. این اندیسها عباراتی صرفی – عددی هستند. به عنوان مثال در برنامۀ TEST بخش SETS ، ضرایب تابع هدف توسط J و تعداد قیود توسط I مشخص شدهاند.
توجه شود که در اصل J را توسط ضرایب تابع هدف به صورت
J / C1 , C2 , C3 , C4 , C5 , C6 /
یا
J / C1 * C6 /
و I را توسط عناصر صمت راست قیود نامساوی به صورت
I / B1 , B2 , B3 /
یا
I / B1 * B3 /
شمردهایم.
توجه: نام هر اندیس تا ده کاراکتر اجازه داده شده و درج فاصله یا جای خالی در نام اندیس اجازه داده نشده است.
بخش PARAMETERS
در GAMS پارامترها بردارهای ثابت معلوم و مقدار پارامترها به عنوان دادهها در این بخش تعریف میشوند. به منظور تعریف مقادیر بردارها، لازم است، اندیس بردارها قبلا در بخش SETS تعریف شده باشد.
در برنامۀ TEST بردارهای B و C دارای یک مقدار عددی به ترتیب برای هر عنصر مجموعۀ I و J به صورت زیر است.
PAPAMETERS
B ( I )
/ B1 6
B2 4
B3 4 /
C ( J )
/ C1 -1
C2 -2
C3 1
C4 -1
C5 -4
C6 2 / ;
بخش TABLE
در GAMS یک ماتریس، مثلا ماتریس ضرایب قیود در LP ، ماتریس ضرایب هزینه در حمل و نقل و... ، در بخش TABLE آورده میشود.
به صورت زیر :
TABLE
A ( I , J )
C1 C2 C3 C4 C5 C6
B1 1 1 1 1 1 1
B2 2 -1 -2 4 0 0
B3 0 0 1 1 2 1 ;
توجه شود که تنها یک ماتریس در هر بخش TABLE میتوان وارد کرد و لازم است با یک سیمیکالون (؛) خاتمه یابد. برای وارد کردن چندین ماتریس، همان تعداد TABLE لازم است.
بخش متغیرها VARIABLES
در بخش VARIABLES مجهولات مسأله را لیست میکنیم. متغیرها میتوانند اسکالر باشند، یک بردار باشند، یک ماتریس دوبعدی باشند، یک ماتریس سهبعدی باشند و غیره ...
در GAMS متغیرهای نامنفی با عنوان POSITIVE VARIABLES و متغیرهای نامثبت با عنوان NEGATIVE VARIABLES معرفی میشوند.
متغیرها میتوانند BINARY باشند که در این صورت تنها مقادیر صفر و یک میگیرند.
بخش معادلات EQUATIONS
بخش بعدی بخش معادلات است که اسامی تابع هدف و قیود دیگر مسأله در آن تعریف میشود. نامعادلات شبیه معادلات در این بخش ظاهر میشوند.
در برنامۀ TEST نام OBJECTIVE برای عبارتی که باید مینیمم گردد (تابع هدف) انتخاب شده است. نام Y(I) برای قیود مسأله انتخاب شده است.
بعد از نامگذاری، معادلات وارد میشوند. ابتدا نام معادله، به دنبال آن دو نقطه (..) آن گاه تعریف جبری قید که خیلی شبیه علائم استاندارد ریاضی است، میآید. ضرب به وسیلۀ علامت (*) ، تقسیم به وسیلۀ علامت اِسلش (/)، توان به وسیلۀ (**) تعریف میشود.
بعضی از توابع استاندارد
تعریف ریاضی شرح نام
قدر مطلق ABS
COS ( arg ) کسینوس COS
exp (arg) تابع نمایی EXP
لگاریتم در مبنای e از arg لگاریتم طبیعی LOG
لگاریتم در مبنای 10 از arg لگاریتم معمولی LOG10
Qrg*arg توان دوم SQR
Sqrt(arg) ریشه دوم SQRT
بعضی از علائم ریاضی
علائم ریاضی معمولی GAMS
SUM ( I , )
SUM ( ( I , J ) , )
= = E =
= G =
= L =
در GAMS راهی برای بیان کران بالا، کران پایین و قیود تساوی که با یک متغیر سر و کار دارند وجود دارد، مثال زیر را ببینید:
علائم استاندارد ریاضی GAMS
X = L = 20
X = G = 20
X = E = 20
به جای تعاریف فوق قبل از EQUATION ، دستورات زیر را میتوانیم بیاوریم.
X . UP = 20 ;
X . LO = 20 ;
X . FX = 20 ;
که در آن UP ، LO ، FX بیانکننده کران بالا، کران پایین و مقدار ثابت هستند.
بخش MODEL و SOLVE
در آخرین قسمت برنامه، MODEL داده میشود، نام مدل (نام فایل) حداکثر 8 تا 10 کاراکتر بسته به GAMS مورد استفاده، انتخاب میشود.
در GAMS کلمۀ مدل مجموعهای از معادلات است که معمولاً یکی از آنها تابع هدف مسأله است، به عنوان مثال:
MODEL TEST / ALL / ;
این معنی را میدهد که تمام معادلاتی را که قبلا معرفی شده است به عنوان مدل TEST در نظر گرفته شود.
از این قسمت میتوان برای حل تجزیۀ LP هم استفاده کرد (Decomposition) طوری که علاوه بر تابع هدف قیودی را که برای حل کردن مد نظر است در این قسمت مینویسیم.
آخرین خط برنامه:
SOLVE TEST USING LP MINIMIZING COSTS ;
به کامپیوتر اعلام میکند که مدل TEST را با استفاده از برنامهریزی خطی (LP) که در کتابخانه برنامه حاضر است، به منظرو مینیممسازی متغیر COSTS (تابع هدف) حل کن.
در انتهای برنامه یک خط دلخواه را میتوان اضافه کرد:
DISPLAY X . L , X . M ;
که این خط باعث میشود در انتهای جواب برنامه، مقدار متغیرهای مسأله اولیه و مسألۀ دوگان به طور خلاصه و جمع و جور نوشته شود.
چگونه یک برنامۀ GAMS را اجرا کنیم؟
بعد از نوشتن برنامه (در یک ویرایشگر)، از آن ویرایشگر خارج میشویم، وقتی وارد صفحۀ DOS شدیم، دستور زیر را برای اجرای برنامۀ TEST.GMS مینویسیم:
(یا سادهتر GAMS TEST) > GAME TEST . GMS
پس از اجرای برنامه، گزارشی از جواب در فایلی به نام TEST . LST ایجاد خواهد شد.به کمک ویرایشگرتان (مثلا EDIT) میتوانید این فایل را ببینید یا آن را چاپ کنید.
اولین بار که برنامهای را اجرا میکنید، احتمالاً شامل خطاهایی خواهد بود، که این خطاها به وسیلۀ چهار ستاره (****) در سمت چپ خط خطا علامتگذاری میشود. در جلوی (****)، علامت $ را با یک عدد ملاحظه خواهید کرد، در انتهای برنامه و جلوی همان عدد نوع خطایی را که مرتکب شدهاید، نوشته شده است، نوع خطا را مطالعه کرده و نسبت به رفع آن اقدام کنید.
بعد از رفع خطاهای برنامه، سرانجام خلاصهای از جواب را در TEST . LST ملاحظه خواهید کرد، که شامل اطلاعاتی است که نیاز خواهید داشت. این قسمت با چهار خط تیره "----" شروع میشود. به عنوان مثال خلاصهای از جواب برنامۀ TEST عبارت است از:
---- EQU Y
LOWER LEVEL UPPER MARGINAL
B1 6.000 6.000 6.000 -2.000
B2 4.000 4.000 4.000 ESP
B3 4.000 4.000 4.000 -1.000
LOWER LEVEL UPPER MARGINAL
---- VAR Z -INF -16.000 + INF
---- VAR Z
LOWER LEVEL UPPER MARGINAL
C1 - - + INF 1.000
C2 - 4.000 + INF -
C3 - - + INF 4.000
C4 - - + INF 2.000
C5 - 2.000 + INF -
C6 - - + INF 5.000
C7 - - + INF 2.000
C8 - 8.000 + INF -
C9 - - + INF 1.000
**** REPORT SUMMARY : 0 NONOPT
0 INFEASIBEL
0 UNBOUNDED
---- 36 VARIABLE X . L
C2 4.000, C5 2.000, C8 8.000
---- 36 VARIABLE X . M
C1 1.000, C3 4.000, C4 2.000, C6 5.000, C7 2.000, C9 1.000
اولین قسمت خلاصه جواب شامل معادلات است. قسمت دوم خلاصه جواب مقدار بهین تابع هدف را ارائه میدهد که برابر 16- است و در ادامه مقدار بهین متغیره هستند که تحت عنوان LEVEL لیست میشوند. در قسمت پنجم و ششم، X.L و X.M را ملاحظه خواهید کرد که همان مقادیر بهینۀ به ترتیب متغیرهای اولیه و دوگان مسأله میباشند.
به توضیح REPORT SUMMARY در قسمت «نکات مهم» دقت شود.
نکات مهم
1- در TEST.LST بعد از صورت برنامه، خلاصهای از برنامه میآید که تمام اطلاعاتی که شما نیاز دارید در آن نوشته شده است. یکی از قسمتهای مهم آن، قسمتی است به نام MARGINAL که همان مقدار متغیرهای دوگان متناظر با قیود میباشد.
2- در جواب برنامه (در TEST.LST)، قسمتی را ملاحظه خواهید کرد به نام REPORT SUMMARY ، که در این قسمت سه کلمۀ NONOPT ، INFEASIEL ، UNBOUNDED را مشاهده خواهید کرد، اگر در جلوی هر کدام از آنها عدد 1 نوشته شده باشد یعنی همان حالت اتفاق افتاده است، مثلاً اگر در کنار UNBOUNDED عدد 1 نوشته شده باشد یعنی مسأله اولیه بیکران است.
نوشته شدن عدد صفر طبیعی است.
3- به نویسنده برنامه GAMS پیشنهاد میشود که قبل از نوشتن برنامه، مسأله را به صورت استاندارد درآورده و سپس برنامۀ GAMS را بنویسد، حسن این عمل در آن است که در قیود مسأله فقط = E = به کار خواهد رفت و خیلی راحت صورت برنامه قابل تعویض برای مسائل دیگر است.
برای آشنایی بیشتر یک برنامۀ مسألۀ متغیرهای کراندار را در مثال زیر میآوریم:
max
به طوری که
برنامۀ GAMS :
SETS
J / C1 * C5 /
I / B1 * B2 / ;
PARAMETERS
B ( I )
/ B1 10
B2 -7 /
C ( J )
/ C1 2
C2 6
C3 -1
C4 -4
C5 1 / ;
TABLE
A ( I , J )
C1 C2 C3 C4 C5
B1 2 1 4 1 1
B2 -3 -8 3 -1 0 ;
VARIABLES
Z
POSITIVE VARIABLES
X ( J ) ;
X . LO ( ' C1 ' ) = 0 ;
X . UP ( ' C1 ' ) = 3 ;
X . LO ( ' C2 ' ) = 1 ;
X . UP ( ' C2 ' ) = 4 ;
X . LO ( ' C3 ' ) = 0 ;
X . UP ( ' C3 ' ) = 8 ;
X . LO ( ' C4 ' ) = 1 ;
X . UP ( ' C4 ' ) = 2 ;
X . LO ( ' C5 ' ) = 0 ;
X . UP ( ' C5 ' ) = 20 ;
EQUATION
OBJECTIVE
Y ( I ) ;
OBJECTIVE . . Z = E = SUM ( J , C ( J ) * X ( J ) ) ;
Y ( I ) . . SUM ( J , A ( I , J ) * X ( J ) ) = E = B ( I ) ;
MODEL TEST1 USING LP MINIMIZING Z ;
DISPLAY X . L , X . M ;
برای کامل شدن نمونهها ، برنامۀ یک مسأله حمل و نقل زیر را مینویسیم:
صورت مسأله:
4 3 2 1
5
1- 2 6 1
ماتریس
25 3 2 2 4 2
25 1 2 1 3 3
15 20 10 10
برنامۀ GAMS
SETS
J / D1 , D2 , D3 /
I / S1 , S2 , S3 , S4 / ;
PARAMETERS
A ( I )
/ D1 5
D2 25
D3 25 /
B ( J )
/ S1 10
S2 10
S3 20
S4 15 / ;
TABLE
C ( I , J)
S1 S2 S3 S4
D1 6 2 -1 0
D2 4 2 2 3
D3 3 1 2 1 ;
VARIABLES
Z
POSITIVE VARIABLES
X ( I , J ) ;
EQUATION
OBJECTIVE
DBAL ( I )
SBAL ( J ) ;
OBJECTIVE . . Z = E = SUM ( ( I , J ) , C ( I , J ) * X ( I , J ) ;
DBAL ( I ) . . SUM ( J , X ( I , J ) ) = L = A ( I ) ;
SBAL ( J ) . . SUM ( I , X ( I , J ) ) = G = B ( J ) ;
MODEL TEST2 / ALL / ;
SOLVE TEST2 USING LP MINIMIZING Z ;
برنامههای کاربردی درس تحقیق در عملیات
برنامه حل مسائل برنامهریزی خطی استاندارد شده به روش سیمپلکس (زبان برنامهنویسی Pascal)
PROGRAM SIMPLEX;
USES CRT;
TYPE
تعریف ساختار آرایههای جهتاستفاده در برنامه اصلی و توابع وابسته به آنها
TYP1=ARRAY[1..3] OF CHAR;
TYP2=ARRAY[1..10] OF INTEGER;
TYP3=ARRAY[1..10] OF REAL;
TYP4=ARRAY[1..10][1..10] OF CHAR;
VAR
OUT:TEXT; تعریف متغیرهای مورد نیاز در طول برنامه
SW:CHAR;
P:TYP1;
N1,N2,I,J,V,W,CO,S,K:INTEGEP;
A3,HELP,HELP2:REAL;
A3 مقدار تابع هدف
A1,A2,C:TYP3;
A1 سطر هدف متغیرهای حقیقی، A2 سطر هدف متغیرهای تصنعی
B1,B2:TYP4;
B1 ماتریس متغیرهای حقیقی، B2 ماتریس متغیرهای تصنعی
HELP11,HELP12:TYPE2;
بقیه متغیرهای برنامه همگی کمکی میباشند.
FUNCTION RASM : INTEGER ;
این تابع ورودیهایی را جهت ترسیم یک مرحله از جدول سیمپلکس نیاز دارد میگیرد و جدول مربوط به آن مرحله را ترسیم میرکند.
VAR
U:INTEGER;
T:CHAR; تعریف متغیرهای محلی مورد نیاز
BEGIN
CLRSCR;
CO:=CO+1;
GOTOXY(1,10);
WRITE('پایه',P[3]);
آرایه P در برنامه اصلی تعریف شده است.
WRTTE(OUT,'پایه',P[3]);
این قسمت جهت رسم همزمان جدول در یک فایل خروجی (که در برنامه اصلی معرفی شده است) نوشته شده است.
FOR I:=1 TON 1 DO
BEGIN
WRITE(' X',I,' ',);
WRITE(OUT,' X',I,' ');
از این به بعد تمام دستورات WRITE که در اول آنها عبارت OUT آمده است جهت نوشتن در فایل خروجی بکار میروند.