Документация Engee

NLopt.jl

Страница в процессе перевода.

NLopt — это пакет Julia, взаимодействующий с бесплатной библиотекой NLopt library с открытым исходным кодом, в которой реализовано множество методов оптимизации, как глобальных, так и локальных: NLopt Documentation.

Установка: OptimizationNLopt.jl

Чтобы использовать этот пакет, установите пакет OptimizationNLopt:

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

Методы

Алгоритмы NLopt.jl выбираются либо посредством вызова NLopt.Opt(:algname, nstates), где nstates — количество оптимизируемых состояний, либо, что лучше, посредством NLopt.AlgorithmName(), где AlgorithmName может быть одним из следующих имен алгоритмов:

  • NLopt.GN_DIRECT()

  • NLopt.GN_DIRECT_L()

  • NLopt.GN_DIRECT_L_RAND()

  • NLopt.GN_DIRECT_NOSCAL()

  • NLopt.GN_DIRECT_L_NOSCAL()

  • NLopt.GN_DIRECT_L_RAND_NOSCAL()

  • NLopt.GN_ORIG_DIRECT()

  • NLopt.GN_ORIG_DIRECT_L()

  • NLopt.GD_STOGO()

  • NLopt.GD_STOGO_RAND()

  • NLopt.LD_LBFGS()

  • NLopt.LN_PRAXIS()

  • NLopt.LD_VAR1()

  • NLopt.LD_VAR2()

  • NLopt.LD_TNEWTON()

  • NLopt.LD_TNEWTON_RESTART()

  • NLopt.LD_TNEWTON_PRECOND()

  • NLopt.LD_TNEWTON_PRECOND_RESTART()

  • NLopt.GN_CRS2_LM()

  • NLopt.GN_MLSL()

  • NLopt.GD_MLSL()

  • NLopt.GN_MLSL_LDS()

  • NLopt.GD_MLSL_LDS()

  • NLopt.LD_MMA()

  • NLopt.LN_COBYLA()

  • NLopt.LN_NEWUOA()

  • NLopt.LN_NEWUOA_BOUND()

  • NLopt.LN_NELDERMEAD()

  • NLopt.LN_SBPLX()

  • NLopt.LN_AUGLAG()

  • NLopt.LD_AUGLAG()

  • NLopt.LN_AUGLAG_EQ()

  • NLopt.LD_AUGLAG_EQ()

  • NLopt.LN_BOBYQA()

  • NLopt.GN_ISRES()

  • NLopt.AUGLAG()

  • NLopt.AUGLAG_EQ()

  • NLopt.G_MLSL()

  • NLopt.G_MLSL_LDS()

  • NLopt.LD_SLSQP()

  • NLopt.LD_CCSAQ()

  • NLopt.GN_ESCH()

  • NLopt.GN_AGS()

Дополнительные сведения о каждом оптимизаторе см. в NLopt Documentation.

Помимо общих аргументов, в kwargs можно задать следующие параметры оптимизатора:

  • stopval

  • xtol_rel

  • xtol_abs

  • constrtol_abs

  • initial_step

  • population

  • vector_storage

Локальный оптимизатор

Без вычисления производных

Оптимизаторы без вычисления производных — это оптимизаторы, которые можно использовать даже в тех случаях, когда не указаны производные или автоматическое дифференцирование. Хотя они, как правило, менее эффективны, чем оптимизаторы на основе производных, их можно легко применять в случаях, когда определение производных затруднено. Обратите внимание, что хотя эти методы не поддерживают общие ограничения, все они поддерживают ограничения границ посредством lb и ub в OptimizationProblem.

В NLopt есть следующие оптимизаторы без вычисления производных:

  • NLopt.LN_PRAXIS()

  • NLopt.LN_COBYLA()

  • NLopt.LN_NEWUOA()

  • NLopt.LN_NEWUOA_BOUND()

  • NLopt.LN_NELDERMEAD()

  • NLopt.LN_SBPLX()

  • NLopt.LN_AUGLAG()

  • NLopt.LN_AUGLAG_EQ()

  • NLopt.LN_BOBYQA()

Функцию Розенброка можно оптимизировать с помощью NLopt.LN_NELDERMEAD() следующим образом:

using Optimization
using OptimizationNLopt
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)
prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, 1.0])
sol = solve(prob, NLopt.LN_NELDERMEAD())
retcode: Success
u: 2-element Vector{Float64}:
 1.0
 1.0

