Сила Джулии НЛопт останавливается перед первой итерацией - PullRequest
2 голосов
/ 09 марта 2020

Я использую NLopt для ограниченной задачи максимизации. Независимо от алгоритма или начальных значений, программа оптимизации принудительно останавливается еще до первой итерации (или я так полагаю, потому что она дает мне начальное значение). Я прикрепил свой код здесь. Я пытаюсь найти вероятности, связанные с сеткой, так что функция максимизируется при некоторых ограничениях. Любая помощь приветствуется.

uk = x -> x^0.5

function objective(u,p,grd)
    -p'*u.(grd)
end

function c3(grd,p)
    c =[]
    d =[]
    for i=1:length(grd)
        push!(c,quadgk(x -> (i-x)*(x <= i ? 1 : 0),0,1)[1])
        push!(d,sum(p[1:i]'*(grd[1:i] .- grd[i])))
    end
    return append!(d-c,-p)
end

function c4(grd,p)
    return (grd .* p)-quadgk(x,0,1)
end

grd = n -> collect(0:1/n:1)

opt = Opt(:LD_SLSQP,11)

inequality_constraint!(opt, p -> c3(grd(10),p))
inequality_constraint!(opt, p -> -p)
equality_constraint!(opt, p -> sum(p)-1)
equality_constraint!(opt, p -> c4(grd(10),p))


opt.min_objective =  p -> objective(-uk, p, grd(10))

k = push!(ones(11)*(1/11))
(minf,minx,ret) = optimize(opt, k)

1 Ответ

0 голосов
/ 09 марта 2020

Я не являюсь разработчиком julia, но я знаю это только, если вам нужен выход до завершения l oop, потому что это не ваш лучший выбор, вам нужно немного поработать с переменной sentinel.

здесь у вас есть статья, которая объясняет вам, как работает дозорный, и здесь у вас есть пример julia, который меняет ваш на некоторое время на дозорного, который выходит после третьего l oop

i = 1
third = 0

while i < length(grd) && third != 1
    # of course you need change this, it is only an example that will exit in the 3 loop 
    if i == 3
        third = 1
    end
    push!(c,quadgk(x -> (i-x)*(x <= i ? 1 : 0),0,1)[1])
    push!(d,sum(p[1:i]'*(grd[1:i] .- grd[i])))
    i += 1
end
...