2016-07-12 1 views
0

이 다목적 문제의 이상적인 벡터를 계산해야합니다. @objective에서 functs_BK1()의 첫 번째와 두 번째 기능에 액세스하는 방법을 사용할 수 없습니다. 모든 동적 및 지원 n 기능을 만드는 방법은 무엇입니까? @NLexpression 매크로 세 번째 인수로 점프 변수에서 원하는 표현을 구축해야하는 동안 기능 functs_BK1에서JuMP - MethodError :`getindex`는 getindex (:: Function, :: Int64)와 일치하는 메소드가 없습니다.

using JuMP 
using Ipopt 


function functs_BK1(x::Vector) 
    f = zeros(2) 
    f[1] = x[1]^2 + x[2]^2 
    f[2] = (x[1]-5.0)^2 + (x[2]-5.0)^2 

    return f 
end 

function bounds_BK1() 
    return ([-5.0;-5.0],[10.0;10.0]) 
end 


m = Model(solver=IpoptSolver(print_level=0)) 
@variable(m, x[i=1:2]) 

@NLexpression(m, F1, functs_BK1()[1]) #<--- Problem is here 
@NLexpression(m, F2, functs_BK1()[2]) #<--- here 

@constraint(m, x .>= bounds_BK1()[1]) 
@constraint(m, x .<= bounds_BK1()[2]) 
s=solve(m) 

답변

1

, 당신은 Float64 값의 배열로 f을 정의했습니다. JuMP documentation for Nonlinear Expressions에 명시된 바와 같이 모든 비선형 표현식은 @NLexpression 매크로 내부에 정의되어야하며 매크로에서는 AffExprQuadExpr 개체를 현재 사용할 수 없습니다.

solve 작업을 통해 해결책을 찾는 명령의 결과 다음과 같은 설정 :

julia> using JuMP 

julia> using Ipopt 

julia> m = Model(solver=IpoptSolver(print_level=0)) 
Feasibility problem with: 
* 0 linear constraints 
* 0 variables 
Solver is Ipopt 

julia> @variable(m, x[i=1:2]) 
2-element Array{JuMP.Variable,1}: 
x[1] 
x[2] 

julia> function bounds_BK1() 
      return ([-5.0;-5.0],[10.0;10.0]) 
     end 
bounds_BK1 (generic function with 1 method) 

julia> @NLexpression(m, F1, x[1]^2 + x[2]^2) 
JuMP.NonlinearExpression(Feasibility problem with: 
* 0 linear constraints 
* 2 variables 
Solver is Ipopt,1) 

julia> @NLexpression(m, F2, (x[1]-5.0)^2 + (x[2]-5.0)^2) 
JuMP.NonlinearExpression(Feasibility problem with: 
* 0 linear constraints 
* 2 variables 
Solver is Ipopt,2) 

julia> @constraint(m, x .>= bounds_BK1()[1]) 
2-element Array{JuMP.ConstraintRef{JuMP.Model,JuMP.GenericRangeConstraint{JuMP.GenericAffExpr{Float64,JuMP.Variable}}},1}: 
x[1] ≥ -5 
x[2] ≥ -5 

julia> @constraint(m, x .<= bounds_BK1()[2]) 
2-element Array{JuMP.ConstraintRef{JuMP.Model,JuMP.GenericRangeConstraint{JuMP.GenericAffExpr{Float64,JuMP.Variable}}},1}: 
x[1] ≤ 10 
x[2] ≤ 10 

julia> s = solve(m) 

****************************************************************************** 
This program contains Ipopt, a library for large-scale nonlinear optimization. 
Ipopt is released as open source code under the Eclipse Public License (EPL). 
     For more information visit http://projects.coin-or.org/Ipopt 
****************************************************************************** 

:Optimal 

julia> getvalue(x) 
2-element Array{Float64,1}: 
0.261454 
0.261454 

나는 당신이 그 것 나중에 functs_BK1 내에서 표현의 배열을 구축하는 것이 현재 가능하다고 생각하지 않는다 @NLexpression으로 전달하십시오. 현재 JuMP 변수의 스칼라 표현식을 @NLexpression의 인수로 직접 전달해야합니다.