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(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)

我不是julia开发人员,但我只知道,如果你需要在完成循环之前退出,因为这不是你的最佳选择,你需要用sentinel变量做一段时间。

这里有一篇文章向你解释《哨兵》是如何运作的这里有一个julia的例子,用一个在第三个循环后退出的sentinel将for更改为while

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

相关内容

  • 没有找到相关文章

最新更新