Heuristic: Use max/min instead of sum for demand, storage, disposal

feature/composition
Alinson S. Xavier 1 year ago
parent 94c77bd1c5
commit 5888368504
Signed by: isoron
GPG Key ID: 0DA8E4B9E1109DCA

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

Loading…
Cancel
Save