mirror of
https://github.com/ANL-CEEESA/RELOG.git
synced 2025-12-05 23:38:52 -06:00
Heuristic: Use max/min instead of sum for demand, storage, disposal
This commit is contained in:
29
model-3.jl
29
model-3.jl
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user