AnyMath 文档

优化问题重用和缓存接口

该页面正在翻译中。

重用优化缓存 雷尼特!

雷尼特! 函数允许您有效地重用具有新参数或初始值的现有优化缓存。 这在使用不同的参数值重复求解类似的优化问题时特别有用,因为它避免了从头创建新缓存的开销。

基本用法

# Create initial problem and cache
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)

# Initialize cache and solve
cache = Optimization.init(prob, Optim.BFGS())
sol = Optimization.solve!(cache)

# Reinitialize cache with new parameters
cache = Optimization.reinit!(cache; p = [2.0, 50.0])
sol2 = Optimization.solve!(cache)
retcode: Success
u: 2-element Vector{Float64}:
 1.0000000000045803
 1.000000000009483

支持的参数

雷尼特! 功能支持更新优化缓存的各个字段:

* u0:优化变量的新初始值 * p:新参数值 * 磅/磅:新的下限(如果适用) * ub:新上限(如适用) * 立法会议员:约束的新下限(如果适用) * 乌肯斯:约束的新上限(如果适用)

示例:参数扫描

# Solve for multiple parameter values efficiently
results = []
p_values = [[1.0, 100.0], [2.0, 100.0], [3.0, 100.0]]

# Create initial cache
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)

示例:更新初始值

# Warm-start optimization from different initial points
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

工作表现效益

使用 雷尼特! 比为每个参数值创建新问题和缓存更有效,特别是当:

*优化算法维护可重复使用的内部状态 *问题结构保持不变(仅参数值更改)

注意事项

* 雷尼特! 函数就地修改缓存并返回它以方便 *并非所有字段都需要指定;只提供要更新的字段 *该函数在迭代算法、参数估计以及求解相关优化问题系列时特别有用 *对于使用不同参数创建新问题(而不是修改缓存),请使用 翻拍优化问题 相反,