任何人都知道 NLopt 是否适用于单变量优化。尝试运行以下代码:
using NLopt
function myfunc(x, grad)
x.^2
end
opt = Opt(:LD_MMA, 1)
min_objective!(opt, myfunc)
(minf,minx,ret) = optimize(opt, [1.234])
println("got $minf at $minx (returned $ret)")
但收到以下错误消息:
> Error evaluating untitled
LoadError: BoundsError: attempt to access 1-element Array{Float64,1}:
1.234
at index [2]
in myfunc at untitled:8
in nlopt_callback_wrapper at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:415
in optimize! at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:514
in optimize at /Users/davidzentlermunro/.julia/v0.4/NLopt/src/NLopt.jl:520
in include_string at loading.jl:282
in include_string at /Users/davidzentlermunro/.julia/v0.4/CodeTools/src/eval.jl:32
in anonymous at /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:84
in withpath at /Users/davidzentlermunro/.julia/v0.4/Requires/src/require.jl:37
in withpath at /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:53
[inlined code] from /Users/davidzentlermunro/.julia/v0.4/Atom/src/eval.jl:83
in anonymous at task.jl:58
while loading untitled, in expression starting on line 13
如果这是不可能的,有谁知道我是否可以指定边界和初始条件的单变量优化器?
您在这里缺少一些东西。
- 您需要在函数内指定函数的梯度(即一阶导数)。请参阅教程和示例github页面 https://github.com/JuliaOpt/NLopt.jl对于NLopt。并非所有优化算法都需要这一点,但您正在使用的优化算法需要这一点
LD_MMA
看起来确实如此。看here http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms列出了需要梯度的各种算法。
- 在“宣布胜利”之前,您应该指定所需条件的容差(即确定该函数已充分优化)。这是
xtol_rel!(opt,1e-4)
在下面的例子中。另请参阅ftol_rel!
另一种指定不同容差条件的方法。根据文档,例如,xtol_rel
将“当优化步骤(或最佳估计)对每个参数的改变小于 tol 乘以参数的绝对值时停止。”和ftol_rel
将“当优化步骤(或最佳估计)使目标函数值改变小于 tol 乘以函数值的绝对值时停止。”参见here http://ab-initio.mit.edu/wiki/index.php/NLopt_Reference在“停止标准”部分下,了解有关此处各种选项的更多信息。
- 您正在优化的函数应该具有一维输出。在您的示例中,您的输出是一个向量(尽管长度为 1)。 (
x.^2
输出中的 表示向量运算和向量输出)。如果您的“目标函数”最终没有输出一维数,那么就不清楚您的优化目标是什么(例如,最小化向量是什么意思?不清楚,您可以最小化向量的范数,例如,但整个向量 - 目前尚不清楚)。
下面是一个基于您的代码的工作示例。请注意,我在 github 页面上包含了示例的打印输出,这可以帮助您诊断问题。
using NLopt
count = 0 # keep track of # function evaluations
function myfunc(x::Vector, grad::Vector)
if length(grad) > 0
grad[1] = 2*x[1]
end
global count
count::Int += 1
println("f_$count($x)")
x[1]^2
end
opt = Opt(:LD_MMA, 1)
xtol_rel!(opt,1e-4)
min_objective!(opt, myfunc)
(minf,minx,ret) = optimize(opt, [1.234])
println("got $minf at $minx (returned $ret)")
1(用优化大师 Yinyu Ye 的话说。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)