内置方法/库来解决 Julia 中的优化问题

问题描述

我正在寻找一个内置库或函数解决 Julia 中的最小化问题。也就是说,我有一个包含 10 个参数的大型函数,我想将其输入到求解器中,并且我想找到这 10 个参数的特定值,同时最小化该函数。我注意到有 an introduction to the simplex method in the "Julia Programming for Operations Research",但这个最小化是我整个项目的一小部分,我更喜欢使用一些内置功能、库或预制函数 GitHub 来获得一些快速和肮脏的尽快得到结果。有这样的 Julia 库吗?

解决方法

您使用 JuMP 和求解器,例如Cbc

using JuMP,Cbc
m = Model(Cbc.Optimizer)
@variable(m,0 <= x[i=1:10] <= 7)
@constraint(m,sum(x) == 15)

@objective(m,Max,sum(i*x[i] for i in 1:10))

optimize!(m)

您可以打印模型:

julia> println(m)
Max x[1] + 2 x[2] + 3 x[3] + 4 x[4] + 5 x[5] + 6 x[6] + 7 x[7] + 8 x[8] + 9 x[9] + 10 x[10]
Subject to
 x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8] + x[9] + x[10] == 15.0
 x[1] >= 0.0
 x[2] >= 0.0
 x[3] >= 0.0
 x[4] >= 0.0
 x[5] >= 0.0
 x[6] >= 0.0
 x[7] >= 0.0
 x[8] >= 0.0
 x[9] >= 0.0
 x[10] >= 0.0
 x[1] <= 7.0
 x[2] <= 7.0
 x[3] <= 7.0
 x[4] <= 7.0
 x[5] <= 7.0
 x[6] <= 7.0
 x[7] <= 7.0
 x[8] <= 7.0
 x[9] <= 7.0
 x[10] <= 7.0

这就是你解决它的方法:

julia> optimize!(m)
Welcome to the CBC MILP Solver
Version: 2.10.3
Build Date: Jan  1 1970

command line - Cbc_C_Interface -solve -quit (default strategy 1)
Presolve 1 (0) rows,10 (0) columns and 10 (0) elements
0  Obj -0 Primal inf 15 (1) Dual inf 54.999999 (10)
1  Obj 141
Optimal - objective value 141
Optimal objective 141 - 1 iterations time 0.002
Total time (CPU seconds):       0.01   (Wallclock seconds):       0.01

这就是您获取变量值的方式:


julia> value.(x)
10-element Vector{Float64}:
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 0.0
 1.0
 7.0
 7.0