2

I tired to change right hand of non-linear constraint in the following code. although kind people helped me a lot, I couldn't to find how should I fix it. would you please help me again? Thank so much.

using JuMP, Ipopt, Juniper,Gurobi,CPUTime
#-----Model parameters--------------------------------------------------------
sig=0.86;
landa=50;
E=T0=T1=.0833;
T2=0.75;
gam2=1; gam1=0;
a1=5; a2=4.22; a3=977.4; ap=977.4;
C1=949.2; c0=114.24;
f(x) = cdf(Normal(0, 1), x);
#---------------------------------------------------------------------------
ALT= Model(optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>optimizer_with_attributes(Ipopt.Optimizer, "print_level" => 0),

       "mip_solver"=>optimizer_with_attributes(Gurobi.Optimizer, "logLevel" => 0),"registered_functions" =>[Juniper.register( :f, 1, f; autodiff = true)])

       );

# variables-----------------------------------------------------------------
JuMP.register(ALT, :f, 1, f; autodiff = true);
@variable(ALT, h >= 0.1);
@variable(ALT, L >= 0.00001);
@variable(ALT, n>=2, Int);

#---------------------------------------------------------------------------

@NLexpression(ALT,k1,h/(1-f(L-sig*sqrt(n))+f(-L - sig*sqrt(n))));

@NLexpression(ALT,k2,(1-(1+landa*h)*exp(-landa*h))/(landa*(1-exp(-landa*h))));

@NLexpression(ALT,k3,E*n+T1*gam1+T2*gam2);

@NLexpression(ALT,k4,1/landa+h/(1-f(L-sig*sqrt(n))+f(-L-sig*sqrt(n))));

@NLexpression(ALT,k5,-(1-(1+landa*h)*exp(-landa*h))/(landa*(1-exp(-landa*h)))+E*n+T1*gam1+T2*gam2);

@NLexpression(ALT,k6,(exp(-landa*h)/1-exp(-landa*h))*(a3/(2*f(-L)))+ap);

@NLexpression(ALT,k7,1-f(L-sig*sqrt(n))+f(-L-sig*sqrt(n)));

@NLexpression(ALT,F,c0/landa+C1*(k1-k2+k3)+((a1+a2*n)/h)*(k4+k5+k3)+k6);

@NLexpression(ALT,FF,k4-k2+E*n+T1+T2+(1-gam1)*((exp(-landa*h)/1-exp(-landa*h)*T0)/(2*f(-L))));

#routing constraints--------------------------------------------------------

@NLconstraint(ALT, f(-L) <= 1/400);

#objective function---------------------------------------------------------

@NLexpression(ALT,f1,F/FF);

@NLexpression(ALT,f2,1/k7);
#-------------------------------------------------------------------------
@NLparameter(ALT, rp1 == 10000);
@NLparameter(ALT, lp1 == -10000);
@NLparameter(ALT, rp2 == 10000);
@NLparameter(ALT, lp2 == -10000);

@NLconstraint(ALT,rf1,f1<=rp1);

@NLconstraint(ALT,lf1,f1>=lp1);

@NLconstraint(ALT,rf2,f2<=rp2);

@NLconstraint(ALT,lf2,f2>=lp2);
#------------------------------------------------------------------------
ZT=zeros(2,1);
ZB=zeros(2,1);
#-----------------------------------------------------------------------------
@NLobjective(ALT,Min,f2);
optimize!(ALT);

f2min=getvalue(f2);
ZB[2]=f2min;

set_value(rp2, f2min);

set_value(lp2, f2min);

@NLobjective(ALT,Min,f1);
optimize!(ALT);

ZB[1]=getvalue(f1);
#--------------------------------------------------------------------------
set_value(rp2, 10000);

set_value(lp2, ZB[2]+0.1);**

@NLobjective(ALT,Min,f1);
optimize!(ALT);

f1min=getvalue(f1);

ZT[1]=f1min;

