Metaheuristics.jl
|
Страница в процессе перевода. |
Metaheuristics — это пакет Julia, в котором реализованы метаэвристические алгоритмы для глобальной оптимизации, не требующей дифференцируемости оптимизируемой функции.
Установка: OptimizationMetaheuristics.jl
Чтобы использовать этот пакет, установите пакет OptimizationMetaheuristics:
import Pkg;
Pkg.add("OptimizationMetaheuristics");
Глобальный оптимизатор
Без уравнений ограничений
Алгоритм Metaheuristics с одной целью вызывается одним из следующих способов:
-
Алгоритм эволюционных центров:
ECA() -
Дифференциальная эволюция:
DE()с 5 различными стратегиями-
DE(strategy=:rand1)— стратегия по умолчанию -
DE(strategy=:rand2) -
DE(strategy=:best1) -
DE(strategy=:best2) -
DE(strategy=:randToBest1)
-
-
Оптимизация методом роя частиц:
PSO() -
Искусственный пчелиный рой:
ABC() -
Алгоритм гравитационного поиска:
CGSA() -
Алгоритм имитации отжига:
SA() -
Алгоритм оптимизации на основе имитации поведения китов:
WOA()
Metaheuristics также выполняет Multiobjective optimization, но эта возможность пока не поддерживается в Optimization.
Каждый оптимизатор устанавливает настройки по умолчанию с учетом задачи оптимизации, но можно задать конкретные параметры, как показано в исходной Documentation.
Кроме того, общие параметры Metaheuristics, которые определяются в Metaheuristics.Options, можно просто передать в solve как специальные именованные аргументы, не используя структуру Metaheuristics.Options.
Наконец, информация о задаче оптимизации, например истинный оптимум, задается посредством Metaheuristics.Information и передается в рамках структуры оптимизатора в solve, например solve(prob, ECA(information=Metaheuristics.Information(f_optimum = 0.0)))
Доступные в настоящее время алгоритмы и их параметры перечислены здесь.
Примечания
Алгоритмы в Metaheuristics выполняют глобальную оптимизацию задач без уравнений ограничений. Однако требуются нижние и верхние ограничения, заданные в lb и ub в OptimizationProblem.
Примеры
Функцию Розенброка можно оптимизировать с помощью алгоритма эволюционных центров ECA() следующим образом:
using Optimization, OptimizationMetaheuristics
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, ECA(), maxiters = 100000, maxtime = 1000.0)
retcode: Default
u: 2-element Vector{Float64}:
1.0
1.0
По умолчанию Metaheuristics игнорирует начальные значения x0, заданные в OptimizationProblem. Чтобы в Optimization использовались значения x0, необходимо задать use_initial=true:
sol = solve(prob, ECA(), use_initial = true, maxiters = 100000, maxtime = 1000.0)
retcode: Default
u: 2-element Vector{Float64}:
1.0
1.0