모든 파레토 점을 생성해야하지만이 오류가 발생합니다.JuMP : LoadError : 인식 할 수없는 함수 : f1 비선형 표현에 사용
using JuMP
using Gurobi
using Gadfly
using Ipopt
m = Model(solver=IpoptSolver(print_level=0))
@variable(m, 0.1 <= x <= 1.0)
@variable(m, 0.0 <= y <= 1.0)
pareto_x = Float16[]
pareto_y = Float16[]
for i in 0.0:0.1:1.0
for j in 0.0:0.1:1.0
f1(x,y) = x
f2(x,y) = (2.0-exp(-((y-0.2)/0.004)^2)-0.8*exp(-((y-0.6)/0.4)^2))/x
@NLobjective(m, Min, i*f1(x,y) + j*f2(x,y)) ## <<-- ERROR HERE
status = solve(m)
println("Objective value: ", getobjectivevalue(m))
x_opt = getvalue(x)
y_opt = getvalue(y)
println("x = ", x_opt)
println("y = ", y_opt)
push!(pareto_x,f1(x_opt,y_opt))
push!(pareto_y,f2(x_opt,y_opt))
end
end
plot(x=pareto_x, y=pareto_y)
해결할? 내 직감에서'@ NLobjective'에 임의 함수 호출을 허용하지 않는다고 말합니다 –
예하지만 임의 함수를 사용하여이 함수를 재사용하여 파레토 점을 생성합니다. – sparkle
이 경우 사용자의 함수는 닫힌 형식의 표현식이므로 사용자 정의 함수 대신'@ NLexpression'을 사용해야합니다. 현재 사용자 정의 함수가있는 경우 JuMP가 2 차 파생 함수를 계산하지 않기 때문에 일반적으로 더 잘 수행됩니다. – mlubin