问题描述
我正在寻找一个内置库或函数来解决 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