2016-07-10 6 views
1

모든 파레토 점을 생성해야하지만이 오류가 발생합니다.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) 
+0

해결할? 내 직감에서'@ NLobjective'에 임의 함수 호출을 허용하지 않는다고 말합니다 –

+0

예하지만 임의 함수를 사용하여이 함수를 재사용하여 파레토 점을 생성합니다. – sparkle

+0

이 경우 사용자의 함수는 닫힌 형식의 표현식이므로 사용자 정의 함수 대신'@ NLexpression'을 사용해야합니다. 현재 사용자 정의 함수가있는 경우 JuMP가 2 차 파생 함수를 계산하지 않기 때문에 일반적으로 더 잘 수행됩니다. – mlubin

답변

1

http://jump.readthedocs.io/en/latest/nlp.html#user-defined-functions

mysquare(x) = x^2 
myf(x,y) = (x-1)^2+(y-2)^2 

JuMP.register(:myf, 2, myf, autodiff=true) 
JuMP.register(:mysquare, 1, mysquare, autodiff=true) 

m = Model() 

@variable(m, x[1:2] >= 0.5) 
@NLobjective(m, Min, myf(x[1],mysquare(x[2]))) 

는`x`와`f1`의 모든 인스턴스를 교체하면 어떻게됩니까이

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 

isdefined(:f1) || JuMP.register(:f1, 2, f1, autodiff=true) 
isdefined(:f2) || JuMP.register(:f2, 2, f2, autodiff=true) 

@objective(m, Min, f1(x,y)) 
+0

'JuMP.register'는'@NLobjective' 나'@NLconstraint'와 같이 비선형 표현식 내에서 사용하기위한 함수들만을 정의합니다. 위의 예제는'f1'이'@ objective'에서 사용되는 선형 함수이므로 우연히 작동합니다. – mlubin