although the constraint (**) limits getting to ZB (objective values when second objective optimized), it gets 949.2000589366443 when the first objective optimized. would you please help me what are the reasons? is choosing solvers can be effective? is the non-linear model cant be solve with these solvers? Thank you very much

julia> ZB
2×1 Array{Float64,2}:
 949.2000092739842
   1.0000000053425355
#--------------------------------------------------
julia> ZT
2×1 Array{Float64,2}:
 949.2000589366443
   0.0

the code is updated. in fact, this code is trying to find two points of pareto front. this is an example

using JuMP,CPLEX,CPUTime
#----------------------------------------------------------------------
WES=Model(CPLEX.Optimizer)
#-----------------------------------------------------------------------
@variable(WES,x[i=1:4]>=0);
@variable(WES,y[i=5:6]>=0,Int);
@variable(WES,xp[i=1:4]>=0);
@variable(WES,yp[i=5:6]>=0,Int);
#-----------------------------------------------------------------------
ofv1=[3 6 -3 -5]
ofv2=[-15 -4 -1 -2];
f1=sum(ofv1[i]*x[i] for i=1:4);
f2=sum(ofv2[i]*x[i] for i=1:4);
f1p=sum(ofv1[i]*xp[i] for i=1:4);
f2p=sum(ofv2[i]*xp[i] for i=1:4);
#------------------------------------------------------------------------

@constraint(WES,con1,-x[1]+3y[5]<=0);
@constraint(WES,con2,x[1]-6y[5]<=0);
@constraint(WES,con3,-x[2]+3y[5]<=0);
@constraint(WES,con4,x[2]-6y[5]<=0);
@constraint(WES,con5,-x[3]+4y[6]<=0);
@constraint(WES,con6,x[3]-4.5y[6]<=0);
@constraint(WES,con7,-x[4]+4y[6]<=0);
@constraint(WES,con8,x[4]-4.5y[6]<=0);
@constraint(WES,con9,y[5]+y[6]<=5);
@constraint(WES,con14,-xp[1]+3yp[5]<=0);
@constraint(WES,con15,xp[1]-6yp[5]<=0);
@constraint(WES,con16,-xp[2]+3yp[5]<=0);
@constraint(WES,con17,xp[2]-6yp[5]<=0);
@constraint(WES,con18,-xp[3]+4yp[6]<=0);
@constraint(WES,con19,xp[3]-4.5yp[6]<=0);
@constraint(WES,con20,-xp[4]+4yp[6]<=0);
@constraint(WES,con21,xp[4]-4.5yp[6]<=0);
@constraint(WES,con22,yp[5]+yp[6]<=5);
#------------------------------------------------------------------------
ZT=zeros(2,1);
ZB=zeros(2,1);
#--------------------------------------------------------------------------------
@objective(WES,Min,f2);
optimize!(WES);
f2min=JuMP.value(f2)
set_normalized_rhs(rf2,f2min);
set_normalized_rhs(lf2,f2min);

ZB[2]=getvalue(f2);
@objective(WES,Min,f1);
optimize!(WES);
ZB[1]=getvalue(f1);

#----------------
JuMP.setRHS(rf2,10000);
JuMP.setRHS(lf2,ZB[2]);
@objective(WES,Min,f1);
optimize!(WES);
set_normalized_rhs(rf1,getvalue(f1));
set_normalized_rhs(lf1,getvalue(f1));
ZT[1]=getvalue(f1);

@objective(WES,Min,f2);
optimize!(WES);
ZT[2]=getvalue(f2);

but it has that error again when the right hand sides functions are run.

set_normalized_rhs(rf2,f2min)
ERROR: MethodError: no method matching set_normalized_rhs(::ConstraintRef{Model,NonlinearConstraintIndex,ScalarShape}, ::Float64)
Closest candidates are:
  set_normalized_rhs(::ConstraintRef{Model,MathOptInterface.ConstraintIndex{F,S},Shape} where Shape<:AbstractShape, ::Any) where {T, S<:Union{MathOptInterface.EqualTo{T}, MathOptInterface.GreaterThan{T}, MathOptInterface.LessThan{T}}, F<:Union{MathOptInterface.ScalarAffineFunction{T}, MathOptInterface.ScalarQuadraticFunction{T}}} at C:\Users\admin\.julia\packages\JuMP\YXK4e\src\constraints.jl:478
