Page 1 of 1

Equations with index

Posted: Mon Jan 11, 2021 2:27 pm
by Janisch
Hello all,

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

Code: Select all

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.74 KiB) Downloaded 203 times
I hope you can help me :)

Re: Equations with index

Posted: Mon Jan 11, 2021 2:52 pm
by abhosekar
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):

Code: Select all

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

Re: Equations with index

Posted: Mon Jan 11, 2021 3:25 pm
by Janisch
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?

Code: Select all

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

Re: Equations with index

Posted: Mon Jan 11, 2021 4:05 pm
by abhosekar
"" 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

Re: Equations with index

Posted: Mon Jan 11, 2021 4:10 pm
by Janisch
Great! Thanks for the tips :)
Fortunately the equations are not so complicated.

Re: Equations with index

Posted: Mon Jan 11, 2021 5:51 pm
by Janisch
How can I explicitly optimize only one variable when calling the Solve command? This expression does not work.

Code: Select all

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

Re: Equations with index

Posted: Mon Jan 11, 2021 8:44 pm
by abhosekar
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

Code: Select all

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

Re: Equations with index

Posted: Tue Jan 12, 2021 9:08 am
by Janisch
Thank you :) It works great!

Janisch