gussex1.gms : Simple GUSS example

**Description**

GUSS is a procedure that facilitates optimization of a collection of related problems modifying data in those problems. GUSS allows one to solve the collection of models in a single pass without needing repeated solves or a LOOP over multiple solves. GUSS is not really a solver but rather organizes and passes data to and from another LP, NLP, MIP etc solver. This is all done in a faster fashion than say when using multiple solves through the GAMS Loop command. In particular GUSS runs the model repeatedly over user specified data for model parameters that collectively define alternative scenarios to be run. In doing this it repeatedly updates the base model with the altered scenario data, then solves the updated model for that scenario and saves user chosen results for each scenario. GUSS was developed by Michael R. Bussieck, Michael C. Ferris, and Timo Lohmann. It is documented in <a href="http://www.gams.com/modlib/adddocs/gusspaper.pdf">http://www.gams.com/modlib/adddocs/gusspaper.pdf</a> and in the GUSS section of the solver manual. Use of GUSS for an existing model requires six steps 1. Definition of scenarios to run 2. Definition of parameters holding scenario specific data for the items in the model that to be changed 3. Definition of parameters that will hold scenario specific model results for the items that the user wished to save 4. Definition of a set that tells GUSS the scenarios to run, data to change and results to save 5. Modification of the solve statement to identify that scenarios will be run 6. Development of code to report the scenario results These 6 steps are demonstrated used the simple transport model

**References**

- Kallrath, J, Ed, Algebraic Modeling Systems: Modeling and Solving Real World Optimization Problems. Springer, Berlin Heidelberg, 2012.
- Bussieck, M R, Ferris, M C, and Lohmann, T, GUSS: Solving Collections of Data Related Models within GAMS. In Kallrath, J, Ed, Algebraic Modeling Systems: Modeling and Solving Real World Optimization Problems. Springer, Berlin Heidelberg, 2012, pp. 35-56.

**Small Model of Type :** LP

**Category :** GAMS Model library

**Main file :** gussex1.gms

$Title Simple GUSS example (GUSSEX1,SEQ=398) $ontext GUSS is a procedure that facilitates optimization of a collection of related problems modifying data in those problems. GUSS allows one to solve the collection of models in a single pass without needing repeated solves or a LOOP over multiple solves. GUSS is not really a solver but rather organizes and passes data to and from another LP, NLP, MIP etc solver. This is all done in a faster fashion than say when using multiple solves through the GAMS Loop command. In particular GUSS runs the model repeatedly over user specified data for model parameters that collectively define alternative scenarios to be run. In doing this it repeatedly updates the base model with the altered scenario data, then solves the updated model for that scenario and saves user chosen results for each scenario. GUSS was developed by Michael R. Bussieck, Michael C. Ferris, and Timo Lohmann. It is documented in http://www.gams.com/modlib/adddocs/gusspaper.pdf and in the GUSS section of the solver manual. Use of GUSS for an existing model requires six steps 1. Definition of scenarios to run 2. Definition of parameters holding scenario specific data for the items in the model that to be changed 3. Definition of parameters that will hold scenario specific model results for the items that the user wished to save 4. Definition of a set that tells GUSS the scenarios to run, data to change and results to save 5. Modification of the solve statement to identify that scenarios will be run 6. Development of code to report the scenario results These 6 steps are demonstrated used the simple transport model Bussieck, M R, Ferris, M C, and Lohmann, T, GUSS: Solving Collections of Data Related Models within GAMS. In Kallrath, J, Ed, Algebraic Modeling Systems: Modeling and Solving Real World Optimization Problems. Springer, Berlin Heidelberg, 2012, pp. 35-56. $offtext Sets i canning plants / seattle, san-diego / j markets / new-york, chicago, topeka / ; 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.4 ; Scalar f freight in dollars per case per thousand miles /90/ ; Parameter c(i,j) transport cost in thousands of dollars per case ; c(i,j) = f * d(i,j) / 1000 ; Variables x(i,j) shipment quantities in cases z total transportation costs in thousands of dollars ; Positive Variable x ; Equations cost define objective function supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ; cost .. z =e= sum((i,j), f * d(i,j) / 1000 *x(i,j)) ; supply(i) .. sum(j, x(i,j)) =l= a(i) ; demand(j) .. sum(i, x(i,j)) =g= b(j) ; Model transport /all/ ; set ScenariosToRun scenarios / base, run1, run2 / Table newsupply(ScenariosToRun,i) updater for a seattle san-diego base 350 600 run1 300 650 run2 400 550 ; Table newdemand(ScenariosToRun,j) updater for b new-york chicago topeka base 325 300 275 run1 325 300 275 run2 350 300 250 ; Set mattrib / system.GUSSModelAttributes /; Parameter resultantx(ScenariosToRun,i,j) collector for level of x srep(ScenariosToRun, mattrib) model attibutes like modelstat etc o(*) GUSS options / SkipBaseCase 1 / Set dict / ScenariosToRun.scenario.'' o. opt .srep a. param .newsupply b. param .newdemand x. level .resultantx / Solve transport using lp minimizing z scenario dict; * The solve statement from the line above results can also be expressed * in traditional GAMS syntax as follows: $ontext loop(ScenariosToRun, a(i) = newsupply(ScenariosToRun,i); b(j) = newdemand(ScenariosToRun,j); Solve transport using lp minimizing z; resultantx(ScenariosToRun,i,j) = x.l(i,j)); $offtext Option resultantx:0:1:2; Display resultantx; Set Error(scenariostorun) Empty solution; Error(scenariostorun) = sum((i,j),resultantx(scenariostorun,i,j)) = 0; Abort$card(error) 'Missing solution for some scenarios', error;