Debug model; improve reports

This commit is contained in:
2023-12-06 16:16:13 -06:00
parent 319e5f1ed3
commit ada89b7878
8 changed files with 1302 additions and 93 deletions

View File

@@ -1,5 +1,7 @@
module RELOG
_round(x::Number) = round(x, digits = 5)
include("instance/structs.jl")
include("instance/parse.jl")
include("model/jumpext.jl")

View File

@@ -119,12 +119,16 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
# Transportation cost
for (p1, p2, m) in E, t in T
add_to_expression!(obj, distances[p1, p2, m], y[p1.name, p2.name, m.name, t])
add_to_expression!(
obj,
distances[p1, p2, m] * m.tr_cost[t],
y[p1.name, p2.name, m.name, t],
)
end
# Center: Revenue
for c in centers, (p, m) in E_in[c], t in T
add_to_expression!(obj, c.revenue[t], y[p.name, c.name, m.name, t])
add_to_expression!(obj, -c.revenue[t], y[p.name, c.name, m.name, t])
end
# Center: Collection cost
@@ -240,7 +244,8 @@ function build_model(instance::Instance; optimizer, variable_names::Bool = false
eq_building_period = _init(model, :eq_building_period)
for p in plants, t in T
if t instance.building_period
eq_building_period[p.name, t] = @constraint(model, x[p.name, t] == 0)
eq_building_period[p.name, t] =
@constraint(model, x[p.name, t] - x[p.name, t-1] <= 0)
end
end

View File

@@ -11,14 +11,35 @@ function centers_report(model)::DataFrame
df."year" = Int[]
df."input product" = String[]
df."input amount (tonne)" = Float64[]
df."revenue (\$)" = Float64[]
df."operating cost (\$)" = Float64[]
centers = model.ext[:instance].centers
T = 1:model.ext[:instance].time_horizon
E_in = model.ext[:E_in]
for c in centers, t in T
input_name = (c.input === nothing) ? "" : c.input.name
input = round(value(model[:z_input][c.name, t]), digits = 3)
push!(df, [c.name, t, input_name, input])
input = value(model[:z_input][c.name, t])
if isempty(E_in[c])
revenue = 0
else
revenue = sum(
c.revenue[t] * value(model[:y][p.name, c.name, m.name, t]) for
(p, m) in E_in[c]
)
end
push!(
df,
[
c.name,
t,
input_name,
_round(input),
_round(revenue),
_round(c.operating_cost[t]),
],
)
end
return df
end
@@ -30,14 +51,37 @@ function center_outputs_report(model)::DataFrame
df."year" = Int[]
df."amount collected (tonne)" = Float64[]
df."amount disposed (tonne)" = Float64[]
df."collection cost (\$)" = Float64[]
df."disposal cost (\$)" = Float64[]
centers = model.ext[:instance].centers
T = 1:model.ext[:instance].time_horizon
E_out = model.ext[:E_out]
for c in centers, m in c.outputs, t in T
collected = round(value(model[:z_collected][c.name, m.name, t]), digits = 3)
disposed = round(value(model[:z_disp][c.name, m.name, t]), digits = 3)
push!(df, [c.name, m.name, t, collected, disposed])
collected = value(model[:z_collected][c.name, m.name, t])
disposed = value(model[:z_disp][c.name, m.name, t])
disposal_cost = c.disposal_cost[m][t] * disposed
if isempty(E_out[c])
collection_cost = 0
else
collection_cost = sum(
c.collection_cost[m][t] * value(model[:y][c.name, p.name, m.name, t])
for (p, m) in E_out[c]
)
end
push!(
df,
[
c.name,
m.name,
t,
_round(collected),
_round(disposed),
_round(collection_cost),
_round(disposal_cost),
],
)
end
return df
end

View File

@@ -11,6 +11,9 @@ function plants_report(model)::DataFrame
df."year" = Int[]
df."operational?" = Bool[]
df."input amount (tonne)" = Float64[]
df."opening cost (\$)" = Float64[]
df."fixed operating cost (\$)" = Float64[]
df."variable operating cost (\$)" = Float64[]
plants = model.ext[:instance].plants
T = 1:model.ext[:instance].time_horizon
@@ -18,8 +21,24 @@ function plants_report(model)::DataFrame
for p in plants, t in T
operational = JuMP.value(model[:x][p.name, t]) > 0.5
input = value(model[:z_input][p.name, t])
operational || continue
push!(df, [p.name, t, operational, input])
opening_cost = 0
if value(model[:x][p.name, t]) > 0.5 && value(model[:x][p.name, t-1]) < 0.5
opening_cost = p.capacities[1].opening_cost[t]
end
fix_operating_cost = (operational ? p.capacities[1].fix_operating_cost[t] : 0)
var_operating_cost = input * p.capacities[1].var_operating_cost[t]
push!(
df,
[
p.name,
t,
operational,
_round(input),
_round(opening_cost),
_round(fix_operating_cost),
_round(var_operating_cost),
],
)
end
return df
end
@@ -31,6 +50,7 @@ function plant_outputs_report(model)::DataFrame
df."year" = Int[]
df."amount produced (tonne)" = Float64[]
df."amount disposed (tonne)" = Float64[]
df."disposal cost (\$)" = Float64[]
plants = model.ext[:instance].plants
T = 1:model.ext[:instance].time_horizon
@@ -38,8 +58,11 @@ function plant_outputs_report(model)::DataFrame
for p in plants, m in keys(p.output), t in T
produced = JuMP.value(model[:z_prod][p.name, m.name, t])
disposed = JuMP.value(model[:z_disp][p.name, m.name, t])
produced > 1e-3 || continue
push!(df, [p.name, m.name, t, produced, disposed])
disposal_cost = p.disposal_cost[m][t] * disposed
push!(
df,
[p.name, m.name, t, _round(produced), _round(disposed), _round(disposal_cost)],
)
end
return df
end

View File

@@ -13,6 +13,9 @@ function transportation_report(model)::DataFrame
df."year" = Int[]
df."amount sent (tonne)" = Float64[]
df."distance (km)" = Float64[]
df."transportation cost (\$)" = Float64[]
df."center revenue (\$)" = Float64[]
df."center collection cost (\$)" = Float64[]
E = model.ext[:E]
distances = model.ext[:distances]
@@ -22,7 +25,29 @@ function transportation_report(model)::DataFrame
amount = value(model[:y][p1.name, p2.name, m.name, t])
amount > 1e-3 || continue
distance = distances[p1, p2, m]
push!(df, [p1.name, p2.name, m.name, t, amount, distance])
tr_cost = distance * amount * m.tr_cost[t]
revenue = 0
if isa(p2, Center)
revenue = p2.revenue[t] * amount
end
collection_cost = 0
if isa(p1, Center)
collection_cost = p1.collection_cost[m][t] * amount
end
push!(
df,
[
p1.name,
p2.name,
m.name,
t,
_round(amount),
_round(distance),
_round(tr_cost),
_round(revenue),
_round(collection_cost),
],
)
end
return df
end