logical equations & binary variables

Problems with syntax of GAMS
M.Walde
User
User
Posts: 16
Joined: 6 years ago

Re: logical equations & binary variables

Post by M.Walde »

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: 118
Joined: 7 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi »

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: 6 years ago

Re: logical equations & binary variables

Post by gigibotte »

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: 118
Joined: 7 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi »

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!
Manassaldi
User
User
Posts: 118
Joined: 7 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi »

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!
Manassaldi
User
User
Posts: 118
Joined: 7 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi »

Hi, in the previous answer I wrote this code and I saved it as a draft.
I hope this can help you.
Bye!

Code: Select all

set
i intervals /i1*i6/
n your nset /n1*n2/
l limits    /l,u/
;
parameter
p(n) /n1 1, n2 3/
intervals(n,i,l)
anvalue(i)
/i1 0
i2  0.2
i3  0.4
i4  0.6
i5  0.8
i6  1/

evalue /1e-6/
;
intervals(n,'i1','l')=0;
intervals(n,'i2','l')=p(n)*(10**(-2));
intervals(n,'i3','l')=p(n)*(10**(-1.5));
intervals(n,'i4','l')=p(n)*(10**(-1));
intervals(n,'i5','l')=p(n)*(10**(-0.5));
intervals(n,'i6','l')=p(n);

intervals(n,'i1','u')=p(n)*(10**(-2))  - evalue;
intervals(n,'i2','u')=p(n)*(10**(-1.5))- evalue;
intervals(n,'i3','u')=p(n)*(10**(-1))  - evalue;
intervals(n,'i4','u')=p(n)*(10**(-.5)) - evalue;
intervals(n,'i5','u')=p(n)                  - evalue;
intervals(n,'i6','u')=p(n)*2;

display intervals;

variable
th
thd(n,i)
a(n)
;
binary variable
bin(n,i)
;
equation
eq1,eq2,eq3,eq4,eq5
;

eq1(n)..   th =e= sum(i,thd(n,i));
eq2(n,i).. thd(n,i) =g= intervals(n,i,'l')*bin(n,i);
eq3(n,i).. thd(n,i) =l= intervals(n,i,'u')*bin(n,i);
eq4(n)..   sum(i,bin(n,i)) =e= 1;
eq5(n)..   a(n) =e= sum(i,bin(n,i)*anvalue(i));

*this is only for testing:
th.lo=0.5; 

model test /all/
solve test using mip minimizing th

Post Reply