Оптимизация СМО
Автор
function opti8(Aeq, Beq, Lambda0, A, B, Mu, nFlows)
nVars = length(Lambda0)
model = Model(Ipopt.Optimizer)
set_optimizer_attribute(model, "max_iter", 2^18)
set_optimizer_attribute(model, "constr_viol_tol", 2.0^-32)
set_optimizer_attribute(model, "tol", 2.0^-32)
@variable(model, x[1:nVars])
for i in 1:nVars
set_start_value(x[i], Lambda0[i])
end
@NLobjective(model, Min,
sum(
(sum(x[length(Mu) * j + i] for j in 0:nFlows-1)) /
(Mu[i] - sum(x[length(Mu) * j + i] for j in 0:nFlows-1))
for i in 1:length(Mu)
)
)
if !isempty(Aeq)
for i in 1:size(Aeq, 1)
@constraint(model, sum(Aeq[i,j] * x[j] for j in 1:size(Aeq, 2)) == Beq[i])
end
end
if !isempty(A)
for i in 1:size(A, 1)
@constraint(model, sum(A[i,j] * x[j] for j in 1:size(A, 2)) <= B[i])
end
end
for i in 1:nVars
@constraint(model, x[i] >= Lambda0[i])
end
optimize!(model)
T = (termination_status(model) == MOI.OPTIMAL ||
termination_status(model) == MOI.LOCALLY_SOLVED)
Lambda = value.(x)
N = objective_value(model)
return T, Lambda, N
end