【问题标题】:MINLP in Julia using Juniper使用瞻博网络的 Julia 中的 MINLP
【发布时间】:2020-02-11 07:56:01
【问题描述】:

我正在尝试在 Julia 中使用二进制变量解决 MINLP。 我有一个特定于用户的非线性目标函数,并且我有非线性和线性约束。我尝试使用 Juniper 解决问题,但总是收到我不明白的错误 KeyError: key :myfunc not found

这是发生错误的示例。

using Ipopt, JuMP, Juniper
N = 5 

optimizer = Juniper.Optimizer
params = Dict{Symbol,Any}()
params[:nl_solver] = with_optimizer(Ipopt.Optimizer, print_level=0) 
m = Model(with_optimizer(optimizer, params))

@variable(m, z[1:N],binary=true)
@NLconstraint(m,  sum(z[i]*z[i+1] for i=1:N-1) <= 20)
@constraint(m, sum(z[i] for i=1:N) <= 10) 
myfunc(z...) =  sum(sin(i)*z[i]^i for i in 1:length(z))
register(m, :myfunc, N, myfunc, autodiff=true)
@NLobjective(m, Max, myfunc(z...))
m

optimize!(m)
println(JuMP.value.(z))
println(JuMP.objective_value(m))
println(JuMP.termination_status(m))

您知道为什么会出现错误KeyError: key :myfunc not found 以及如何解决它吗?

谢谢!

【问题讨论】:

    标签: julia nonlinear-optimization mixed-integer-programming julia-jump


    【解决方案1】:

    似乎目标需要在 JuMP 和 Juniper 中注册。这是一个 MINLP 的工作示例,其中 i) 目标是非线性的,ii) 约束既是线性的又是非线性的,iii) 变量是二元的。

    using Juniper, Ipopt, JuMP, Cbc # <- last package is optional
    N = 4
    
    function myfunction(x...)
        return sum(x[i].^4 for i = 1:length(x))
    end
    
    
    m = Model(
        with_optimizer(
            Juniper.Optimizer;
                nl_solver = with_optimizer(Ipopt.Optimizer, print_level = 0),
                mip_solver = with_optimizer(Cbc.Optimizer, logLevel=0), # <- optional
                registered_functions = [
                    Juniper.register(:myfunction,  N, myfunction; autodiff = true)
                ]
            )
        )
    register(m, :myfunction, N, myfunction; autodiff = true)
    @variable(m, x[1:N], Bin)
    @NLconstraint(m, sum(sin(x[i]^2) for i=1:N) <= 4)   
    @constraint(m, x[1]+x[2]+x[3] <= 2)   
    @NLobjective(m, Max, myfunction(x...))
    optimize!(m)
    println(JuMP.value.(x))
    println(JuMP.objective_value(m))
    println(JuMP.termination_status(m))
    

    这是结果输出:

    nl_solver             : OptimizerFactory(Ipopt.Optimizer, (), Base.Iterators.Pairs(:print_level => 0))
    mip_solver            : OptimizerFactory(Cbc.Optimizer, (), Base.Iterators.Pairs(:logLevel => 0))
    log_levels            : Symbol[:Options, :Table, :Info]
    registered_functions  : Juniper.RegisteredFunction[Juniper.RegisteredFunction(:myfunction, 4, myfunction, nothing, nothing, true)]
    
    #Variables: 4
    #IntBinVar: 4
    #Constraints: 2
    #Linear Constraints: 1
    #Quadratic Constraints: 0
    #NonLinear Constraints: 1
    Obj Sense: Max
    
    Incumbent using start values: 0.0
    Status of relaxation: LOCALLY_SOLVED
    Time for relaxation: 0.19966506958007812
    Relaxation Obj: 1.5925926562762966
    
           MIPobj              NLPobj       Time 
    =============================================
           1.3333               0.0          0.0 
    
    FP: 0.00896906852722168 s
    FP: 1 round
    FP: Obj: 3.0
    
     ONodes   CLevel          Incumbent                   BestBound            Gap    Time   Restarts  GainGap  
    ============================================================================================================
        0       2                3.0                         1.59            46.91%   0.1       0         -     
    
    #branches: 1
    Obj: 3.000000119960002
    [1.0, 0.0, 1.0, 1.0]
    3.000000119960002
    LOCALLY_SOLVED
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2016-03-01
      • 1970-01-01
      • 2012-07-29
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多