奥普蒂姆。jl
|
该页面正在翻译中。 |
脧锚脧赂`Optim的`是Julia包实现各种算法来执行单变量和多变量优化。
安装:OptimizationOptimJL。jl
要使用此包,请安装OptimizationOptimJL包:
import Pkg;
Pkg.add("OptimizationOptimJL");
方法
奥普蒂姆。jl 算法可以是以下之一:
* 奥普蒂姆。内尔德米德(NelderMead)
* 奥普蒂姆。模拟退火()
* 奥普蒂姆。刨花板()
* 奥普蒂姆。ConjugateGradient()
* 奥普蒂姆。渐变色()
* 奥普蒂姆。BFGS()
* 奥普蒂姆。LBFGS()
* 奥普蒂姆。NGMRES()
* 奥普蒂姆。OACCEL()
* 奥普蒂姆。纽顿区()
* 奥普蒂姆。牛顿()
* 奥普蒂姆。KrylovTrustRegion()
* 奥普蒂姆。刨花板()
* 奥普蒂姆。萨明()
每个优化器还需要特殊参数,这些参数在下面的部分中概述。
下面的特殊关键字参数,这些参数不包括在公共参数中 解决方案 参数可以与Optim一起使用。jl优化器:
* x_tol:输入向量变化的绝对容差 x,在无穷范数。 默认值为 0.0.
* g_tol:梯度中的绝对公差,在无穷范数中。 默认值为 1e-8. 对于无梯度方法,这将控制主收敛容差,这是求解器特定的。
* f_calls_limit:客观调用次数的软上限。 默认值为 0 (无限)。
* g_calls_limit:渐变调用次数的软上限。 默认值为 0 (无限)。
* h_calls_limit:Hessian调用次数的软上限。 默认值为 0 (无限)。
* allow_f_increases:允许增加目标值的步骤。 默认值为 错误. 请注意,当将其设置为 真的,即使目标增加,最后一次迭代也将作为最小化器返回。
* store_trace:应该存储优化算法状态的痕迹吗? 默认值为 错误.
* 显示_trace:优化算法的状态是否应该显示在 标准输出? 默认值为 错误.
* 扩展_trace:保存附加信息。 求解器依赖。 默认值为 错误.
* trace_传真:在跟踪中包含完整的单纯形 内尔德米德. 默认值为 错误.
* 显示/显示:跟踪输出打印每 显示/显示次迭代。
有关所有算法和选项的更广泛文档,请参阅https://julianlsolvers.github.io/Optim.jl/stable/#[文件]
本地优化器
局部约束
奥普蒂姆。jl 实现以下局部约束算法:
*奥普蒂姆。IPNewton()
** `μ0` 将初始障碍惩罚系数指定为数字或 `:自动`
** `show_linesearch` 是打开linesearch冗长的选项。
**默认值:
*** `linesearch::Function=Optim。backtrack_constrained_grad`
*** `μ0::联合{Symbol,Number} =:自动`
*** `show_linesearch::Bool=false`
具有约束的Rosenbrock函数可以使用 奥普蒂姆。IPNewton() 如下:
using Optimization, OptimizationOptimJL
rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
cons = (res, x, p) -> res .= [x[1]^2 + x[2]^2]
x0 = zeros(2)
p = [1.0, 100.0]
prob = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff(); cons = cons)
prob = Optimization.OptimizationProblem(prob, x0, p, lcons = [-5.0], ucons = [10.0])
sol = solve(prob, IPNewton())
retcode: Success
u: 2-element Vector{Float64}:
0.9999999992669327
0.9999999985109471
另请参阅 奥普蒂姆。jl 记录https://julianlsolvers.github.io/Optim.jl/stable/#examples/generated/ipnewton_basics/[非线性约束优化]使用示例 IPNewton.
无衍生品
无导数优化器是即使在没有指定导数或自动微分的情况下也可以使用的优化器。 虽然它们往往比基于导数的优化器效率低,但它们可以很容易地应用于定义导数很困难的情况。 请注意,虽然这些方法不支持一般约束,但所有方法都支持通过 磅/磅 和 ub 在 优化。优化问题.
奥普蒂姆。jl 实现以下无导数算法:
*奥普蒂姆。内尔德米德(NelderMead):*Nelder-Mead优化器*
** `解决(问题,NelderMead(参数,initial_simplex))`
** `参数=AdaptiveParameters()` 或 `参数=FixedParameters()`
** `initial_simplex=AffineSimplexer()`
**默认值:
*** `参数=AdaptiveParameters()`
*** `initial_simplex=AffineSimplexer()`
*奥普蒂姆。模拟退火():*模拟退火*
** `解决(问题,SimulatedAnnealing(邻居,T,p))`
** `邻居` 是当前和提出的突变函数 `x`
** `T` 是返回温度的当前迭代的函数
** `p` 是当前温度的函数
**默认值:
*** `邻居=default_neighbor!`
*** `T=default_temperature`
*** `p=柯克帕特里克`
*奥普蒂姆。刨花板()
Rosenbrock函数可以使用 奥普蒂姆。内尔德米德(NelderMead) 如下:
using Optimization, OptimizationOptimJL
rosenbrock(x, p) = (1 - x[1])^2 + 100 * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]
prob=优化。OptimizationProblem(rosenbrock,x0,p)
sol=solve(prob,Optim.NelderMead())
retcode: Success
u: 2-element Vector{Float64}:
0.9999634355313174
0.9999315506115275
基于梯度的
基于梯度的优化器是利用基于定义的导数或自动微分的梯度信息的优化器。
奥普蒂姆。jl 实现以下基于梯度的算法:
*奥普蒂姆。ConjugateGradient():*共轭梯度下降*
** `解决(问题,ConjugateGradient(alphaguess,linesearch,eta,P,precondprep))`
** `阿尔法,阿尔法` 计算初始步长(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_initialstep.html[本例])
***可用的初始步长程序:
*** `最初的,最初的`
*** `初始静压`
*** `首张`
*** `InitialQuadratic碌录潞陆`
*** `初始交换`
** `线研究` 指定行搜索算法(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_linesearch.html[本例])
***可用的线路搜索算法:
*** `海格张`
*** `更多,更多`
*** `回溯`
*** `强者,强者` *** `静态`
** `埃塔` 确定下一步方向
** `P` 是可选的先决条件(有关详细信息,请参阅https://julianlsolvers.github.io/Optim.jl/v0.9.3/algo/precondition/[此来源])
** `预置,预置` 用于更新 `P` 作为状态变量 `x` 变化
**默认值:
*** `alphaguess=LineSearches.首哈格尔章()`
*** `linesearch=LineSearches。哈格尔章(HagerZhang)`
*** `埃塔=0.4`
*** `P=无`
*** `+precondprep=(P,x)->无+`
*奥普蒂姆。渐变色():*梯度下降(一个准牛顿求解器)*
** `解决(问题,渐变(alphaguess,linesearch,P,precondprep))`
** `阿尔法,阿尔法` 计算初始步长(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_initialstep.html[本例])
***可用的初始步长程序:
*** `最初的,最初的`
*** `初始静压`
*** `首张`
*** `InitialQuadratic碌录潞陆`
*** `初始交换`
** `线研究` 指定行搜索算法(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_linesearch.html[本例])
***可用的线路搜索算法:
*** `海格张`
*** `更多,更多`
*** `回溯`
*** `强者,强者`
*** `静态`
** `P` 是可选的先决条件(有关详细信息,请参阅https://julianlsolvers.github.io/Optim.jl/v0.9.3/algo/precondition/[此来源])
** `预置,预置` 用于更新 `P` 作为状态变量 `x` 变化
**默认值:
*** `alphaguess=LineSearches.初始值()`
*** `linesearch=LineSearches。哈格尔章(HagerZhang)`
*** `P=无` *** `+precondprep=(P,x)->无+`
*奥普蒂姆。BFGS():*Broyden-Fletcher-Goldfarb-Shanno算法*
** `解决(问题,BFGS(alphaguess,linesearch,initial_invH,initial_stepnorm,流形))`
** `阿尔法,阿尔法` 计算初始步长(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_initialstep.html[本例])
***可用的初始步长程序:
*** `最初的,最初的`
*** `初始静压`
*** `首张`
*** `InitialQuadratic碌录潞陆`
*** `初始交换`
** `线研究` 指定行搜索算法(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_linesearch.html[本例])
***可用的线路搜索算法:
*** `海格张`
*** `更多,更多`
*** `回溯`
*** `强大的力量`
*** `静态`
** `初始值_invh` 指定可选的初始矩阵
** `初始值_stepnorm` 确定 `初始值_invh` 是按以下值缩放的单位矩阵 `初始值_stepnorm` 乘以初始点梯度的sup-范数
** `歧管,歧管` 指定要最小化函数的(黎曼)流形(有关更多信息,请参阅https://julianlsolvers.github.io/Optim.jl/stable/algo/manifolds/[此来源])
***可用歧管:
*** `单位`
*** `球体,球体`
*** `斯蒂菲尔`
***元流形:
*** `[医]粉末状`
*** `产品及产品`
***自定义流形
**默认值:
*** `alphaguess=LineSearches.初始静压()`
*** `linesearch=LineSearches。哈格尔章(HagerZhang)`
*** `initial_invH=无` *** `initial_stepnorm=无`
*** `歧管=平()`
*奥普蒂姆。LBFGS():*有限内存Broyden-Fletcher-Goldfarb-Shanno算法*
** `m` 是历史点数
** `阿尔法,阿尔法` 计算初始步长(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_initialstep.html[本例])
***可用的初始步长程序:
*** `最初的,最初的`
*** `初始静压`
*** `首张`
*** `InitialQuadratic碌录潞陆`
*** `初始交换`
** `线研究` 指定行搜索算法(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_linesearch.html[本例])
***可用的线路搜索算法:
*** `海格张`
*** `更多,更多`
*** `回溯`
*** `强者,强者`
*** `静态`
** `P` 是可选的先决条件(有关详细信息,请参阅https://julianlsolvers.github.io/Optim.jl/v0.9.3/algo/precondition/[此来源])
** `预置,预置` 用于更新 `P` 作为状态变量 `x` 变化
** `歧管,歧管` 指定要最小化函数的(黎曼)流形(有关更多信息,请参阅https://julianlsolvers.github.io/Optim.jl/stable/algo/manifolds/[此来源])
***可用歧管:
*** `单位`
*** `球体,球体`
*** `斯蒂菲尔`
***元流形:
*** `[医]粉末状`
*** `产品及产品`
***自定义流形
** `标量,标量`:是否缩放初始Hessian近似值
**默认值:
*** `m=10` *** `alphaguess=LineSearches.初始静压()`
*** `linesearch=LineSearches。哈格尔章(HagerZhang)`
*** `P=没有`
*** `+precondprep=(P,x)->无+`
*** `歧管=平()`
*** `scaleinvH0::Bool=true&&(P isa Nothing)`
*奥普蒂姆。NGMRES()
*奥普蒂姆。OACCEL()
Rosenbrock函数可以使用 奥普蒂姆。LBFGS() 如下:
using Optimization, OptimizationOptimJL
rosenbrock(x, p) = (1 - x[1])^2 + 100 * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]
optprob = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = Optimization.OptimizationProblem(optprob, x0, p, lb = [-1.0, -1.0], ub = [0.8, 0.8])
sol = solve(prob, Optim.LBFGS())
retcode: Success
u: 2-element Vector{Float64}:
0.799999998888889
0.639999998209689
基于Hessian的二阶
基于Hessian的优化方法是使用Hessian直接计算的二阶优化方法。 这些可以更快地收敛,但需要快速和准确的方法来计算Hessian,以便是适当的。
奥普蒂姆。jl 实现以下基于hessian的算法:
*奥普蒂姆。纽顿区():*牛顿信任区域法*
** `初始值_delta`:起始信任区域半径
** `德尔塔*哈特`:允许的最大信任区域半径
** `埃塔`:当rho至少是eta时,接受步骤。
** `[医]花`:当rho小于rho_lower时,收缩信任区域。
** `[医]罗氏`:当rho大于rho_upper时,增加信任区域(尽管不大于delta_hat)。
**默认值:
*** `initial_delta=1.0`
*** `delta_hat=100.0`
*** `埃塔=0.1`
*** `rho_lower=0.25`
*** `rho_upper=0.75`
*奥普蒂姆。牛顿():*牛顿法与线搜索*
** `阿尔法,阿尔法` 计算初始步长(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_initialstep.html[本例])
***可用的初始步长程序:
*** `最初的,最初的`
*** `初始静压`
*** `首张`
*** `InitialQuadratic碌录潞陆`
*** `初始交换`
** `线研究` 指定行搜索算法(有关详细信息,请参阅https://github.com/JuliaNLSolvers/LineSearches.jl[本来源]及https://julianlsolvers.github.io/LineSearches.jl/latest/examples/generated/optim_linesearch.html[本例])
***可用的线路搜索算法:
*** `海格张`
*** `更多,更多`
*** `回溯`
*** `强者,强者`
*** `静态`
**默认值:
*** `alphaguess=LineSearches.初始静压()` *** `linesearch=LineSearches。哈格尔章(HagerZhang)`
Rosenbrock函数可以使用 奥普蒂姆。牛顿() 如下:
using Optimization, OptimizationOptimJL, ModelingToolkit
rosenbrock(x, p) = (1 - x[1])^2 + 100 * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]
f = OptimizationFunction(rosenbrock, Optimization.AutoSymbolics())
prob = Optimization.OptimizationProblem(f, x0, p)
sol = solve(prob, Optim.Newton())
retcode: Success
u: 2-element Vector{Float64}:
0.9999999999999994
0.9999999999999989
Hessian-免费第二订单
Hessian-free方法是通过直接计算Hessian-vector产品来执行二阶优化的方法(高压)而无需建造完整的黑森。 因此,这些方法可以很好地执行大型二阶优化问题,但在考虑Hessian的调理时可能需要特殊情况。
奥普蒂姆。jl 实现以下无hessian算法:
* 奥普蒂姆。KrylovTrustRegion():*具有信任区域的Newton-Krylov方法*
** `初始值_delta`:起始信任区域半径
** `德尔塔*哈特`:允许的最大信任区域半径
** `埃塔`:当rho至少是eta时,接受步骤。 ** `[医]花`:当rho小于rho_lower时,收缩信任区域。
** `[医]罗氏`:当rho大于rho_upper时,增加信任区域(尽管不大于delta_hat)。
**默认值:
*** `initial_delta=1.0`
*** `delta_hat=100.0`
*** `埃塔=0.1`
*** `rho_lower=0.25`
*** `rho_upper=0.75`
Rosenbrock函数可以使用 奥普蒂姆。KrylovTrustRegion() 如下:
using Optimization, OptimizationOptimJL
rosenbrock(x, p) = (1 - x[1])^2 + 100 * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]
optprob = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = Optimization.OptimizationProblem(optprob, x0, p)
sol = solve(prob, Optim.KrylovTrustRegion())
retcode: Success
u: 2-element Vector{Float64}:
0.999999999999108
0.9999999999981819
全局优化器
无约束方程
以下方法在https://github.com/JuliaNLSolvers/Optim.jl[脧锚脧赂`Optim的`]对有或没有框约束的问题执行全局优化。 它的工作原理与和没有下限和上限设置 磅/磅 和 ub 在 优化。优化问题.
*奥普蒂姆。刨花板():*粒子群优化*
** `解决(问题,ParticleSwarm(lower,upper,n_particles))`
** `较低`/`上,上` 分别是下界/上界的向量
** `n_颗粒` 是群中的粒子数
**默认为: `下=[]`, `上=[]`, `n_颗粒=0`
Rosenbrock函数可以使用 奥普蒂姆。刨花板() 如下:
using Optimization, OptimizationOptimJL
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, Optim.ParticleSwarm(lower = prob.lb, upper = prob.ub, n_particles = 100))
retcode: Failure
u: 2-element Vector{Float64}:
1.0
1.0
用约束方程
以下方法在https://github.com/JuliaNLSolvers/Optim.jl[脧锚脧赂`Optim的`]对具有框约束的问题执行全局优化。
*奥普蒂姆。萨明():*带边界的模拟退火*
** `解决(问题,SAMIN(nt,ns,rt,neps,f_tol,x_tol,coverage_ok,verbosity))`
**默认值:
*** `nt=5`
*** `ns=5`
*** `rt=0.9`
*** `棉结=5`
*** `f_tol=1e-12`
*** `x_tol=1e-6`
*** `coverage_ok=错误`
*** `详细=0`
Rosenbrock函数可以使用 奥普蒂姆。萨明() 如下:
using Optimization, OptimizationOptimJL
rosenbrock(x, p) = (1 - x[1])^2 + 100 * (x[2] - x[1]^2)^2
x0 = zeros(2)
p = [1.0, 100.0]
f = OptimizationFunction(rosenbrock, Optimization.AutoForwardDiff())
prob = Optimization.OptimizationProblem(f, x0, p, lb = [-1.0, -1.0], ub = [1.0, 1.0])
sol = solve(prob, Optim.SAMIN())
retcode: Failure
u: 2-element Vector{Float64}:
0.9464678437495901
0.8933571780479223