AnyMath 文档

线性和整数优化问题

该页面正在翻译中。

例子:短期融资

下面我们展示如何使用HiGHS优化器求解线性优化问题。 这个例子是从https://jump…​dev/跳转。jl/stable/tutorials/linear/finance/#Short-term-financing[跳转文档]。

短期现金承诺对公司来说是一个持续的挑战。 让我们探索一个示例场景,以更好地理解这一点:

考虑以下每月净现金流量要求,以数千美元表示:

月份 一月 2月 三月 四月 五月

净现金流量

-150

-100

200

-200

50

300

为了满足这些财务需求,我们假设的公司可以获得各种资金来源:

  1. 信用额度:公司可以使用高达$100,000的信用额度,每月利率为1%。

  2. 商业票据发行:在前三个月的任何一个月中,公司都可以选择发行90天商业票据,三个月期间的累积利率为2%。

  3. 盈余资金投资:任何多余的资金都可以投资,每月利率为0.3%。

目标是确定这些资金来源的最具成本效益的利用,旨在在6月底之前最大化公司的可用资金。

为了对这个问题进行建模,我们引入了以下决策变量:

* u_i:每月从信贷额度中提取的金额 i. * v_i:每月商业票据发行量 i. * w_i:每月盈余资金 i.

我们需要考虑以下约束:

  1. 现金流入必须等于每月的现金流出。

  2. 上界必须强加于 u_i 以确保符合信用额度。

  3. 决策变量 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. 问题可以陈述如下:

这意味着二元变量的最大化问题 以目标为点积 vu 受二次约束 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