Sequential modeling (sensibility)

Hi,

In the “A GAMS Tutorial by Richard E. Rosenthal” (https://www.gams.com/latest/docs/UG_Tutorial.html), I’m trying to run the model several times in a sequential way in order to see the influence of changing same SCALAR/PARAMETERS in each model run

Problem 1
What I want to do is to run the model several times with diferent “f” (Scalar f freight in dollars per case per thousand miles /90/) to see the impact (sensibility) on the model results when I change “f” from 90 to other value (30, 40 50, … , 130, 140, 150).

Problem 2
Very similar to the first one. The only difference is that I want to try the Seattle capacity (350 cases) to 250,300,400 and 450 and see the impact on the optimization results


Bottom line, I want (if possible) to run the model several times with some differences in the SCALAR and/or in the PARAMETERS

Does anyone knows how to do this? (if possible)

Thanks
Paulo


$title a transportation model
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.8 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), c(i,j)*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/ ;

Solve transport using lp minimizing z ;

Display x.l, x.m;

Hi,

This is not an issue at all. You can either change the values and write multiple solve statements one after another
f = 90;
solve …
f = 30;
solve…

and so on.

Or you can define sets iterf/19/ and iterc/14/. Then define parameters flist(iterf) and seattle_capacity_list(iterc)
parameter
flist(iter1)
/
1 30
2 40
3 50

9 110
/;

Finally, you can loop over iterf
loop(iterf,
f =seattle_capacity_list(iterc);
solve…
);

loop(iterc,
a(‘seattle’) = flist(iterf);
solve…
);

Alternatively, since your f and capacity increase by a fixed number you can even use a while loop and if conditions just like you do in a usual code. This way, you increment f by 10 and capacity by 50 whenever you want.

I should also mention that you can also declare parameters to report values of interest and store values to it so that at the end of all runs you can simply do an execute_unload and see the parameters in one place without dealing with large .lst files.
Hope this helps.

  • Atharv