Page **3** of **3**

### Re: Objective with if-condition

Posted: **Fri Jun 01, 2018 3:49 pm**

by **cladelpino**

Hi Peter,

So you suggest that I should not define variables in equations but rather define them immediately? So instead of having for example

No, I'm not suggesting that ! Your code is totally correct. Your problem is just your conceptual understanding. This is a little hard to explain not in person... A retry: There are no "variable definitions" in optimization problems, just constraints involving variables.

If the problem is infeasible (according to the solver) I do not see any constraint value because the results are not created.

This is a peculiarity of CPLEX on GAMS. Some solvers return infeasible solutions.

When there is a solution the result file is created by GAMS and there you most often find values greater than one for the =e= equations.

Like I told you before, it all depends on the "right hand side" of the constraints (the part that doesn't depend on variables).

ie

Has a value of 2 in feasible solutions, while

is equal to

Which has a value of 0 in feasible solutions.

Please ask away, now I want to help you until you get it !

Best

Claudio

### Re: Objective with if-condition

Posted: **Mon Jun 04, 2018 10:40 am**

by **PeterBe**

Thanks cladelpino for your answer,

I think (and hope) that I have understood it now

### Re: Objective with if-condition

Posted: **Mon Jun 18, 2018 6:26 pm**

by **PeterBe**

Hi guys,

it's me again having a slightly different question as the one posted before but it has also something to do with modelling if conditions:

I now have two variables x and y that with the following constraings:

x + y <= 1

x + y >= 0.1

if x > 0 --> y =0

if y > 0 --> x =0

0<=x<=1

0<=y<=1

How can I implement that in GAMS? Appreciate every comment.

### Re: Objective with if-condition

Posted: **Wed Jun 20, 2018 11:55 am**

by **Fred**

Peter,

You might want to look into SOS1 variables:

https://www.gams.com/latest/docs/UG_Lan ... eVariables
As usual, there are many ways to formulate such logical conditions, e.g. via an additional binary variable.

Best,

Fred

### Re: Objective with if-condition

Posted: **Wed Jun 20, 2018 4:16 pm**

by **PeterBe**

Thanks Fred for your answer,

I changed the variables

Code: Select all

```
Binary variable x(t, household) heatGenerationForBufferTank;
Binary variable y(t, household) heatGenerationForDHWTank;
```

to

Code: Select all

```
SOS1 variable x(t, household) heatGenerationForBufferTank;
SOS1 variable y(t, household) heatGenerationForDHWTank;
```

and it seems to work

. However this surprises me a little bit because in the documentation it is said that

"s1 represents one special ordered set of type 1 with i elements". I'd understand from this description that among the x(t, household) only one variable can have a nonzero value and not among the x and y variables for every (t, household). Is this because in my code x and y have the same index which groups them together as a set of SOS1 variables?

### Re: Objective with if-condition

Posted: **Thu Jun 21, 2018 9:29 am**

by **Fred**

Peter,

Your doubts are legitimate. As explained in the documentation, the members of the innermost (the right-most) index belong to the same SOS set.

For your variable x that means for every t your x variable can have at most one non-zero value. Assuming that your set household has 3 elements h1, h2, h3 and t has 10 elements t1*t10 that could for example look as follows

Code: Select all

```
x('t1','h1') = 0
x('t1','h2') = 0
x('t1','h3') = 1
x('t2','h1') = 0
x('t2','h2') = 0
x('t2','h3') = 0
[...]
x('t10','h1') = 0
x('t10','h2') = 1
x('t10','h3') = 0
```

Your variables x and y are completely independent which is probably not what you want.

Best,

Fred

### Re: Objective with if-condition

Posted: **Thu Jun 21, 2018 2:16 pm**

by **PeterBe**

Thanks for your answer Fred,

now I understand my mistake but I do not know how to fix it. How can the variable x depend on y? I tried

Code: Select all

```
SOS1 variable x(t, household,y) heatGenerationForBufferTank;
SOS1 variable y(t, household,x) heatGenerationForDHWTank;
```

but it did not work because y and x are not sets but variables.

### Re: Objective with if-condition

Posted: **Fri Jun 22, 2018 10:46 am**

by **Fred**

Peter,

If you want to treat x and y as sos1 variables of the same sos1 set, you have to reformulate the model and make them one variable with an additional index, e.g. as follows

Code: Select all

```
set t / t1*t10 /
household / h1*h3 /
var / x 'heatGenerationForBufferTank', y 'heatGenerationForDHWTank' /;
sos1 variable xy(t,household,var);
xy.up(t,household,var) = 1;
equation lb(t, household) 'lower bound for x+y';
lb(t,household).. sum(var, xy(t,household,var)) =g= 0.1;
[...]
```

As mentioned before, you could also reformulate the logical conditions using binary variables. I think the following formulation should also do the trick.

Code: Select all

```
positive variable x(t,household) heatGenerationForBufferTank;
positive variable y(t,household) heatGenerationForDHWTank;
binary variable xAct(t,household);
x.up(t,household) = 1;
y.up(t,household) = 1;
equation e1,e2,e3;
e1(t,household).. x(t,household) =l= xAct(t,household);
e2(t,household).. y(t,household) =l= (1-xAct(t,household));
e3(t,household).. x(t,household) + y(t,household) =g= 0.1;
```

I hope this helps!

Best,

Fred

### Re: Objective with if-condition

Posted: **Fri Jun 22, 2018 3:24 pm**

by **PeterBe**

Thanks Fred for your answer, it solves my problem.