A GAMS Tutorial Dr. Michael Georgiadis Centre for Process Systems Engineering (CPSE) Department of Chemical Engineering & Chemical Technology
Περίγραμμα Χαρακτηριστικά του GAMS Ενδεικτικό παράδειγμα Αρχείο εισόδου Μεταγλώττιση Αρχείο εξόδου
Εισαγωγή GAMS - General Algebraic Modelling System Αναπτύχθηκε από την World Bank για οικονομολόγους! Κύρια Χαρακτηριστικά: Γλώσσα υψηλού επιπέδου Αναπαράσταση μοντέλων με τρόπο παρόμοιο με αυτό στο χαρτί Η περιγραφή του μοντέλου είναι ανεξάρτητη από τον αλγόριθμο επίλυσης
GAMS Μεταγλώττιση του Μοντέλου Αρχείο Εξόδου με αποτελέσματα filename.lst Αρχείο Εισόδου του Μοντέλου filename.gms Optimization Solver e.g. MINOS CONCOPT CPLEX DICOPT
Παράδειγμα στο GAMS ΠΑΡΑΔΕΙΓΜΑ ΜΕΤΑΦΟΡΩΝ Με δεδομένα: Τη μέγιστη διαθέσιμη ποσότητα προϊόντος από το εργοστάσιο i Τη ζήτηση στην αγορά j Την απόσταση μεταφοράς από το εργοστάσιο i στην αγορά j Το μοναδιαίο κόστος μεταφοράς του προϊόντος από το εργοστάσιο i στην αγορά j Ζητείται: Το ελάχιστο κόστος μεταφοράς των προϊόντων από τα εργοστάσια στις αγορές
Παράδειγμα στο GAMS ΠΑΡΑΔΕΙΓΜΑ ΜΕΤΑΦΟΡΩΝ New York New York 325 275 300 600 350 2.5 kMiles 1.4 kMiles 1.8 kMiles 1.7 kMiles San Diego Topeka Topeka Seattle Chicago
Παράδειγμα στο GAMS ΠΑΡΑΔΕΙΓΜΑ ΜΕΤΑΦΟΡΩΝ Αποστάσεις (σε χιλιάδες μίλια) Μέγιστη Παραγωγή Αγορές (σε κιβώτια) Εργοστάσια New York Chicago Topeka Seattle 2.5 1.7 1.8 350 San Diego 2.5 1.8 1.4 600 Demand 325 300 275 Τα μεταφορικά κόστη είναι $90 ανά κιβώτιο ανά χίλια μίλια
Παράδειγμα Μεταφορών: ΑΛΓΕΒΡΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ Δείκτες (ή σύνολα): i = εργοστάσια j = αγορές Δεδομένα (ή παράμετροι): ai = διαθέσιμη ποσότητα προϊόντος στο εργοστάσιο i (σε κιβώτια) bj = ζήτηση του προϊόντος στην αγορά j (κιβώτια) f = κόστος μεταφοράς ($/κιβώτιο/1000 μίλια) dij = απόσταση μεταξύ εργοστασίου i και αγοράς j (σε χιλιάδες μίλια) cij = f.dij/ 1000, κόστος ανά μονάδα που μεταφέρεται μεταξύ του εργοστασίου i και της αγοράς j ($Κ/ κιβώτιο)
Παράδειγμα Μεταφορών: ΑΛΓΕΒΡΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ Μεταβλητές Απόφασης (Decision Variables): xij = ποσότητα που θα μεταφερθεί από το εργοστάσιο i στην αγορά j (κιβώτια), Όπου xij≥ 0, για κάθε i, j Περιορισμοί (Constraints): Παρατήρησε το όριο προμήθειας στο εργοστάσιο i: ∑j xij ≤ ai , για κάθε i (κιβώτια) Ικανοποίησε τη ζήτηση στην αγορά j: ∑i xij ≥ bj , για κάθε j (κιβώτια) Αντικειμενική Συνάρτηση (Objective Function): Minimize ∑i ∑j cij xij ($K)
GAMS Code
GAMS Code (contd.)
Δομή ενός Μοντέλου GAMS SETS Δήλωση Ορισμός μελών DATA (PARAMETERS, TABLES, SCALARS) VARIABLES Ορισμός τύπου (Προαιρετικά) Ορισμός ορίων και/ή αρχικών τιμών EQUATIONS Ορισμός MODEL και SOLVE statements (Προαιρετικά) DISPLAY statements
Γενικές Παρατηρήσεις Μοναδικός κανόνας για τη σειρά: δεν μπορούμε να αναφερθούμε σε κάτι πριν το ορίσουμε Τερματισμός statements με ερωτηματικό (;) Ο compiler του GAMS δεν είναι case-sensitive Γραμμές που ξεκινούν με * είναι γραμμές σχολίων Τα ονόματα πρέπει να ξεκινούν με γράμμα και να ακολουθούνται από μέχρι 9 γράμματα ή ψηφία Το επεξηγηματικό κείμενο πρέπει να μην ξεπερνάει τη μία γραμμή μην έχει μήκος πάνω από 80 χαρακτήρες μην ξεκινάει με δεσμευμένες λέξεις του GAMS και να μην περιέχει τα σύμβολα =, ;/
Σύνολα Σύνολα στο GAMS ≡ δείκτες σε αλγεβρικά μοντέλα, π.χ. Sets i canning plants / seattle, san-diego / j markets / new-york, chicago, topeka / ; Τα στοιχεία δεν μπορούν να αποτελούνται από πολλές λέξεις. Π.χ. NEW-YORK όχι NEW YORK Μπορούμε εναλλακτικά να ορίσουμε τα σύνολα ως: Set i canning plants / seattle, san-diego /; Set j markets / new-york, chicago, topeka / ; Όταν τα στοιχεία ακολουθούν μία σειρά, χρησιμοποιούμε το αστεράκι: Set T time periods /1991*2000/; Set M machines /MACH1*MACH24/; Αυτό αντιστοιχεί σε T = {1991, 1992, …, 2000} και M = {MACH1, MACH2, …, MACH24} Όταν έχουμε αλληλεπίδραση μεταξύ στοιχείων του ίδιου συνόλου (i και i΄), χρησιμοποιούμε την εντολή alias (i, ii) και ορίζουμε το σύνολο i΄: Π.χ. i = {1,2}; r1 = 6; r2 = 4; τότε bii’ = 7-ri+ri’ ==> b11 = 7, b12 = 5, b21 = 9, b22 = 7 b(i,ii) = 7 – r(i) + r(ii);
Δεδομένα Εισαγωγή με λίστες Εισαγωγή με πίνακες Parameters a(i) capacity of plant i in cases / seattle 350 san-diego 600 / b(j) demand at market j in cases / new-york 325 chicago 300 topeka 275 / ; Εισαγωγή με πίνακες Table d(i,j) distance in thousands of miles new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4 ; !!! Προσοχή !!! στο ;
Δεδομένα Εισαγωγή με απευθείας ανάθεση όπου το GAMS υπολογίζει τις τιμές αυτόματα: Parameter c(i,j) transport cost in 1000s of dollars per case ; c(i,j) = f * d(i,j) / 1000 ; Επίσης D(‘seattle’, ‘new-york’) = 2.5; Scalar είναι μία παράμετρος που δεν έχει πεδίο ορισμού: Scalar f freight in dollars per case per thousand miles /90/; Η προκαθορισμένη τιμή για μη ορισμένες παραμέτρους και scalars είναι μηδέν.
Μεταβλητές Τύποι μεταβλητών: Ο προκαθορισμένος τύπος είναι FREE Τύπος Μεταβλητής Επιτρεπτό εύρος τιμών FREE -∞ to +∞ POSITIVE 0 to +∞ NEGATIVE -∞ to 0 BINARY 0 or 1 INTEGER 0, 1, …, 100
Περιορισμοί Οι Περιορισμοί πρέπει να δηλωθούν και να οριστούν ξεχωριστά Η δήλωση γίνεται γράφοντας: Το όνομα της εξίσωσης που ορίζεται Το πεδίο ορισμού της Συνθήκη περιορισμού πεδίου ορισμού (προαιρετικό) Τις δύο τελείες '..‘ Το αριστερό μέρος Τελεστής: =l=, =e=, =g= Το δεξί μέρος
Περιορισμοί
Περιορισμοί Χρήση των operators SUM και PROD: SUM(J, X(J)) είναι ισοδύναμο με SUM(J, X(Ι,J)) είναι ισοδύναμο με PROD(J, X(J)) είναι ισοδύναμο με SUM((I,J), X(I,J)) είναι ισοδύναμο με SUM(I, SUM(J, X(I,J))) Μπορούν να χρησιμοποιηθούν σε απευθείας αναθέσεις PARAMETERS και SCALARS, Π.χ. SCALAR TOTSUPPLY total supply over all plants; TOTSUPPLY = SUM(i, b(i));
Ο Τελεστής Δολάριο ($) Δίνει τη δυνατότητα συνοπτικού χειρισμού εξαιρέσεων Παράδειγμα 1: If y ≥ 1.5, then x = 2, else x = 0 SCALAR X, Y; Y = 2; X = 1; X = 2 $ (Y GE 1.5); Παράδειγμα 2: If y ≥ 1.5, then x = 2, else x = 1 X $ (Y GE 1.5) = 2; Παράδειγμα 3: If xi ≠ 0, then pi = 1/xi, else pi = 0 p(i) = (1/x(i)) $ (x(i) NE 0); Παράδειγμα 4: j = {1,2,3,4}. EQ1.. SUM(j $ (ord(j) GT 1), x(j)) =E= 1; Παράδειγμα 5: If xi ≠ 0, then zi = yi-3 EQ2$(x(i) NE 0).. z(i) =E= y(i)-3;
Model and Solve Statements Με τη λέξη κλειδί MODEL στο GAMS μπορούμε να ορίσουμε μία συλλογή από Equations: MODEL TRANSPORT /ALL/ ή ισοδύναμα: MODEL TRANSPORT /COST, SUPPLY, DEMAND/; Για την επίλυση του Μοντέλου που ορίσαμε, χρησιμοποιούμε το SOLVE: SOLVE ModelName USING SolutionProcedure Keyword OptimizationVariable; Διαθέσιμα Solution Procedures: LP για linear programming NLP για non-linear programming MIP για mixed-integer linear programming MINLP για mixed-integer non-linear programming Διαθέσιμα Keywords: MINIMIZING MAXIMIZING
Display Statements Με την εντολή DISPLAY, μπορούμε να εμφανίσουμε τις τιμές παραμέτρων, μεταβλητών, κ.α. Η γενική της μορφή είναι: DISPLAY VariableName.Suffix, Parameter; Διαθέσιμα suffixes: .LO = lower bound .L = level value, actual value (initial or final) .UP = upper bound .M = dual value, Lagrange or Kuhn-Tucker multipliers Παράδειγμα DISPLAY x.l;
Όρια Πριν την επίλυση του μοντέλου, μπορούμε να ορίσουμε άνω και κάτω όρια για τις μεταβλητές μας ως εξής: X.UP(I,J) = CAPACITY(I,J); X.LO(I,J) = 10.0; X.UP(‘SEATTLE’, ‘NEW-YORK’) = 1.2*CAPACITY(‘SEATTLE’, ‘NEW-YORK’); Κάποιες τιμές μεταβλητών μπορούν να δοθούν από το χρήστη πριν την επίλυση: X.FX(‘SEATTLE’, ‘NEW-YORK’) = 45.0;
Γενική Δομή της Εξόδου του GAMS Echo Print Μηνύματα Λάθους Λίστες Εξισώσεων Στατιστικά Μοντέλου Αναφορές Κατάστασης Αναφορές Λύσης
Echo Print Αυτό είναι ένα αντίγραφο του αρχείου εισόδου με αρίθμηση γραμμών Πάντα εμφανίζεται στην έξοδο Το statement $TITLE κάνει το κείμενο που παρατίθεται να τυπωθεί στην κορυφή της κάθε σελίδας Η εντολή $OFFUPPER δίνει τη δυνατότητα στο echo να περιέχει ανάμεικτα κεφαλαία και πεζά
Μηνύματα Λάθους Αυτά εμφανίζονται μέσα στο echo. Ξεκινούν με **** και περιέχουν ένα $ με έναν αριθμό ακριβώς κάτω από το σημείο του λάθους. Οι αριθμοί αυτοί επεξηγούνται μετά το echo Παράδειγμα 1: SET SUM months /JUN, JUL, AUG/; δίνει echo: 2 SET SUM months /JUN, JUL, AUG/; **** $2 Το GAMS υποδεικνύει ότι κάτι δεν πάει καλά με το στοιχείο SUM. Στο κάτω μέρος του echo εμφανίζεται το μήνυμα: ERROR MESSAGES 2 IDENTIFIER EXPECTED Το πρόβλημα είναι ότι το SUM είναι μία δεσμευμένη λέξη του GAMS.
Μηνύματα Λάθους (contd.) Παράδειγμα 2: Έστω ότι κάποιος προσπάθησε να γράψει τον περιορισμό: Το GAMS θα βρει και τα 2 λάθη: EQ10(I).. SUM(I, X(I,J)) =E= 100; **** $125 $149 ERROR MESSAGES 125 SET IS UNDER CONTROL ALREADY 149 UNCONTROLLED SET ENTERED AS CONSTANT Συχνά 1 μικρό λάθος μπορεί να δημιουργήσει μία «χιονοστιβάδα» λαθών Πάντα φροντίζουμε να διορθώσουμε το πρώτο λάθος που εμφανίζεται και μετά τα υπόλοιπα
Λίστες Εξισώσεων Εμφανίζονται μετά την επίλυση του μοντέλου και δίνουν τη δυνατότητα ελέγχου αν το GAMS παράγει το μοντέλο που θέλαμε Παράδειγμα: ο γενικός περιορισμός ζήτησης στο αρχείο εισόδου DEMAND(J).. SUM(I, X(I,J)) =G= B(J); Παράγει την παρακάτω λίστα στο αρχείο εξόδου: ----DEMAND =G= satisfy demand at market j DEMAND(NEW-YORK).. X(SEATTLE,NEW-YORK)+X(SAN-DIEGO,NEW-YORK)=G= 325; DEMAND(CHICAGO).. X(SEATTLE,CHICAGO)+X(SAN-DIEGO,CHICAGO)=G= 300; DEMAND(TOPEKA).. X(SEATTLE,TOPEKA)+X(SAN-DIEGO,TOPEKA)=G= 275; Ο προκαθορισμένος αριθμός εξισώσεων που εμφανίζεται είναι 3 για κάθε γενική εξίσωση. Για να το αλλάξουμε, εισάγουμε τη γραμμή OPTION LIMROW = number; πριν το SOLVE statement. Χρησιμοποιώντας OPTION LIMROW = 0, LIMCOL = 0; γλυτώνουμε σελίδες χαρτιού μόλις τελειώσουμε με την αποσφαλμάτωση του μοντέλου!
Στατιστικά Μοντέλου Για το πρόβλημα μεταφοράς: MODEL STATISTICS BLOCKS OF EQUATIONS 3 SINGLE EQUATIONS 6 BLOCKS OF VARIABLES 2 SINGLE VARIABLES 7 NON ZERO ELEMENTS 19 Το BLOCK αναφέρεται στις γενικές εξισώσεις και μεταβλητές Το SINGLE αναφέρεται στις ξεχωριστές γραμμές και στήλες
Περίληψη Λύσης Για το πρόβλημα μεταφοράς: SOLVE SUMMARY MODEL TRANSPORT OBJECTIVE Z TYPE LP DIRECTION MINIMIZE SOLVER CONOPT2 FROM LINE 49 **** SOLVER STATUS 1 NORMAL COMPLETION **** MODEL STATUS 1 OPTIMAL **** OBJECTIVE VALUE 153.6750 RESOURCE USAGE, LIMIT 0.101 1000.000 ITERATION COUNT, LIMIT 6 10000
Περίληψη Λύσης (συνέχεια) Η επιθυμητή κατάσταση του solver είναι 1 NORMAL COMPLETION Άλλες πιθανές καταστάσεις είναι: Ξεπεράστηκε το όριο επαναλήψεων: 2 ITERATION INTERRUPT Λύση: Αλλάξτε την τιμή της παραμέτρου ITERLIM Ξεπεράστηκε το όριο χρόνου: 3 RESOURCE INTERRUPT Λύση: Αλλάξτε την τιμή της παραμέτρου RESLIM Διακοπή από το χρήστη: 8 USER INTERRUPT κ.α.
Περίληψη Λύσης (συνέχεια) Υπάρχουν 11 πιθανές καταστάσεις του μοντέλου Για LPs, οι πιο κοινές καταστάσεις είναι: 1 OPTIMAL 3 UNBOUNDED 4 INFEASIBLE Για NLPs, η επιθυμητή κατάσταση είναι: 2 LOCALLY OPTIMAL Για IPs, η επιθυμητή κατάσταση είναι: 8 INTEGER SOLUTION
Αναφορές λύσης
Αναφορές λύσης (συνέχεια) Οι μονές τελείες αναπαριστούν μηδενικά Η καταχώρηση EPS σημαίνει μικρή τιμή αλλά όχι μηδέν Αν τα αποτελέσματα περιέχουν infeasibilities: INFES Αν τα οριακά κόστη έχουν λάθος πρόσημο: NOPT Αν το πρόβλημα είναι unbounded: UNBND Στο τέλος της αναφοράς λύσης, υπάρχει μία περιληπτική αναφορά: Η statement DISPLAY X.L, X.M; δίνει: