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

Создание полиалгоритмов путем объединения решателей в цепочку с использованием 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

Да! Мы нашли глобальный оптимум (известно, что он находится в точке ).