Page 1 of 4

Loop for objective function

Posted: Tue Nov 13, 2018 8:05 pm
by mrv_ce
Hello everybody,

In my work, I need to write a loop for my objective function.

In my objective function, I use one set which is coded with j. And I need the model results for every j values. I write an loop but I obtained "ERROR 149: Uncontrolled set entered as constant."
My code like this below;

Set j/1*52/

obj.. z=e= L(j,'1')

other constraints.. ( some of them still runs for every j)

MODEL test_data /ALL/ ;
loop(j,
SOLVE test_data USING NLP MINIMIZING z;
DISPLAY z.l, a.l, w.l, aa.l;)

How can I write a loop and display all results of model for each value of j?

Please help me...

Thanks a lot.

Best regards.

Re: Loop for objective function

Posted: Wed Nov 14, 2018 8:00 am
by Renger
Hi

Just remove the index from the objective and save the results in a parameter

Code: Select all

Set j/1*52/

obj.. z=e= L('1')

other constraints.. ( some of them still runs for every j)
parameter results(j,*);
MODEL test_data /ALL/ ; 
loop(j, 
SOLVE test_data USING NLP MINIMIZING z;
results(j,"Objective") = z.L;
DISPLAY z.l, a.l, w.l, aa.l;)
Cheers
Renger

Re: Loop for objective function

Posted: Wed Nov 14, 2018 3:36 pm
by mrv_ce
Hi,

Actually L(j,'1') is distance function. And I coded like below

sum(q,(w(q)**n)*(abs(p(j,q)-c('1',q)))**n))**in

q and j are sets. n and in are scalars. I need the results for every j.

I could not understand how can I remove j from the objective function and save it to a parameter?

My objective function is below:
objective.. z =e= sum(q,(w(q)**n)*(abs(p(j,q)-c(m,q)))**n))**in

Thanks for your help.

Best regards.

Re: Loop for objective function

Posted: Thu Nov 15, 2018 8:32 am
by Renger
Hi

You should rewrite the set j from your model and treat the variables and parameters independent of j. Here an example:

Code: Select all

set j /1*2/;

parameter
    p(j)   Parameter defined over j,
    pj     Scalar to be used in the loop to replace p;

p(j) = ord(j);

variable OBJ,X;

equation objective, eq1;

objective..
OBJ =E= x;

eq1..
   X=E= pj;

model test /all/;

loop(j, 
	pj = p(j);
	solve test maximizing OBJ using nlp;
);
In your case:

Code: Select all

sum(q,(w(q)**n)*(abs(p(j,q)-c('1',q)))**n))**in
becomes

Code: Select all

sum(q,(w(q)**n)*(abs(pj(q)-c('1',q)))**n))**in
and if p(j,g) is a parameter, it is now set in the loop as

Code: Select all

pj(q) = p(j,g);
If p(j,g) is a variable, you define it as PJ(g) and save the result in a parameter results("p", j,g) = PJ.L(g);

Your distance function then becomes L("1").

Hope this helps.
Cheers
Renger

Re: Loop for objective function

Posted: Tue Nov 27, 2018 6:21 pm
by mrv_ce
Hi,

In the example, x is defined. Is this equal to " sum(q,(w(q)**n)*(abs(pj(q)-c('1',q)))**n))**in " equation or x is something new?

And one more question,

parameter
p(j) Parameter defined over j,
pj Scalar to be used in the loop to replace p;

These are defined and we also defined pj(q).

pj(q) and pj are the same?

Thanks for your support.

Best regards.

Re: Loop for objective function

Posted: Tue Nov 27, 2018 7:06 pm
by Renger
2xyes

Re: Loop for objective function

Posted: Sun Apr 12, 2020 12:04 pm
by Luqman Hakeem
Renger wrote: 5 years ago2xyes
Hi Renger,

I am facing almost similar problem. I have objective function "zf(t)" with 't' index for time. I don't know how to write it correctly in GAMS. Can you help me out?
Files are attached for your kind review.
Thanks in advance.
input.xlsx
(183.92 KiB) Downloaded 394 times
newfile4.gms
(5.07 KiB) Downloaded 373 times

Re: Loop for objective function

Posted: Sun Apr 12, 2020 2:49 pm
by Renger
GAMS tells you that the dimension

Code: Select all

 115  costfinal(t) .. zf(t) =e= z/(AED(t)*10*4380);
****                             $148
148  Dimension different - The symbol is referenced with more/less
        indices as declared
You defined z over t (i.e. z(t)).
For optimization you can't have multiple functions to optimize. If you want to solve this optimization problem for every t, you have to write your variables without t and loop over t.

Code: Select all

* model equations and variables without t

Equations
     costfinal        cost in KWh
etc.

...
 zf =e= z/(AED*10*4380);

* Define parameters used in the model equations without t (example GrsCm(u) instead of  GrsC(u,t) )
parameter GrsCm(u)
...
loop(t,
* Assign your parameters from the data you import
GrsCm(u) =  GrsC(u,t);
... 

solve model 
* Report results
results(t,"Objective") = zf.l;
I hope this helps you on your way.
Cheers
Renger

Re: Loop for objective function

Posted: Sun Apr 12, 2020 6:34 pm
by Luqman Hakeem
Renger wrote: 4 years ago GAMS tells you that the dimension

Code: Select all

 115  costfinal(t) .. zf(t) =e= z/(AED(t)*10*4380);
****                             $148
148  Dimension different - The symbol is referenced with more/less
        indices as declared
You defined z over t (i.e. z(t)).
For optimization you can't have multiple functions to optimize. If you want to solve this optimization problem for every t, you have to write your variables without t and loop over t.

Code: Select all

* model equations and variables without t

Equations
     costfinal        cost in KWh
etc.

...
 zf =e= z/(AED*10*4380);

* Define parameters used in the model equations without t (example GrsCm(u) instead of  GrsC(u,t) )
parameter GrsCm(u)
...
loop(t,
* Assign your parameters from the data you import
GrsCm(u) =  GrsC(u,t);
... 

solve model 
* Report results
results(t,"Objective") = zf.l;
I hope this helps you on your way.
Cheers
Renger
Hi Renger,

Thank you for help.
I am a little bit confused. Because parameters like 'GrsC(u)', 'CapC(p,q)' etc. have different values at different 't'. Or probably i have not been able to understand your reply completely.

Re: Loop for objective function

Posted: Sun Apr 12, 2020 8:01 pm
by Renger
As far as I can see, your model has no lagged time variables or parameters, so the idea is that you will run for each t an optimization in a loop.
Because of the loop, you can't have an index in your equations (that is technically not possible).
THerefore you make them all without the time index.
For the parameters you can either use your parameter with the index t or you define them like I did and assign in the loop the value for the actual t

cgrum(u) = cgru(u,t);

In your equations you write cgrum(u) which will have the proper value assigned for each t in the loop.
Cheers
Renger