Equations with index

Hello all,

I would like to define an equation with an index. Unfortunately this does not work:

k                    /"k1","k2","k3",/
EQUATIONS
        ObjFunction(k) Objective functions;
   
        ObjFunction("k1")..
                    SUM((p,s,m,i,j),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"k1")*d(m,i,j)+x_TS(p,s,j)*f_TS(s,"k1"))*w(p,"k1"))=e=Z("k1");
        ObjFunction("k2")..
                    SUM((p,s,m,i,j),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"k2")*d(m,i,j)+x_TS(p,s,j)*f_TS(s,"k2"))*w(p,"k2"))+120=e=Z("k2");
        ObjFunction("k3")..
                    SUM((p,s,m,i,j),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"k3")*d(m,i,j)+x_TS(p,s,j)*f_TS(s,"k3"))*w(p,"k3"))=e=Z("k3");

It should be defined more or less the same way as in the attached example (line 89 and 92).
AUGMECON2.gms (10.7 KB)
I hope you can help me :slight_smile:

Technically, it should work. I see that you have an extra comma “,” after k3 in set definition. What is the error that you are getting?

One workaround is using sameAs().

In your case, you can do
ObjFunction(k) $(sameAs(k, ‘k1’))…

However, I suspect that the error is not related to equation index. You can try the following example (with and without sameAS if you just uncomment one line):

set i /"i1","i2","i3"/;

variable
obj;

equation
eq1(i);

*eq1(i)$(sameAs(i, 'i1'))..  obj =e= 0;
eq1("i1")..  obj =e= 0;

model m /all/;
solve m minimizing obj using lp;
  • Atharv

The comma was a typo…

Thanks for your help. I have not tested your solution yet. Have instead tried to solve it differently.
If I’m not mistaken, the approach should also work or?

SET k /"k1","k2","k3"

table  term(k,*)  coefficients
         general             f_inv
k1        1                  0
k2        1                  1
k3        1                  0
;

EQUATIONS
        ObjFunction(k);

        ObjFunction(k)..
                    term(k,"general")*(SUM((p,s,m,i,j),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,k)*d(m,i,j)+x_TS(p,s,j)*f_TS(s,k))*w(p,k)))+term(k,"f_inv")*(SUM((p,s,m,i,j),((x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"k3")*d(m,i,j)+x_TS(p,s,j)*f_TS(s,"k3"))*w(p,"k3"))*f_inv(p)))=e=Z(k);

I still have a question: What is the difference between “abc” and ‘abc’? Or does it not matter how I access a certain element in a set?

Many greetings
Janisch

“” or ‘’ both work while accessing a set element.

What you are trying to do is equivalent and should work (except for several typos which you will figure out when you run). You also need 120*term(k, ‘f_inv’) somewhere in the equation.
This approach will get complicated if there are more terms in your equations in which case, writing equations separately might be better.

\

  • Atharv

Great! Thanks for the tips :slight_smile:
Fortunately the equations are not so complicated.

How can I explicitly optimize only one variable when calling the Solve command? This expression does not work.

Model example /all/;
SOLVE example USING mip MINIMIZING Z("k1");

This is trickier than one would think. For your case, you can just add another equation stating some variable v =e= z(‘k1’); Followed by minimizing v.

However, there could be a case when one wants to solve this in a loop for all k. For general purpose, one can define v=e= z(ksub); where ksub is a singleton subset of k defined as

set k /k1*k5/;
singleton set
ksub(k);

other_equations.....
equations.. v=e= z(ksub);

alias(k ,kk);
loop(kk,
ksub(kk)=yes;
solve model minimizing v using lp;
);
  • Atharv

Thank you :slight_smile: It works great!

Janisch