logical equations & binary variables

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

logical equations & binary variables

Post by M.Walde »

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
msci
User
User
Posts: 2
Joined: 6 years ago

Re: logical equations & binary variables

Post by msci »

Just include the following constraint:

m-Mx <=0

where M is an upper bound for m.
Manassaldi
User
User
Posts: 118
Joined: 7 years ago
Location: Rosario - Argentina

Re: logical equations & binary variables

Post by Manassaldi »

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!
M.Walde
User
User
Posts: 16
Joined: 6 years ago

Re: logical equations & binary variables

Post by M.Walde »

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

Re: logical equations & binary variables

Post by Manassaldi »

Hi, It's similar

eq1.. m =g= m.lo*(1-x);
eq2.. m =l= m.up*(1-x)

Bye!
M.Walde
User
User
Posts: 16
Joined: 6 years ago

Re: logical equations & binary variables

Post by M.Walde »

Thanks a lot for your fast reply.
I could have got to this myself. I apologize for not thinking enough, before asking the question.
M.Walde
User
User
Posts: 16
Joined: 6 years ago

Re: logical equations & binary variables

Post by M.Walde »

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:

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

Re: logical equations & binary variables

Post by Manassaldi »

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!
M.Walde
User
User
Posts: 16
Joined: 6 years ago

Re: logical equations & binary variables

Post by M.Walde »

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

Re: logical equations & binary variables

Post by Manassaldi »

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));
Post Reply