AnyMath 文档

MathOptInterface.jl

该页面正在翻译中。

MathOptInterface是一个Julia抽象层,用于与各种数学优化求解器接口。

安装:OptimizationMOI。jl

要使用此软件包,请安装OptimizationMOI软件包:

import Pkg;
Pkg.add("OptimizationMOI");

详情

截至目前, 优化设计 接口到 [医]数学面 只实施 最大时间 通用关键字参数。

优化moi 支持论点 [医]mtkize 这需要一个布尔值(默认为 错误)允许自动符号表达式生成,这允许使用任何具有求解器或接口(如AmplNLWriter)的AD后端,这些接口需要目标和约束的表达式图。 这总是在以下情况下自动发生 自动机械 ad类型,ad类型.

支持 [医]数学面 如果不需要定义优化器选项,可以直接调用API。

例如,使用https://github.com/jump-dev/Ipopt.jl[脧锚脧赂`Ipopt。jl`]优化器:

using OptimizationMOI, Ipopt
sol = solve(prob, Ipopt.Optimizer())

优化器选项的处理方式有两种。 它们可以通过 OptimizationMOI。莫伊优化器() 或作为关键字参数 解决方案.

例如,使用 Ipopt。jl 优化器:

using OptimizationMOI, Ipopt
opt = OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
    "option_name" => option_value, ...)
sol = solve(prob, opt)

sol = solve(prob, Ipopt.Optimizer(); option_name = option_value, ...)

优化器

Ipopt。jl(MathOptInterface)

*脧锚脧赂`Ipopt。优化器` *优化器选项的完整列表可在https://coin-or.github.io/Ipopt/OPTIONS.html#OPTIONS_REF[Ipopt文档]

奈特罗。jl(MathOptInterface)

*脧锚脧赂`奈特罗。优化器` *优化器选项的完整列表可在https://www.artelys.com/docs/knitro//3_referenceManual/callableLibraryAPI.html[KNITRO文档]

杜松。jl(MathOptInterface)

*脧锚脧赂`杜松。优化器` *瞻博网络需要一个非线性优化器通过设置 nl_solver 选项,它必须是基于MathOptInterface的优化器。 查看https://github.com/lanl-ansi/Juniper.jl[瞻博网络文档]了解更多详细信息。

using Optimization, OptimizationMOI, Juniper, Ipopt
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)
_p = [1.0, 100.0]

f = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = Optimization.OptimizationProblem(f, x0, _p)

opt = OptimizationMOI.MOI.OptimizerWithAttributes(Juniper.Optimizer,
    "nl_solver" => OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
        "print_level" => 0))
sol = solve(prob, opt)
retcode: Success
u: 2-element Vector{Float64}:
 0.9999999999999899
 0.9999999999999792

使用整数约束

下面演示如何使用整数线性规划内 优化设计. 我们将使用以下方法解决经典背包问题 杜松。jl.

*脧锚脧赂`杜松。优化器` *瞻博网络需要一个非线性优化器通过设置 nl_solver 选项,必须是基于MathOptInterface的优化器。 查看https://github.com/lanl-ansi/Juniper.jl[瞻博网络文档]了解更多详细信息。 *根据变量的边界推断整数域: **将下界设置为零,将上界设置为一对应于 莫伊零酮() 或二元决策变量 **提供其他或没有边界对应于 莫伊整数()

v = [1.0, 2.0, 4.0, 3.0]
w = [5.0, 4.0, 3.0, 2.0]
W = 4.0
u0 = [0.0, 0.0, 0.0, 1.0]

optfun = OptimizationFunction((u, p) -> -v'u, cons = (res, u, p) -> res .= w'u,
    Optimization.AutoForwardDiff())

optprob = OptimizationProblem(optfun, u0; lb = zero.(u0), ub = one.(u0),
    int = ones(Bool, length(u0)),
    lcons = [-Inf;], ucons = [W;])

nl_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
    "print_level" => 0)
minlp_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Juniper.Optimizer,
    "nl_solver" => nl_solver)

res = solve(optprob, minlp_solver)
retcode: Success
u: 4-element Vector{Float64}:
 0.0
 0.0
 1.0
 0.0