|
|
|
@ -530,15 +530,15 @@ function compress(original::Instance)::Instance
|
|
|
|
|
(s, 1) => sum([original.m_emission[s, t] for t in T]) for s in original.emissions
|
|
|
|
|
)
|
|
|
|
|
m_init = Dict(
|
|
|
|
|
(q, r, c, 1) => sum([original.m_init[q, r, c, t] for t in T]) for
|
|
|
|
|
(q, r, c, 1) => length(T) * maximum([original.m_init[q, r, c, t] for t in T]) for
|
|
|
|
|
q in original.centers for r in q.prod_out for c in r.comp
|
|
|
|
|
)
|
|
|
|
|
m_plant_disp = Dict(
|
|
|
|
|
(p, r, 1) => sum([original.m_plant_disp[p, r, t] for t in T]) for
|
|
|
|
|
(p, r, 1) => length(T) * minimum([original.m_plant_disp[p, r, t] for t in T]) for
|
|
|
|
|
p in original.plants for r in p.prod_out
|
|
|
|
|
)
|
|
|
|
|
m_store = Dict(
|
|
|
|
|
(q, r, 1) => sum([original.m_store[q, r, t] for t in T]) for
|
|
|
|
|
(q, r, 1) => length(T) * minimum([original.m_store[q, r, t] for t in T]) for
|
|
|
|
|
q in original.centers for r in q.prod_out
|
|
|
|
|
)
|
|
|
|
|
return Instance(;
|
|
|
|
@ -575,7 +575,7 @@ function benchmark_compress(filename, optimizer; max_centers = [Inf], max_plants
|
|
|
|
|
# Solve original
|
|
|
|
|
orig = read_json(filename; max_centers=mc, max_plants=mp)
|
|
|
|
|
reset_timer!()
|
|
|
|
|
model_orig, stats_orig = solve(orig; optimizer)
|
|
|
|
|
_, stats_orig = solve(orig; optimizer)
|
|
|
|
|
stats_orig["Filename"] = filename
|
|
|
|
|
stats_orig["Method"] = "Original"
|
|
|
|
|
push!(stats, stats_orig)
|
|
|
|
@ -617,6 +617,7 @@ end
|
|
|
|
|
function solve(data::Instance; optimizer, output_dir=nothing, heuristic=false)
|
|
|
|
|
|
|
|
|
|
if heuristic
|
|
|
|
|
@info "Solving compressed instance..."
|
|
|
|
|
comp_data = compress(data)
|
|
|
|
|
comp_model, comp_stats = solve(comp_data; optimizer, heuristic=false)
|
|
|
|
|
|
|
|
|
@ -686,7 +687,6 @@ function solve(data::Instance; optimizer, output_dir = nothing, heuristic = fals
|
|
|
|
|
function push_edge!(src, dst, r)
|
|
|
|
|
e = (src, dst, r)
|
|
|
|
|
if data.selected_edges !== nothing && e ∉ data.selected_edges
|
|
|
|
|
@info "Skipping: $(src.name) $(dst.name) $(r.name)"
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
push!(E, e)
|
|
|
|
@ -724,6 +724,25 @@ function solve(data::Instance; optimizer, output_dir = nothing, heuristic = fals
|
|
|
|
|
@printf(" %8d time periods\n", length(T))
|
|
|
|
|
@printf(" %8d transportation edges\n", length(E))
|
|
|
|
|
|
|
|
|
|
available = Dict((r, t) => 0.0 for r in data.products, t in T)
|
|
|
|
|
for q in centers, t in T
|
|
|
|
|
for r in q.prod_out, s in r.comp
|
|
|
|
|
available[r, t] += data.m_init[q, r, s, t]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
capacity = Dict(r => 0.0 for r in data.products)
|
|
|
|
|
for p in plants
|
|
|
|
|
capacity[p.prod_in] += data.m_cap[p]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for r in products, t in T
|
|
|
|
|
if available[r, t] > capacity[r]
|
|
|
|
|
@warn "Not enough capacity to process $(r.name) at time $t: $(available[r,t]) > $(capacity[r])"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Decision variables
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
@timeit "Model: Add variables" begin
|
|
|
|
|