Повторное использование задач оптимизации и интерфейс кэширования
|
Страница в процессе перевода. |
Повторное использование кэшей оптимизации с помощью reinit!
Функция reinit! позволяет эффективно повторно использовать существующий кэш оптимизации с новыми параметрами или начальными значениями. Это особенно полезно при многократном решении сходных задач оптимизации с разными значениями параметров, поскольку позволяет избежать накладных расходов на создание нового кэша с нуля.
Базовое использование
# Создаем исходную задачу и кэш
using Optimization, OptimizationOptimJL
rosenbrock(u, p) = (p[1] - u[1])^2 + p[2] * (u[2] - u[1]^2)^2
u0 = zeros(2)
p = [1.0, 100.0]
optf = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = OptimizationProblem(optf, u0, p)
# Инициализируем кэш и решаем задачу
cache = Optimization.init(prob, Optim.BFGS())
sol = Optimization.solve!(cache)
# Повторно инициализируем кэш с новыми параметрами
cache = Optimization.reinit!(cache; p = [2.0, 50.0])
sol2 = Optimization.solve!(cache)
retcode: Success
u: 2-element Vector{Float64}:
1.0000000000045803
1.000000000009483
Поддерживаемые аргументы
Функция reinit! поддерживает обновление различных полей кэша оптимизации:
-
u0: новые начальные значения для переменных оптимизации -
p: новые значения параметров -
lb: новые нижние границы (если применимо) -
ub: новые верхние границы (если применимо) -
lcons: новые нижние границы ограничений (если применимо) -
ucons: новые верхние границы ограничений (если применимо)
Пример: Вариация параметров
# Эффективно решаем задачу с несколькими наборами значений параметров
results = []
p_values = [[1.0, 100.0], [2.0, 100.0], [3.0, 100.0]]
# Создаем исходный кэш
cache = Optimization.init(prob, Optim.BFGS())
function sweep(cache, p_values)
for p in p_values
cache = Optimization.reinit!(cache; p = p)
sol = Optimization.solve!(cache)
push!(results, (p = p, u = sol.u, objective = sol.objective))
end
end
sweep(cache, p_values)
Пример: Обновление начальных значений
# Мягкий запуск оптимизации из разных начальных точек
u0_values = [[0.0, 0.0], [0.5, 0.5], [1.0, 1.0]]
for u0 in u0_values
local cache
cache = Optimization.reinit!(cache; u0 = u0)
sol = Optimization.solve!(cache)
println("Starting from ", u0, " converged to ", sol.u)
end
Выигрыш в производительности
Использовать reinit! эффективнее, чем создавать новую задачу и кэш для каждого значения параметра, особенно в следующих случаях:
-
Алгоритм оптимизации сохраняет внутреннее состояние, которое можно использовать повторно.
-
Структура задачи остается прежней (меняются только значения параметров).
Примечания
-
Функция
reinit!изменяет кэш на месте и возвращает его для удобства. -
Не обязательно указывать все поля; укажите только те, которые нужно обновить.
-
Функция особенно полезна в итеративных алгоритмах, при оценке параметров и при решении семейств связанных задач оптимизации.
-
Для создания новой задачи с другими параметрами (а не изменения кэша) используйте вместо этого
remakeприменительно кOptimizationProblem.