线性和整数优化问题
|
该页面正在翻译中。 |
例子:短期融资
下面我们展示如何使用HiGHS优化器求解线性优化问题。 这个例子是从https://jump…dev/跳转。jl/stable/tutorials/linear/finance/#Short-term-financing[跳转文档]。
短期现金承诺对公司来说是一个持续的挑战。 让我们探索一个示例场景,以更好地理解这一点:
考虑以下每月净现金流量要求,以数千美元表示:
| 月份 | 一月 | 2月 | 三月 | 四月 | 五月 | 君 |
|---|---|---|---|---|---|---|
净现金流量 |
-150 |
-100 |
200 |
-200 |
50 |
300 |
为了满足这些财务需求,我们假设的公司可以获得各种资金来源:
-
信用额度:公司可以使用高达$100,000的信用额度,每月利率为1%。
-
商业票据发行:在前三个月的任何一个月中,公司都可以选择发行90天商业票据,三个月期间的累积利率为2%。
-
盈余资金投资:任何多余的资金都可以投资,每月利率为0.3%。
目标是确定这些资金来源的最具成本效益的利用,旨在在6月底之前最大化公司的可用资金。
为了对这个问题进行建模,我们引入了以下决策变量:
* u_i:每月从信贷额度中提取的金额 i.
* v_i:每月商业票据发行量 i.
* w_i:每月盈余资金 i.
我们需要考虑以下约束:
-
现金流入必须等于每月的现金流出。
-
上界必须强加于
u_i以确保符合信用额度。 -
决策变量
u_i,v_i,并w_i必须是非负的。
最终目标是在6月份最大化公司的财富,用变量表示 m.
using Optimization, OptimizationMOI, ModelingToolkit, HiGHS, LinearAlgebra
@variables u[1:5] [bounds = (0.0, 100.0)]
@variables v[1:3] [bounds = (0.0, Inf)]
@variables w[1:5] [bounds = (0.0, Inf)]
@variables m [bounds = (0.0, Inf)]
cons = [u[1] + v[1] - w[1] ~ 150 # January
u[2] + v[2] - w[2] - 1.01u[1] + 1.003w[1] ~ 100 # February
u[3] + v[3] - w[3] - 1.01u[2] + 1.003w[2] ~ -200 # March
u[4] - w[4] - 1.02v[1] - 1.01u[3] + 1.003w[3] ~ 200 # April
u[5] - w[5] - 1.02v[2] - 1.01u[4] + 1.003w[4] ~ -50 # May
-m - 1.02v[3] - 1.01u[5] + 1.003w[5] ~ -300]
@named optsys = OptimizationSystem(m, [u..., v..., w..., m], [], constraints = cons)
optsys = complete(optsys)
optprob = OptimizationProblem(optsys,
vcat(fill(0.0, 13), 300.0);
grad = true,
hess = true,
sense = Optimization.MaxSense)
sol = solve(optprob, HiGHS.Optimizer())
retcode: Success
u: 14-element Vector{Float64}:
100.0
100.0
100.0
100.0
100.0
50.0
8274.735079210432
195.09803921568627
0.0
8173.735079210433
8592.35432366375
8366.131386634737
0.0
0.0
混合整数非线性优化
我们从https://github.com/lanl-ansi/Juniper.jl#use-with-jump[Juniper.jl readme]演示混合整数非线性优化与优化。jl. 问题可以陈述如下:
这意味着二元变量的最大化问题 以目标为点积 v 和 u 受二次约束 u.
using Juniper, Ipopt
v = [10, 20, 12, 23, 42]
w = [12, 45, 12, 22, 21]
objective = (u, p) -> (v = p[1:5]; dot(v, u))
cons = (res, u, p) -> (w = p[6:10]; res .= [sum(w[i] * u[i]^2 for i in 1:5)])
optf = OptimizationFunction(objective, Optimization.AutoSymbolics(), cons = cons)
optprob = OptimizationProblem(optf,
zeros(5),
vcat(v, w);
sense = Optimization.MaxSense,
lb = zeros(5),
ub = ones(5),
lcons = [-Inf],
ucons = [45.0],
int = fill(true, 5))
nl_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
"print_level" => 0)
minlp_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Juniper.Optimizer,
"nl_solver" => nl_solver)
sol = solve(optprob, minlp_solver)
retcode: Success
u: 5-element Vector{Float64}:
0.0
0.0
0.0
1.0
1.0