Создание полиалгоритмов путем объединения решателей в цепочку с использованием remake
|
Страница в процессе перевода. |
Общая схема использования нескольких решателей для чередования исследования и сходимости широко известна как полиалгоритмы. В прошлом пакет Optimization.jl предоставлял решатель PolyOpt из OptimizationPolyalgorithms.jl, в котором комбинировались алгоритмы Adam из Optimisers.jl и BFGS из Optim.jl. Ввиду большого количества вариантов, доступных через интерфейс, для решения конкретных задач могут оказаться эффективными уникальные комбинации решателей.
В этом руководстве показано, как использовать функцию remake для объединения решателей в цепочку с целью создания собственных полиалгоритмов.
Интерфейс SciML предоставляет функцию remake, которая позволяет заново создать объект OptimizationProblem на основе ранее определенного объекта OptimizationProblem с другим начальным предположением для переменных оптимизации.
Давайте рассмотрим 10-мерную функцию Швефеля в гиперкубе ].
using Optimization, OptimizationLBFGSB, Random
using OptimizationBBO, ReverseDiff
Random.seed!(122333)
function f_schwefel(x, p = [418.9829])
result = p[1] * length(x)
for i in 1:length(x)
result -= x[i] * sin(sqrt(abs(x[i])))
end
return result
end
optf = OptimizationFunction(f_schwefel, AutoReverseDiff(compile = true))
x0 = ones(10) .* 200.0
prob = OptimizationProblem(
optf, x0, [418.9829], lb = fill(-500.0, 10), ub = fill(500.0, 10))
@show f_schwefel(x0)
2189.853687755758
Стратегия нашего полиалгоритма будет заключаться в использовании глобальных оптимизаторов BlackBoxOptim для эффективного исследования пространства параметров, после чего для достижения сходимости к глобальному оптимуму будет применен квазиньютоновский метод LBFGS.
res1 = solve(prob, BBO_adaptive_de_rand_1_bin(), maxiters = 4000)
@show res1.objective
592.7339938425041
Начало неплохое. Сможем ли мы достичь сходимости к глобальному оптимуму?
prob = remake(prob, u0 = res1.minimizer)
res2 = solve(prob, OptimizationLBFGSB.LBFGSB(), maxiters = 100)
@show res2.objective
118.4384618901176
Да! Мы нашли глобальный оптимум (известно, что он находится в точке ).