|
|
@ -10,16 +10,19 @@ function optimize!(model::JuMP.Model, method::XavQiuWanThi2019.Method)::Nothing
|
|
|
|
JuMP.set_optimizer_attribute(model, "MIPGap", gap)
|
|
|
|
JuMP.set_optimizer_attribute(model, "MIPGap", gap)
|
|
|
|
@info @sprintf("MIP gap tolerance set to %f", gap)
|
|
|
|
@info @sprintf("MIP gap tolerance set to %f", gap)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for sc in model[:instance].scenarios
|
|
|
|
initial_time = time()
|
|
|
|
large_gap = false
|
|
|
|
large_gap = false
|
|
|
|
has_transmission = (length(sc.isf) > 0)
|
|
|
|
has_transmission = false
|
|
|
|
|
|
|
|
for sc in model[:instance].scenarios
|
|
|
|
|
|
|
|
if length(sc.isf) > 0
|
|
|
|
|
|
|
|
has_transmission = true
|
|
|
|
|
|
|
|
end
|
|
|
|
if has_transmission && method.two_phase_gap
|
|
|
|
if has_transmission && method.two_phase_gap
|
|
|
|
set_gap(1e-2)
|
|
|
|
set_gap(1e-2)
|
|
|
|
large_gap = true
|
|
|
|
large_gap = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
JuMP.optimize!(model)
|
|
|
|
end
|
|
|
|
while true
|
|
|
|
while true
|
|
|
|
initial_time = time()
|
|
|
|
|
|
|
|
time_elapsed = time() - initial_time
|
|
|
|
time_elapsed = time() - initial_time
|
|
|
|
time_remaining = method.time_limit - time_elapsed
|
|
|
|
time_remaining = method.time_limit - time_elapsed
|
|
|
|
if time_remaining < 0
|
|
|
|
if time_remaining < 0
|
|
|
@ -33,14 +36,41 @@ function optimize!(model::JuMP.Model, method::XavQiuWanThi2019.Method)::Nothing
|
|
|
|
JuMP.set_time_limit_sec(model, time_remaining)
|
|
|
|
JuMP.set_time_limit_sec(model, time_remaining)
|
|
|
|
@info "Solving MILP..."
|
|
|
|
@info "Solving MILP..."
|
|
|
|
JuMP.optimize!(model)
|
|
|
|
JuMP.optimize!(model)
|
|
|
|
|
|
|
|
|
|
|
|
has_transmission || break
|
|
|
|
has_transmission || break
|
|
|
|
violations = _find_violations(
|
|
|
|
|
|
|
|
|
|
|
|
@info "Verifying transmission limits..."
|
|
|
|
|
|
|
|
time_screening = @elapsed begin
|
|
|
|
|
|
|
|
violations = []
|
|
|
|
|
|
|
|
for sc in model[:instance].scenarios
|
|
|
|
|
|
|
|
push!(
|
|
|
|
|
|
|
|
violations,
|
|
|
|
|
|
|
|
_find_violations(
|
|
|
|
model,
|
|
|
|
model,
|
|
|
|
sc,
|
|
|
|
sc,
|
|
|
|
max_per_line = method.max_violations_per_line,
|
|
|
|
max_per_line = method.max_violations_per_line,
|
|
|
|
max_per_period = method.max_violations_per_period,
|
|
|
|
max_per_period = method.max_violations_per_period,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
@info @sprintf(
|
|
|
|
|
|
|
|
"Verified transmission limits in %.2f seconds",
|
|
|
|
|
|
|
|
time_screening
|
|
|
|
)
|
|
|
|
)
|
|
|
|
if isempty(violations)
|
|
|
|
|
|
|
|
|
|
|
|
violations_found = false
|
|
|
|
|
|
|
|
for v in violations
|
|
|
|
|
|
|
|
if !isempty(v)
|
|
|
|
|
|
|
|
violations_found = true
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if violations_found
|
|
|
|
|
|
|
|
for (i, v) in enumerate(violations)
|
|
|
|
|
|
|
|
_enforce_transmission(model, v, model[:instance].scenarios[i])
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
else
|
|
|
|
@info "No violations found"
|
|
|
|
@info "No violations found"
|
|
|
|
if large_gap
|
|
|
|
if large_gap
|
|
|
|
large_gap = false
|
|
|
|
large_gap = false
|
|
|
@ -48,9 +78,6 @@ function optimize!(model::JuMP.Model, method::XavQiuWanThi2019.Method)::Nothing
|
|
|
|
else
|
|
|
|
else
|
|
|
|
break
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
|
|
|
|
_enforce_transmission(model, violations, sc)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return
|
|
|
|
return
|
|
|
|