2016-06-09 2 views
3

Кто-нибудь знает, работает ли NLopt с одномерной оптимизацией. Пытался запустить следующий код: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 

Если это не возможно, кто-нибудь знает, если одномерный оптимизатор, где я могу указать границы и начальное условие?

ответ

7

Есть несколько вещей, которые вам не хватает здесь.

  1. Вам нужно указать градиент (то есть первую производную) вашей функции внутри функции. См. Руководство и примеры на github page для NLopt. Не все алгоритмы оптимизации требуют этого, но тот, который вы используете LD_MMA, выглядит так. См. here для перечисления различных алгоритмов и требующих градиента.
  2. Вы должны указать допуск для условий, которые вам нужны, прежде чем вы «объявите победу» ¹ (т. Е. Решите, что функция достаточно оптимизирована). Это xtol_rel!(opt,1e-4) в приведенном ниже примере. См. Также ftol_rel! для другого способа указать другое условие допуска. Согласно документации, например, xtol_rel «остановится, когда шаг оптимизации (или оценка оптимального) изменяет каждый параметр меньше, чем tol, умноженный на абсолютное значение параметра». и ftol_rel будет «останавливаться, когда шаг оптимизации (или оценка оптимального) изменяет целевое значение функции меньше, чем tol, умноженное на абсолютное значение значения функции». См. here в разделе «Критерии остановки» для получения дополнительной информации о различные варианты здесь.
  3. Функция, которую вы оптимизируете, должна иметь одномерный выход. В вашем примере ваш вывод является вектором (хотя и длиной 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)") 

¹ (В словах оптимизации большого Аинят Ой.)

Смежные вопросы