На основе градиента

Оптимизаторы на основе градиента — это оптимизаторы, которые используют информацию о градиенте на основе определенных производных или автоматического дифференцирования.

В NLopt есть следующие оптимизаторы на основе градиента:

  • NLopt.LD_LBFGS_NOCEDAL()

  • NLopt.LD_LBFGS()

  • NLopt.LD_VAR1()

  • NLopt.LD_VAR2()

  • NLopt.LD_TNEWTON()

  • NLopt.LD_TNEWTON_RESTART()

  • NLopt.LD_TNEWTON_PRECOND()

  • NLopt.LD_TNEWTON_PRECOND_RESTART()

  • NLopt.LD_MMA()

  • NLopt.LD_AUGLAG()

  • NLopt.LD_AUGLAG_EQ()

  • NLopt.LD_SLSQP()

  • NLopt.LD_CCSAQ()

Функцию Розенброка можно оптимизировать с помощью NLopt.LD_LBFGS() следующим образом:

using Optimization, OptimizationNLopt
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, lb = [-1.0, -1.0], ub = [1.0, 1.0])
sol = solve(prob, NLopt.LD_LBFGS())
retcode: Success
u: 2-element Vector{Float64}:
 1.0
 1.0

Глобальный оптимизатор

Без уравнений ограничений

Следующие алгоритмы в NLopt выполняют глобальную оптимизацию задач без уравнений ограничений. Однако требуются нижние и верхние ограничения, заданные в lb и ub в OptimizationProblem.

К этой категории относятся следующие глобальные оптимизаторы NLopt:

  • NLopt.GN_DIRECT()

  • NLopt.GN_DIRECT_L()

  • NLopt.GN_DIRECT_L_RAND()

  • NLopt.GN_DIRECT_NOSCAL()

  • NLopt.GN_DIRECT_L_NOSCAL()

  • NLopt.GN_DIRECT_L_RAND_NOSCAL()

  • NLopt.GD_STOGO()

  • NLopt.GD_STOGO_RAND()

  • NLopt.GN_CRS2_LM()

  • NLopt.GN_MLSL()

  • NLopt.GD_MLSL()

  • NLopt.GN_MLSL_LDS()

  • NLopt.GD_MLSL_LDS()

  • NLopt.G_MLSL()

  • NLopt.G_MLSL_LDS()

  • NLopt.GN_ESCH()

Функцию Розенброка можно оптимизировать с помощью NLopt.GN_DIRECT() следующим образом:

using Optimization, OptimizationNLopt
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)
prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, 1.0])
sol = solve(prob, NLopt.GN_DIRECT(), maxtime = 10.0)
retcode: MaxTime
u: 2-element Vector{Float64}:
 0.9999999999999858
 0.9999999999999716

Такие алгоритмы, как NLopt.G_MLSL() или NLopt.G_MLSL_LDS(), также требуют выбора локального оптимизатора, что делается с помощью аргумента local_method функции solve.

Функцию Розенброка можно оптимизировать с помощью NLopt.G_MLSL_LDS(), используя NLopt.LN_NELDERMEAD() в качестве локального оптимизатора. Максимальное количество итераций локального оптимизатора задается с помощью local_maxiters:

using Optimization, OptimizationNLopt
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, lb = [-1.0, -1.0], ub = [1.0, 1.0])
sol = solve(prob, NLopt.G_MLSL_LDS(), local_method = NLopt.LD_LBFGS(), maxtime = 10.0,
    local_maxiters = 10)
retcode: MaxTime
u: 2-element Vector{Float64}:
 1.0
 1.0

С уравнениями ограничений

Следующие алгоритмы в NLopt выполняют глобальную оптимизацию задач с уравнениями ограничений. Однако требуются нижние и верхние ограничения, заданные в lb и ub в OptimizationProblem.

Constraints with NLopt Уравнения равенства и неравенства не поддерживается напрямую для NLopt посредством Optimization. Однако для использования ограничений с оптимизаторами NLopt можно прибегнуть к оболочке MOI.

К этой категории относятся следующие глобальные оптимизаторы NLopt:

  • NLopt.GN_ORIG_DIRECT()

  • NLopt.GN_ORIG_DIRECT_L()

  • NLopt.GN_ISRES()

  • NLopt.GN_AGS()