I have problem with the Augmented Lagrangian Method. With my syntax algorithm does not move and gets a forced stop. I am almost sure problem is with the setting of the local optimizer. I am not very familiar with the Julia syntax. let me give you my code:
function myFunc(x::Vector, grad::Vector, cost::Vector)
if length(grad) > 0
grad[1:22500] = cost
grad[22501:22650] = 1000000*x[22501:22650] ./ (10000*x[22501:22650].^2 .+ 1).^2
end
return sum(cost.*x[1:22500]) + 50*sum(10*x[22501:22650].^2 ./ (10*x[22501:22650] .+ 0.001))
end
function inEQ_1(x::Vector, grad::Vector, index_x, index_y)
if length(grad) > 0
grad[150*(index_x-1) + index_y] = 1
grad[22500 + index_y] = -1
grad[Not(150*(index_x-1) + index_y, 22500 + index_y)] .= 0
end
x[150*(index_x-1) + index_y] - x[22500 + index_y]
end
function EQ_1(x::Vector, grad::Vector, index_x)
if length(grad) > 0
grad[150*(index_x-1)+1:150*index_x] .= 1
grad[Not(150*(index_x-1)+1:150*index_x)] .= 0
end
sum(x[150*(index_x-1)+1:150*index_x]) - 1
end
function EQ_k(x::Vector, grad::Vector)
if length(grad) > 0
grad[1:22500] .= 0
grad[22501:22650] .= 1
end
sum(grad[22501:22650]) - 3
end
opt = Opt(:LD_AUGLAG_EQ, 22650)
opt.lower_bounds = 0
opt.upper_bounds = 1
opt.xtol_rel = 1e-4
min_objective!(opt, (x, grad) -> myFunc(x,grad,cost))
opt.local_optimizer = Opt(:LD_MMA, 22650)
for i in 1:150
for j in 1:150
inequality_constraint!(opt, (x,g) -> inEQ_1(x,g,j,i), 1e-8)
end
end
for i in 1:150
equality_constraint!(opt, (x,g) -> EQ_1(x,g,i), 1e-8)
end
equality_constraint!(opt, (x,g) -> EQ_k(x,g), 1e-8)
(minf,minx,ret) = optimize(opt, zeros(22650) .+ 1/150)
This gives me the output:
(Inf, [0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667 … 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667, 0.006666666666666667], :FORCED_STOP)
These values are the starting point. Could you please show me how to code this correctly. I believe minor changes are required but I don’t know what they are