Hello everybody,
I am currently trying to establish my first GAMS model. However, I can't figure out a solution for my problem.
I have a variable x, which depends on a sector and a time: x (sector, time)
The goal is to find the optimal x for each hour of the year for my problem.
In my model I have the condition that if x(sector1, t) is 0 and for the next hour at x(sector1, t+1) is positiv, it has to be positiv for the next three hours.
My former solution to model this was to use an equation. It is in the following code:
equation1(t)$((x('sector1',t)=0)and(x('sector1',t+1)>0)) .. x('Cement',t+2) and x('Cement',t+3) and x('Cement',t+4) =g= 1;
Does anybody know a solution to my problem?
Any form of help is appreciated. Thank you in advance.
Condition in an equation
Re: Condition in an equation
Hi,
Your $() expression on the equation contains endogenous variables. That's not possible. The $() on the equation determines at model generation if the equation should be part of your model or not. You want this constraint in your model, so you need to implement:
equation1(t).. ((x('sector1',t)=0)and(x('sector1',t+1)>0)) => x('Cement',t+2) and x('Cement',t+3) and x('Cement',t+4);
I assume x to be a binary variable, otherwise x('Cement',t+2) and x('Cement',t+3) and x('Cement',t+4) makes little sense. Then x('sector1',t+1)>0 becomes x('sector1',t+1)>=1. Optimization with strict greater or less is difficult (see e.g. http://yetanothermathprogrammingconsult ... ation.html).
If this is the only logical constraint (and x is indeed a binary variable) you can declare equation1 as "logic equation" (see https://www.gams.com/latest/docs/UG_Equ ... cEquations) and "solve" as model type EMP and solver LogMIP. This will reformulate into a MIP/MINLP and solve with a regular MINLP solver.
If you have more of this type, x is an integer variable, or you want to understand what goes on behind the scenes you should reformulate this your self. There is a lot of literature available dealing with reformulations for logical conditions. The popular Big M method even has its own Wikipedia article: https://en.wikipedia.org/wiki/Big_M_method
To give you just one reference: The book Model Building in Mathematical Programming by H.P Williams (https://www.wiley.com/en-us/Model+Build ... 1118443330) is good in general and has a section dedicated to Logical conditions (9.2).
-Michael
Your $() expression on the equation contains endogenous variables. That's not possible. The $() on the equation determines at model generation if the equation should be part of your model or not. You want this constraint in your model, so you need to implement:
equation1(t).. ((x('sector1',t)=0)and(x('sector1',t+1)>0)) => x('Cement',t+2) and x('Cement',t+3) and x('Cement',t+4);
I assume x to be a binary variable, otherwise x('Cement',t+2) and x('Cement',t+3) and x('Cement',t+4) makes little sense. Then x('sector1',t+1)>0 becomes x('sector1',t+1)>=1. Optimization with strict greater or less is difficult (see e.g. http://yetanothermathprogrammingconsult ... ation.html).
If this is the only logical constraint (and x is indeed a binary variable) you can declare equation1 as "logic equation" (see https://www.gams.com/latest/docs/UG_Equ ... cEquations) and "solve" as model type EMP and solver LogMIP. This will reformulate into a MIP/MINLP and solve with a regular MINLP solver.
If you have more of this type, x is an integer variable, or you want to understand what goes on behind the scenes you should reformulate this your self. There is a lot of literature available dealing with reformulations for logical conditions. The popular Big M method even has its own Wikipedia article: https://en.wikipedia.org/wiki/Big_M_method
To give you just one reference: The book Model Building in Mathematical Programming by H.P Williams (https://www.wiley.com/en-us/Model+Build ... 1118443330) is good in general and has a section dedicated to Logical conditions (9.2).
-Michael