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
logical equations & binary variables

 User
 Posts: 81
 Joined: 2 years ago
 Location: Rosario  Argentina
Re: logical equations & binary variables
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!
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!
Re: logical equations & binary variables
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
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

 User
 Posts: 81
 Joined: 2 years ago
 Location: Rosario  Argentina
Re: logical equations & binary variables
Hi, I think you can try a simple bigM 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)*(1x(j));
eq3(j).. TWC_HS(j) =l= 3.21*HS(j) + 3.21*HS.up(j)*(1x(j));
eq4(j).. HS(j) =l= (10001e10) + 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= (10001e10) + 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= (10001e10); (1e10 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!
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)*(1x(j));
eq3(j).. TWC_HS(j) =l= 3.21*HS(j) + 3.21*HS.up(j)*(1x(j));
eq4(j).. HS(j) =l= (10001e10) + 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= (10001e10) + 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= (10001e10); (1e10 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!
Re: logical equations & binary variables
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
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.

 User
 Posts: 81
 Joined: 2 years ago
 Location: Rosario  Argentina
Re: logical equations & binary variables
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!
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!
Re: logical equations & binary variables
Hi Manassaldi.
Thank you so much for helping me out. Your analysis was really helpful.
Best,
Mary
Thank you so much for helping me out. Your analysis was really helpful.
Best,
Mary