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

Повторное использование задач оптимизации и интерфейс кэширования

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

Повторное использование кэшей оптимизации с помощью 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.