如何在JuMP + Julia的目标函数中使用abs函数



我想用JuMP和Julia解决一个简单的线性优化问题。 这是我的代码:

using JuMP
using Mosek
model = Model(solver=MosekSolver())
@variable(model, 2.5 <= z1 <= 5.0)
@variable(model, -1.0 <= z2 <= 1.0)
@objective(model, Min, abs(z1+5.0) + abs(z2-3.0))
status = solve(model)
println("Objective value: ", getobjectivevalue(model)) 
println("z1:",getvalue(z1))
println("z2:",getvalue(z2))

但是,我收到此错误消息。

> ERROR: LoadError: MethodError: no method matching
> abs(::JuMP.GenericAffExpr{Float64,JuMP.Variable}) Closest candidates
> are:   abs(!Matched::Bool) at bool.jl:77   abs(!Matched::Float16) at
> float.jl:512   abs(!Matched::Float32) at float.jl:513

如何在 JuMP 代码中使用 abs 函数?

我的问题由@rickhg12hs的commnet解决。 如果我使用 @NLobjective 而不是 @objective,它可以工作。 这是最终代码。

using JuMP
using Mosek
model = Model(solver=MosekSolver())
@variable(model, 2.5 <= z1 <= 5.0)
@variable(model, -1.0 <= z2 <= 1.0)
@NLobjective(model, Min, abs(z1+5.0) + abs(z2-3.0))
status = solve(model)
println("Objective value: ", getobjectivevalue(model)) 
println("z1:",getvalue(z1))
println("z2:",getvalue(z2))

我用不同的方式做到了

AvgOperationtime = [1 2]#[2.0 2.0 2.0 3.3333333333333335 2.5 2.0 2.0 2.5 2.5 2.0 2.0]
Operationsnumberremovecounter = [1 0;1 1]#[1.0 1.0 1.0 1.0 -0.0 1.0 1.0 1.0 -0.0 1.0 1.0; 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0; 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0; 1.0 1.0 1.0 -0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0; 1.0 1.0 1.0 -0.0 1.0 1.0 1.0 -0.0 1.0 1.0 1.0]
Modelnumber = 2
Operationsnumber = 2
Basecaseworkload = 2
y = 0.1
Highestnumber = 999
Solver = GLPK.Optimizer
#Operationtime[1,1 X;0,9 2]
m = Model(with_optimizer(Solver)); 
@variable(m, Operationtime[1:Modelnumber,1:Operationsnumber]>=0);
@variable(m, Absoluttime[1:Modelnumber,1:Operationsnumber]>=0);
@variable(m, Absolutchoice[1:Modelnumber,1:Operationsnumber,1:2], Bin);
@objective(m, Max, sum(Absoluttime[M,O]*Operationsnumberremovecounter[M,O] for M=1:Modelnumber,O=1:Operationsnumber))
#How much Time can differ
@constraint(m, BorderOperationtime1[M=1:Modelnumber,O=1:Operationsnumber], AvgOperationtime[O]*(1-y) <= Operationtime[M,O]);
@constraint(m, BorderOperationtime2[M=1:Modelnumber,O=1:Operationsnumber], AvgOperationtime[O]*(1+y) >= Operationtime[M,O]);
#Workload
@constraint(m, Worklimit[O=1:Operationsnumber],  sum(Operationtime[M,O]*Operationsnumberremovecounter[M,O] for M=1:Modelnumber) == Basecaseworkload);
#Absolut
@constraint(m, Absolutchoice1[M=1:Modelnumber,O=1:Operationsnumber],  sum(Absolutchoice[M,O,X] for X=1:2) == 1);
@constraint(m, Absoluttime1[M=1:Modelnumber,O=1:Operationsnumber], Absoluttime[M,O] <= Operationtime[M,O]-AvgOperationtime[O]+Absolutchoice[M,O,1]*Highestnumber);
@constraint(m, Absoluttime2[M=1:Modelnumber,O=1:Operationsnumber], Absoluttime[M,O] <= AvgOperationtime[O]-Operationtime[M,O]+Absolutchoice[M,O,2]*Highestnumber);
optimize!(m);
println("Termination status: ", JuMP.termination_status(m));
println("Primal status: ", JuMP.primal_status(m));

最新更新