Iterative models/ Dynamic sets
Iterative models/ Dynamic sets
Dear All,
I am working on a power model that the output of the day 1 will be used as an input for the second day and it will continue for a month.
I tried to do this procedure for this goal. I defined a set: tt /1*744/ and then defined adynamic set day1(tt) /1*24/. Day2(tt) /25*48/....Day31(tt)/720*744/
Alias (t,Day1(tt));
I have lots of parameters and variables depended on time (like: Loading for different days(t,x)) with many constraints.
After the model declaration and minimizing the objective for the first iteration(day). I would like to update some of my parameters and then use the "day2" for all the parameters. Something like this
solve model using MIP minimizing obj1; //for the first day//
then: Alias (t, Day2(tt)); // I already know I cant redefine a set but I do not have any clue how I should solve this issue//
Update some of the parameters
solve model using MIP minimizing obj1; //for the second day//
* and same steps till the 31 days.
Best,
Leon
I am working on a power model that the output of the day 1 will be used as an input for the second day and it will continue for a month.
I tried to do this procedure for this goal. I defined a set: tt /1*744/ and then defined adynamic set day1(tt) /1*24/. Day2(tt) /25*48/....Day31(tt)/720*744/
Alias (t,Day1(tt));
I have lots of parameters and variables depended on time (like: Loading for different days(t,x)) with many constraints.
After the model declaration and minimizing the objective for the first iteration(day). I would like to update some of my parameters and then use the "day2" for all the parameters. Something like this
solve model using MIP minimizing obj1; //for the first day//
then: Alias (t, Day2(tt)); // I already know I cant redefine a set but I do not have any clue how I should solve this issue//
Update some of the parameters
solve model using MIP minimizing obj1; //for the second day//
* and same steps till the 31 days.
Best,
Leon
Re: Iterative models/ Dynamic sets
Hi Leon
Instead of having everything based on the hours, you make them depending on hours (1*24) and days (1*31).
You then loop over the days:
e.g.
A parameter is also defined over days and hours
Hope this helps
Renger
Instead of having everything based on the hours, you make them depending on hours (1*24) and days (1*31).
You then loop over the days:
Code: Select all
loop(day,
assing parameter values from tables
solve mymodel
assign solution to other parameters
)
e.g.
A parameter is also defined over days and hours
Code: Select all
table capacity(day,hours)
1 2 3 4 5 ... 24
1
...
31
Renger
____________________________________
Enjoy modeling even more: Read my blog on modeling at The lazy economist
Enjoy modeling even more: Read my blog on modeling at The lazy economist
Re: Iterative models/ Dynamic sets
Thank you Renger. It solved my problem.
Before I post my question, I checked the GAMS world for any similar question and I saw your response to other people as well.
That is really kind of you.
Thank you again.
Before I post my question, I checked the GAMS world for any similar question and I saw your response to other people as well.
That is really kind of you.
Thank you again.
Re: Iterative models/ Dynamic sets
Hi all,
I have a similar problem. I want to solve a model interatively. In my model I have two sets: t (for time) and households. Most of my parameters depend on both sets(t,households) and some only on (households) like:
I have several equations and variables that depend on both sets (t,households) but there are also some equations that only depend on (t).
My aim is to solve the model for each member of the set household with a loop statement. I have 2 questions regarding this:
1) Do I have to change the index of the parameters, variables and equations? And if so how shall I do this considering that not all parameters depend on the same sets.
2) Ho can I update the data in the loop statement? At the official GAMS docu the following example is used (https://www.gams.com/latest/docs/UG_FlowControl.html):
What I do not understand is how to do the data update: problemdata = g(i).?
I have a similar problem. I want to solve a model interatively. In my model I have two sets: t (for time) and households. Most of my parameters depend on both sets(t,households) and some only on (households) like:
Code: Select all
...
demand_electrical(t, household)
$LOAD demand_electrical
volumeOfBufferTank (household)
$LOAD volumeOfBufferTank
...
I have several equations and variables that depend on both sets (t,households) but there are also some equations that only depend on (t).
My aim is to solve the model for each member of the set household with a loop statement. I have 2 questions regarding this:
1) Do I have to change the index of the parameters, variables and equations? And if so how shall I do this considering that not all parameters depend on the same sets.
2) Ho can I update the data in the loop statement? At the official GAMS docu the following example is used (https://www.gams.com/latest/docs/UG_FlowControl.html):
Code: Select all
loop (i,
problemdata = g(i);
solve mymodel using lp maximizing profit;
d(i) = profit.l;
);
Re: Iterative models/ Dynamic sets
Peter,
You could introduce a dynamic subset of household and use that in the definition (not declaration!) of equations.
Now if you set h(household) = yes; the entire set household will be contained in subset h and you solve the entire model as you probably did before. To solve slices of the model for every household independently in a loop you could do:
I hope this helps!
Fred
You could introduce a dynamic subset of household and use that in the definition (not declaration!) of equations.
Code: Select all
set h(household) 'dynamic subset of household';
[...]
variable x(t,household);
[...]
equation e(household);
[...]
e(h).. sum(t,x(t,h)) + ... =g= ...;
Code: Select all
h(household) = no;
loop(household,
h(household) = yes;
solve mymodel ...
h(household) = no;
);
Fred
Re: Iterative models/ Dynamic sets
Thanks a lot Fred for your answer and help. I really appreciate the tremendous help in this forum
it help me solve the problem. Now I want to not only run the model for every household for the entire optimization horizon (all t) but I want for every 288 timeslots to run run the optimization for every household for a horizon of 288 timeslots.
My questions are:
1) In conventional programming you would use a nested loop for that. Is that also possible in GAMS?
2) How can I tell GAMS to repeatedly optimize for 288 timeslots for every household? If I just use the conventional loop with a t index, then I will solve the model for every timeslot.
![Smile :)](./images/smilies/icon_e_smile.gif)
it help me solve the problem. Now I want to not only run the model for every household for the entire optimization horizon (all t) but I want for every 288 timeslots to run run the optimization for every household for a horizon of 288 timeslots.
My questions are:
1) In conventional programming you would use a nested loop for that. Is that also possible in GAMS?
2) How can I tell GAMS to repeatedly optimize for 288 timeslots for every household? If I just use the conventional loop with a t index, then I will solve the model for every timeslot.
Re: Iterative models/ Dynamic sets
Peter,
Yes, you can use nested loops to implement that.
The following example creates a set of time slices and maps the slices to the original timeslots (not sure how many you have in total). Then you can basically use the same logic with dynamic subsets for the timeslots in your equations as illustrated before with the set households.
I hope this helps!
Fred
Yes, you can use nested loops to implement that.
The following example creates a set of time slices and maps the slices to the original timeslots (not sure how many you have in total). Then you can basically use the same logic with dynamic subsets for the timeslots in your equations as illustrated before with the set households.
Code: Select all
set tt 'super set of time steps' /t1*t8760/;
$eval tSlices ceil(card(tt)/288)
set tSlice / ts1*ts%tSlices% /
t(tt) 'dynamic subset of tt'
map(tSlice,tt) 'mapping of time slice to time steps'
;
map(tSlice,tt) = (ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt);
option map:0:0:1; display map;
loop(tSlice,
t(tt) = map(tSlice,tt); display t;
loop(household,
h(household) = yes;
solve mymodel ...
h(household) = no;
);
);
Fred
Re: Iterative models/ Dynamic sets
Thanks Fred for your answer,
I first of all wanted to try the mapping of the timeslots (without having the nested loop). However I have to admit that I don't the code you posted so I just copied and pasted it in my model (I merely adjusted the number of time slots). The beginning of my model looks like this:
Unfortunately it does not work and I get the following error message: " Domain list redefined - no previous domain list - * assumed when data was associated with this symbol" and the line "t(tt) 'dynamic subset of tt' " is marked. Then I tried to comment out the lines " t timeslices" and "$LOAD t" at the beginning (which were part of my inicial code and not part of the code you posted). After that I received many error messages stating that a set could not be found.
I first of all wanted to try the mapping of the timeslots (without having the nested loop). However I have to admit that I don't the code you posted so I just copied and pasted it in my model (I merely adjusted the number of time slots). The beginning of my model looks like this:
Code: Select all
Set
t timeslices
household households;
$call gdxxrw data_5min_Jan_DayAhead_1HH.xlsx index=index!A1
$ife errorlevel<>0 $abort Problems running GDXXRW
$GDXIN 'data_5min_Jan_DayAhead_1HH.gdx';
$LOAD t
$LOAD household
set tt 'super set of time steps' /t1*t8928/;
$eval tSlices ceil(card(tt)/288)
set tSlice / ts1*ts%tSlices% /
t(tt) 'dynamic subset of tt'
map(tSlice,tt) 'mapping of time slice to time steps'
;
map(tSlice,tt) = (ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt);
option map:0:0:1; display map;
Re: Iterative models/ Dynamic sets
Peter,
Just pasting code that you don't understand is probably not a good idea. In order to provide target-oriented help, it would be good to know what part of the code you do not understand.
I assumed that you have set of all timeslots. In my example this was tt. I dont know how many timeslots you actually have in total, so I just made up some number for my example (8760=hours per year).
My understanding was that you want to slice your entire time horizon into smaller parts of 288 timeslots each. With the 8928 time slots you have this would result in 31 such smaller parts or slices.
The following line computes this number 31 and stores it in a compile time variable:
You might want to consult the documentation if you are struggling with this part of the code:
https://www.gams.com/latest/docs/UG_Gam ... leTimeVars
https://www.gams.com/latest/docs/UG_Dol ... DOLLAReval
Then a corresponding set for the time slices is declared:;
Apparently, you need to know which time slots are contained in which time slice. Therefore, a corresponding mapping is introduced and calculated.
That's basically it.
You get an error because you already have a set t which you also load from data_5min_Jan_DayAhead_1HH.gdx. Not sure what is in this set. If this is your superset with all the time slots, you should adjust the set names accordingly. I guess you can figure that out yourself.
Best,
Fred
Just pasting code that you don't understand is probably not a good idea. In order to provide target-oriented help, it would be good to know what part of the code you do not understand.
I assumed that you have set of all timeslots. In my example this was tt. I dont know how many timeslots you actually have in total, so I just made up some number for my example (8760=hours per year).
My understanding was that you want to slice your entire time horizon into smaller parts of 288 timeslots each. With the 8928 time slots you have this would result in 31 such smaller parts or slices.
The following line computes this number 31 and stores it in a compile time variable:
Code: Select all
$eval tSlices ceil(card(tt)/288)
https://www.gams.com/latest/docs/UG_Gam ... leTimeVars
https://www.gams.com/latest/docs/UG_Dol ... DOLLAReval
Then a corresponding set for the time slices is declared:
Code: Select all
set tSlice / ts1*ts%tSlices% /
Apparently, you need to know which time slots are contained in which time slice. Therefore, a corresponding mapping is introduced and calculated.
Code: Select all
set t(tt) 'dynamic subset of tt'
map(tSlice,tt) 'mapping of time slice to time steps'
;
map(tSlice,tt) = (ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt);
You get an error because you already have a set t which you also load from data_5min_Jan_DayAhead_1HH.gdx. Not sure what is in this set. If this is your superset with all the time slots, you should adjust the set names accordingly. I guess you can figure that out yourself.
Best,
Fred
Re: Iterative models/ Dynamic sets
Thanks Fred for your answer,
there are still a few things that I do not understand.
why do we need a Compile-Time Variable here? You anyways specify the number of total timeslots. So the number of time slices can be computed based on this.
I could not find a good description of the mapping operator. What is done in the statement "(ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt)"?
The same question here. What does 0:0:1 mean?
Regarding my code I changed the name of the variable that I used before from t to t_a. This set (and all other parameters) are loaded from the file "data_5min_Jan_DayAhead_1HH.gdx."
I also load other parameters from that file and define variables.
If I run the model I get many error messages stating "Values for domain 1 are unknown - no checking possible" and "Set has not been initialized".
My questin is whether I have to adjust the arguments for all those variables and parameters? For example shall I change "demand_electrical(t, household)" to "demand_electrical(tt, household)" or something like that?
there are still a few things that I do not understand.
Code: Select all
$eval tSlices ceil(card(tt)/288)
Code: Select all
map(tSlice,tt) = (ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt);
Code: Select all
option map:0:0:1; display map;
Regarding my code I changed the name of the variable that I used before from t to t_a. This set (and all other parameters) are loaded from the file "data_5min_Jan_DayAhead_1HH.gdx."
Code: Select all
Set
t_a timeslices
household households;
$call gdxxrw data_5min_Jan_DayAhead_1HH.xlsx index=index!A1
$ife errorlevel<>0 $abort Problems running GDXXRW
$GDXIN 'data_5min_Jan_DayAhead_1HH.gdx';
$LOAD t_a
$LOAD household
set tt 'super set of time steps' /t1*t8928/;
$eval tSlices ceil(card(tt)/288)
set tSlice / ts1*ts%tSlices% /
t(tt) 'dynamic subset of tt'
map(tSlice,tt) 'mapping of time slice to time steps'
;
map(tSlice,tt) = (ord(tSlice)-1)*288 < ord(tt) and (ord(tSlice))*288 >= ord(tt);
option map:0:0:1; display map;
....
Code: Select all
...
Parameter
demand_heating(t, household)
$LOAD demand_heating
demand_electrical(t, household)
$LOAD demand_electrical
...
temperature_level_DHWTank.lo(t, household) = minimalDHWTankTemperature;
temperature_level_DHWTank.up(t, household) = maximalDHWTankTemperature;
...
My questin is whether I have to adjust the arguments for all those variables and parameters? For example shall I change "demand_electrical(t, household)" to "demand_electrical(tt, household)" or something like that?