Hey guys,
I got another question on logical equations or rather binary variables. This is again a beginner question.
So right now I'm trying to understand how to set the value of binary variables with conditions.
Consider the binary variable x and variable m.
If i would write the code in other language synthex, what I'm trying to do would look like:
if m > 0
x = True
else
x = False
end
So I'm trying to set the value of x to 1, when the variable m is greater than zero.
How do I model this in GAMS? Do I need to use logical equations for it?
I can't find a solution for this.
Thanks again for your help.
Cheers
Max
logical equations & binary variables
Re: logical equations & binary variables
Just include the following constraint:
m-Mx <=0
where M is an upper bound for m.
m-Mx <=0
where M is an upper bound for m.
-
- User
- Posts: 119
- Joined: 7 years ago
- Location: Rosario - Argentina
Re: logical equations & binary variables
Hi, try these equations
eq1.. m =g= m.lo*x;
eq2.. m =l= m.up*x;
m.lo (lower bound)
m.up (upper bound)
if x=1
m greater than m.lo*1;
m lower than m.up*1
if x=0
m greater than m.lo*0;
m lower than m.up*0;
so, m = 0
Bye!
eq1.. m =g= m.lo*x;
eq2.. m =l= m.up*x;
m.lo (lower bound)
m.up (upper bound)
if x=1
m greater than m.lo*1;
m lower than m.up*1
if x=0
m greater than m.lo*0;
m lower than m.up*0;
so, m = 0
Bye!
Re: logical equations & binary variables
Thanks for your fast reply again, Manassaldi.
You are really helping me with my project.
I got another question:
I actually explained wrong, what I want to have. I need the binary variable x to equal 1, when the variable m equals zero.
So basically the opposite of the problem I stated before. Is there any good way to do it?
Unfortunately with your solution of the problem I can't think of a similar solution for this topic.
Thanks in advance!
Cheers
You are really helping me with my project.
I got another question:
I actually explained wrong, what I want to have. I need the binary variable x to equal 1, when the variable m equals zero.
So basically the opposite of the problem I stated before. Is there any good way to do it?
Unfortunately with your solution of the problem I can't think of a similar solution for this topic.
Thanks in advance!
Cheers
-
- User
- Posts: 119
- Joined: 7 years ago
- Location: Rosario - Argentina
Re: logical equations & binary variables
Hi, It's similar
eq1.. m =g= m.lo*(1-x);
eq2.. m =l= m.up*(1-x)
Bye!
eq1.. m =g= m.lo*(1-x);
eq2.. m =l= m.up*(1-x)
Bye!
Re: logical equations & binary variables
Thanks a lot for your fast reply.
I could have got to this myself. I apologize for not thinking enough, before asking the question.
I could have got to this myself. I apologize for not thinking enough, before asking the question.
Re: logical equations & binary variables
Hi guys,
I got another problem, that's based in this here.
So coming back to my model, I still want to set the binary variable nrc to 1, when the mass flows m_rc_ts and m_rc_pb both equal to zero.
That's why I implemented the following equations:
e_nrc_lo(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =g= (1-nrc(i+1));
e_nrc_up(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =l= m_rcmax*(1-nrc(i+1));
So if I get this right mathemetically, if the mass fows equal to zero, it should look like this:
0 + 0 >= 1 - nrc
0 + 0 <= 282 * (1-nrc)
which leads to:
nrc >= 1 and nrc <= 1, which leads to the only solution nrc = 1.
I implemented the variable, so these are the only equations were it is in. The inital value is 1.
If I run it now, I get the following from the equation list:
I don't know why, the equation e_nrc_lo does not set the binary variable nrc to 1, but just says, that the equation is infeasable. I mean the whole purpose of the equation is to set the variable to 1. Is there something obvious, which I can't see? Or is it maybe more complicated?
Thanks in advance, guys!
Cheers,
Max
I got another problem, that's based in this here.
So coming back to my model, I still want to set the binary variable nrc to 1, when the mass flows m_rc_ts and m_rc_pb both equal to zero.
That's why I implemented the following equations:
e_nrc_lo(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =g= (1-nrc(i+1));
e_nrc_up(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =l= m_rcmax*(1-nrc(i+1));
So if I get this right mathemetically, if the mass fows equal to zero, it should look like this:
0 + 0 >= 1 - nrc
0 + 0 <= 282 * (1-nrc)
which leads to:
nrc >= 1 and nrc <= 1, which leads to the only solution nrc = 1.
I implemented the variable, so these are the only equations were it is in. The inital value is 1.
If I run it now, I get the following from the equation list:
Code: Select all
e_nrc_lo(1).. m_rc_ts(1) + m_rc_pb(1) + nrc(1) =G= 1 ; (LHS = 1)
e_nrc_lo(2).. m_rc_ts(2) + m_rc_pb(2) + nrc(2) =G= 1 ; (LHS = 0
, INFES = 1 ****)
e_nrc_lo(3).. m_rc_ts(3) + m_rc_pb(3) + nrc(3) =G= 1 ; (LHS = 0
, INFES = 1 ****)
e_nrc_up(1).. m_rc_ts(1) + m_rc_pb(1) + 282*nrc(1) =L= 282 ; (LHS = 282)
e_nrc_up(2).. m_rc_ts(2) + m_rc_pb(2) + 282*nrc(2) =L= 282 ; (LHS = 0)
e_nrc_up(3).. m_rc_ts(3) + m_rc_pb(3) + 282*nrc(3) =L= 282 ; (LHS = 0)
*The column list gives the following:
nrc(1)
(.LO, .L, .UP, .M = 0, 1, 1, 0)
1 e_nrc_lo(1)
282 e_nrc_up(1)
nrc(2)
(.LO, .L, .UP, .M = 0, 0, 1, 0)
1 e_nrc_lo(2)
282 e_nrc_up(2)
nrc(3)
(.LO, .L, .UP, .M = 0, 0, 1, 0)
1 e_nrc_lo(3)
282 e_nrc_up(3)
m_rc_ts(1)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1 e_nrc_lo(1)
1 e_nrc_up(1)
(0) e_nts(1)
1 e_m_rc_same(1)
1 e_ts_rc_same(1)
(0) e_charge(1)
-5.8864 e_Re(1)
-0.0001 e_U(1)
(-12.5642) e_h(1)
m_rc_ts(2)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1 e_nrc_lo(2)
1 e_nrc_up(2)
(0) e_nts(2)
1 e_m_rc_same(2)
1 e_ts_rc_same(2)
(0) e_charge(2)
-5.8864 e_Re(2)
-0.0001 e_U(2)
m_rc_ts(3)
(.LO, .L, .UP, .M = 0, 0, 282, 0)
1 e_nrc_lo(3)
1 e_nrc_up(3)
(0) e_nts(3)
1 e_m_rc_same(3)
1 e_ts_rc_same(3)
(0) e_charge(3)
-5.8864 e_Re(3)
-0.0001 e_U(3)
m_rc_pb(1)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1 e_nrc_lo(1)
1 e_nrc_up(1)
1 e_m_pbmax(1)
(-838) e_T_pi(1)
1 e_m_pb_same(1)
(0) e_T_po(1)
(0) e_P_out(1)
1 e_m_rc_same(1)
m_rc_pb(2)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1 e_nrc_lo(2)
1 e_nrc_up(2)
1 e_m_pbmax(2)
(-839) e_T_pi(2)
1 e_m_pb_same(2)
(-0.0597) e_T_po(2)
(30340) e_P_out(2)
1 e_m_rc_same(2)
m_rc_pb(3)
(.LO, .L, .UP, .M = 0, 0, 112, 0)
1 e_nrc_lo(3)
1 e_nrc_up(3)
1 e_m_pbmax(3)
(-839) e_T_pi(3)
1 e_m_pb_same(3)
(-0.0597) e_T_po(3)
(30340) e_P_out(3)
1 e_m_rc_same(3)
Thanks in advance, guys!
Cheers,
Max
-
- User
- Posts: 119
- Joined: 7 years ago
- Location: Rosario - Argentina
Re: logical equations & binary variables
Hi, the equation listing and column Listing shows the value on the initial point, not in the solution. The equations are fine.
You should review the SolEQU and SolVAR section.
Bye!
You should review the SolEQU and SolVAR section.
Bye!
Re: logical equations & binary variables
Hi Manassaldi,
thanks again for your answer. I see, that I missunderstood the columen and the equation listing.
However I wanted to set the binary variable nrc to prevent the division by zero.
e_T_ri(i+1) .. T_ri(i+1) =e= (m_ts_rc(i+1)*T_to(i+1) + m_pb_rc(i+1)*T_po(i+1)) / (m_ts_rc(i+1) + m_pb_rc(i+1) + nrc(i+1)) + nrc(i+1)*T_ri(i);
The binary variable should set the value to one when the mass flows m_ts_rc and m_pb_rc are zero, so that a division by zero is prevented. Because of this, I can't review the solequ and solvar yet, because the model gets an execution error. Is there anyway to prevent this correctly? Or do I just have to add small numbers into the denominator to prevent the division by zero?
Thanks in advance!
Cheers
thanks again for your answer. I see, that I missunderstood the columen and the equation listing.
However I wanted to set the binary variable nrc to prevent the division by zero.
e_T_ri(i+1) .. T_ri(i+1) =e= (m_ts_rc(i+1)*T_to(i+1) + m_pb_rc(i+1)*T_po(i+1)) / (m_ts_rc(i+1) + m_pb_rc(i+1) + nrc(i+1)) + nrc(i+1)*T_ri(i);
The binary variable should set the value to one when the mass flows m_ts_rc and m_pb_rc are zero, so that a division by zero is prevented. Because of this, I can't review the solequ and solvar yet, because the model gets an execution error. Is there anyway to prevent this correctly? Or do I just have to add small numbers into the denominator to prevent the division by zero?
Thanks in advance!
Cheers
-
- User
- Posts: 119
- Joined: 7 years ago
- Location: Rosario - Argentina
Re: logical equations & binary variables
Hi, In another post I suggested this equation
e_T_pi(i+1) .. T_pi(i+1)*(m_rc_pb(i+1)+m_ts_pb(i+1)) =e= (m_rc_pb(i+1)*T_ro + m_ts_pb(i+1)*T_to(i+1));
e_T_pi(i+1) .. T_pi(i+1)*(m_rc_pb(i+1)+m_ts_pb(i+1)) =e= (m_rc_pb(i+1)*T_ro + m_ts_pb(i+1)*T_to(i+1));