Julia NLopt力在第一次迭代之前停止

Julia NLopt力在第一次迭代之前停止,julia,nlopt,Julia,Nlopt,我用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(g

我用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)
uk=x->x^0.5
功能目标(u、p、grd)
-p'*u.(grd)
结束
职能c3(grd,p)
c=[]
d=[]
对于i=1:长度(grd)

推(c,quadgk(x->(i-x)*(x我不是julia开发人员,但我只知道这一点,如果您需要在完成循环之前退出,因为这不是您的最佳选择,您需要使用sentinel变量执行一段时间

你有一篇文章解释了哨兵是如何工作的 这里有一个julia的例子,在第三个循环结束后,用一个哨兵将你的时间改为一段时间

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
i=1
第三=0
而我<长度(grd)&第三个!=1
#当然,您需要改变这一点,这只是一个将在3循环中退出的示例
如果i==3
第三个=1
结束
推