Stacktrace:
 [1] top-level scope at none:1

I cant find what is the problem. this example was run in Julia 0.6.4.2. ZB and ZT were:

julia>ZB
2×1 Array{Float64,2}:
 270.0
 -570.0
julia> ZT
2×1 Array{Float64,2}:
 -180.0
 -67.5.0

thanks indeed.

Soma
  • 743
  • 6
  • 19

1 Answers1

4

Duplicate of is there any possibility to change the RHS of non-linear constraints in julia?.

You can use set_value to update the value of a nonlinear parameter. https://jump.dev/JuMP.jl/v0.21.3/nlp/#JuMP.set_value-Tuple{NonlinearParameter,Number}

Here's an example

using JuMP
model = Model()
@variable(model, x)
@NLparameter(model, p == 1)
@NLconstraint(model, sqrt(x) <= p)
# To make RHS p=2
set_value(p, 2)
Oscar Dowson
  • 2,395
  • 1
  • 5
  • 13
  • I am sorry. but I tried to use ```set_value``` with ```set_normalized_rhs() ``` but it gives error . Is the```set_normalized_rhs() ``` not usable for ```@NLconstraint```? I am really grateful for your valuable comments and helps. – Soma Aug 28 '20 at 06:58
  • would you please see the above comment? – Soma Aug 28 '20 at 12:47
  • 1
    Can you update the code to represent what you have tried by using `set_value` and `@NLparameter` ? – Wikunia Aug 28 '20 at 13:02
  • @Wikunia it is necessary to change the right hand side of non-linear constraint. but these errors will happen. this code has run for linear constraint before in julia 0.6.4.2. for non-linear code , I found this opportunity to change the version of julia to 1+ . but i couldn't change right hand side of non-linear constraint. if it is not possible, maybe I should add NL- constraint and delete NL-constraint. if you don't mind, please say me how can I do that. Thanks very much – Soma Aug 28 '20 at 19:48
  • 1
    Sorry @soma I fail to see why this answer didn't work for you. It's also easier to help you if you provide a minimum working example – Wikunia Aug 28 '20 at 19:59
  • @Wikunia Thanks indeed. you helped me a lot. I updated an example in the question. but the error is happed again. I don't know maybe it is for version of Julia. I use Julia 1.5.0. iif it is possible, would you please help me? – Soma Aug 29 '20 at 03:15
  • 1
    I added an example. – Oscar Dowson Aug 29 '20 at 07:17
  • @Oscar Dowson . Thanks very much for your kindly help :). – Soma Aug 29 '20 at 08:49
  • @Oscar Dowson the code is updated with your valuable helps. thanks very much. but some problem happens that i asked in updated code. Im sorry would you please help me? – Soma Aug 29 '20 at 17:41
  • @Wikunia would you please say me, is selecting the type of solvers in Juniper can be helpful in solving a model? – Soma Aug 29 '20 at 18:00
  • The above problem is solved when some constraints are added. ``` @NLconstraint(ALT, L <= 4), @NLconstraint(ALT, n <= 30), @NLconstraint(ALT, h <= 40) ``` . Thanks very much. but I don't know why?. would you pleas say me why? again I am really thankful. – Soma Aug 30 '20 at 17:24
  • 1
    I suggest you read the first post of https://discourse.julialang.org/t/psa-make-it-easier-to-help-you/14757/81 and formulate a simple version of your question. Your example is long with many pieces, and I don't know what you are asking. I also encourage you to post on the official Julia forum: https://discourse.julialang.org/c/domain/opt/13. More people read that and may be able to help. – Oscar Dowson Aug 30 '20 at 20:13