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:
-
NLopt.GN_ORIG_DIRECT() -
NLopt.GN_ORIG_DIRECT_L() -
NLopt.GN_ISRES() -
NLopt.GN_AGS()