首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单变量优化的NLopt

单变量优化的NLopt
EN

Stack Overflow用户
提问于 2016-06-09 18:36:26
回答 1查看 548关注 0票数 3

任何人都知道NLopt是否适用于单变量优化。试图运行以下代码:

代码语言:javascript
复制
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)")

但是获得以下错误消息:

代码语言:javascript
复制
> 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

如果这是不可能的,有没有人知道如果单变量优化器,我可以指定边界和初始条件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 21:13:44

你在这里遗漏了一些东西。

  1. 您需要在函数中指定函数的梯度(即一阶导数)。请参阅github页面 for NLopt上的教程和示例。并不是所有的优化算法都需要这一点,但是使用LD_MMA的算法看起来是这样的。有关需要梯度的各种算法的列表,请参见这里
  2. 在“宣告胜利”之前,您应该指定对所需条件的容忍度(即决定函数是否得到充分优化)。这是下面示例中的xtol_rel!(opt,1e-4)。还请参阅ftol_rel!,以获得另一种指定不同公差条件的方法。例如,根据文档,当优化步骤(或最优估计)更改每个参数小于tol乘以参数的绝对值时,xtol_rel将停止。当优化步骤(或最优估计)将目标函数值小于tol乘以函数值的绝对值时,ftol_rel将停止。有关各种选项的更多信息,请参见“停止标准”部分下的这里
  3. 您正在优化的函数应该具有一维输出。在您的示例中,您的输出是一个向量(尽管长度为1)。(输出中的x.^2表示向量操作和向量输出)。如果你的“目标函数”没有最终输出一个一维数,那么它就不清楚你的优化目标是什么(例如,最小化一个向量意味着什么?不清楚,例如,你可以最小化一个向量的范数,但是一个完整的向量--它不清楚)。

下面是一个基于您的代码的工作示例。请注意,我在github页面上包含了示例的打印输出,这有助于您诊断问题。

代码语言:javascript
复制
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)")

(用最优化的话说,伟大的引余叶)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37733740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档