logical equations & binary variables

Problems with syntax of GAMS
M.Walde
User
User
Posts: 16
Joined: 1 year ago

Re: logical equations & binary variables

Post by M.Walde » 1 year ago

Hi Manassaldi,

thank you a lot for your answer. Apparently I didn't realize, that you already provided the solution I needed.
I'm sorry for that. Thank you a lot for you help!

Cheers

Manassaldi
User
User
Posts: 81
Joined: 2 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi » 1 year ago

Hi, To avoid taking the first element, in my opinion, it is preferable to use this code:

e_T_pi(i)$(ord(i) gt 1) .. T_pi(i)*(m_rc_pb(i)+m_ts_pb(i)) =e= (m_rc_pb(i)*T_ro + m_ts_pb(i)*T_to(i));

Bye!

gigibotte
User
User
Posts: 4
Joined: 1 year ago

Re: logical equations & binary variables

Post by gigibotte » 10 months ago

Hi,

I have one question for you Manassaldi.
In my objective function I have this member that is z = [...]-TWC(j)*HS(j). Where HS(j)is a variable.

Now, TWC(j) should be a parameter that works like this:

TWC(j) = 0 when HS(j) < 1000

and

TWC(j) = 3.21 when HS(j) >=1000.

Any idea how to implement this in GAMS?

I tried to defined an equation called TWCup(j) that was:

TWCup(j)$(HS.l(j) >= 1000).. TWC(j) =e= 3.21;

but is not working
Thanks ;)

Manassaldi
User
User
Posts: 81
Joined: 2 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi » 10 months ago

Hi, I think you can try a simple big-M reformulation.
I assume that "HS(j)" is continuous and positive.
The new variable TWC_HS(j) correspond to TWC(j)*HS(j)
x(j) is a binary variable:
x(j)=1 if HS(j) >=1000.
x(j)=0 if HS(j) < 1000

eq1(j).. HS(j) =g= 1000*x(j);
eq2(j).. TWC_HS(j) =g= 3.21*HS(j) - 3.21*HS.up(j)*(1-x(j));
eq3(j).. TWC_HS(j) =l= 3.21*HS(j) + 3.21*HS.up(j)*(1-x(j));
eq4(j).. HS(j) =l= (1000-1e-10) + HS.up*x(j);
eq5(j).. TWC_HS(j) =l= 3.21*HS.up(j)*x(j);


So,
if x(j)=1
HS(j) =g= 1000;
TWC_HS(j) =g= 3.21*HS(j);
TWC_HS(j) =l= 3.21*HS(j); (so, TWC_HS(j) = 3.21*HS(j))
HS(j) =l= (1000-1e-10) + HS.up; (always satisfied)
TWC_HS(j) =l= 3.21*HS.up(j); (always satisfied)

if x(j)=0
HS(j) =g= 0; (always satisfied)
TWC_HS(j) =g= 3.21*HS(j) - 3.21*HS.up(j);(always satisfied)
TWC_HS(j) =l= 3.21*HS(j) + 3.21*HS.up(j);(always satisfied)
HS(j) =l= (1000-1e-10); (1e-10 is to avoid the value of 1000)
TWC_HS(j) =l= 0; (so, TWC_HS(j) = 0*HS(j))

There may be mistakes, but I think it should work.
Bye!

mbh
User
User
Posts: 3
Joined: 5 months ago

Re: logical equations & binary variables

Post by mbh » 1 week ago

Hi all,
I have a question regarding logical conditions applied to choice variables. I will be happy if someone, specially Manassaldi, can help me on that.

I have two choice variables, a(n) and th, and a parameter p(n). I need to code the following logic in gams.

if p(n)<= th then a(n) =0;
else if th< p(n) <= th * 10^.5 then a(n) = .2;
else if th * 10^.5 < p(n) <= th * 10^1 then a(n) = .4;
else if th * 10^1 < p(n) <= th * 10^1.5 then a(n) = .6;
else if th * 10^1.5 < p(n) <= th * 10^2 then a(n) = .8;
else if th * 10^2 < p(n) then a(n) = 1

I know how to use binary variable when I have only an if then case, but here I need to code many else if cases.
I hope my description of the problem is clear enough and am waiting to hear from you.

Best,
Mary
Last edited by mbh 1 week ago, edited 1 time in total.

Manassaldi
User
User
Posts: 81
Joined: 2 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi » 1 week ago

Hi, if p (n) is a parameter, I think it is better to reformulate the intervals definition:

if th >= p(n) then a(n) =0;
else if th < p(n) and th >= p(n) * 10^-.5 then a(n) = .2;
else if th < p(n)*10^-.5 and th >= p(n) * 10^-1 then a(n) = .4;
else if th < p(n)*10^-1 and th >= p(n) * 10^-1.5 then a(n) = .6;
else if th < p(n)*10^-1.5 and th >= p(n) * 10^-2 then a(n) = .8;
else if th < p(n)*10^-2 then a(n) = 1

Now, using binary variables, you must identify which is the interval where "th" is located:

[0 ; p(n)*10^-2) or
[p(n) * 10^-2 ; p(n)*10^-1.5) or
[p(n) * 10^-1.5 ; p(n)*10^-1) or
[p(n) * 10^-1 ; p(n)*10^-.5) or
[p(n)*10^-0.5 ; p(n) ) or
[p(n) ; Max_value]

Is this analysis ok?
Equations for selecting the intervals are easy to implement. Let me know if you need help.
Bye!

mbh
User
User
Posts: 3
Joined: 5 months ago

Re: logical equations & binary variables

Post by mbh » 1 week ago

Hi Manassaldi.
Thank you so much for helping me out. Your analysis was really helpful.

Best,
Mary

Post Reply