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

Оптимизация методом мультистарта с помощью EnsembleProblem

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

EnsembleProblem в SciML служит общим интерфейсом для выполнения задачи с несколькими наборами начальных значений. Когда речь идет об оптимизации, это полезно для проведения оптимизации методом мультистарта.

Это может быть полезно для решения сложных задач низкой размерности. Продемонстрируем это и в данном случае на примере функции Розенброка.

Сначала выполним одну локальную оптимизацию с OptimizationOptimJL.BFGS и maxiters=5:

using Optimization, OptimizationOptimJL, Random

Random.seed!(100)

rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)

optf = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = OptimizationProblem(optf, x0, [1.0, 100.0])
@time sol1 = Optimization.solve(prob, OptimizationOptimJL.BFGS(), maxiters = 5)

@show sol1.objective
0.25297018300077956

Эти результаты сравниваются с результатом метода мультистарта с 4 случайными начальными точками:

x0s = [x0, x0 .+ rand(2), x0 .+ rand(2), x0 .+ rand(2)]
function prob_func(prob, i, repeat)
    remake(prob, u0 = x0s[i])
end

ensembleprob = Optimization.EnsembleProblem(prob; prob_func)
@time sol = Optimization.solve(ensembleprob, OptimizationOptimJL.BFGS(),
    EnsembleThreads(), trajectories = 4, maxiters = 5)
@show findmin(i -> sol[i].objective, 1:4)[1]
0.006959083213016885

При том же числе итераций (5) получается гораздо меньшее (в 100 раз) целевое значение за счет использования нескольких начальных точек. Примененная здесь стратегия инициализации была довольно примитивной, но подходы, основанные на выборке методом квази-Монте-Карло, обычно бывают более эффективными.