mirror of
https://github.com/ANL-CEEESA/RELOG.git
synced 2025-12-06 07:48:50 -06:00
Update JuMP; print progress bars
This commit is contained in:
22
src/model.jl
22
src/model.jl
@@ -1,7 +1,7 @@
|
|||||||
# Copyright (C) 2019 Argonne National Laboratory
|
# Copyright (C) 2019 Argonne National Laboratory
|
||||||
# Written by Alinson Santos Xavier <axavier@anl.gov>
|
# Written by Alinson Santos Xavier <axavier@anl.gov>
|
||||||
|
|
||||||
using JuMP, LinearAlgebra, Geodesy, Cbc
|
using JuMP, LinearAlgebra, Geodesy, Cbc, ProgressBars
|
||||||
|
|
||||||
mutable struct ReverseManufacturingModel
|
mutable struct ReverseManufacturingModel
|
||||||
mip::JuMP.Model
|
mip::JuMP.Model
|
||||||
@@ -68,8 +68,13 @@ function build_model(instance::ReverseManufacturingInstance,
|
|||||||
) :: ReverseManufacturingModel
|
) :: ReverseManufacturingModel
|
||||||
|
|
||||||
println("Building optimization model...")
|
println("Building optimization model...")
|
||||||
mip = isa(optimizer, JuMP.OptimizerFactory) ? Model(optimizer) : direct_model(optimizer)
|
mip = Model(optimizer)
|
||||||
decision_nodes, process_nodes, arcs = create_nodes_and_arcs(instance)
|
decision_nodes, process_nodes, arcs = create_nodes_and_arcs(instance)
|
||||||
|
|
||||||
|
println(" $(length(decision_nodes)) decision nodes")
|
||||||
|
println(" $(length(process_nodes)) process nodes")
|
||||||
|
println(" $(length(arcs)) arcs")
|
||||||
|
|
||||||
vars = DotDict()
|
vars = DotDict()
|
||||||
vars.flow = Dict(a => @variable(mip, lower_bound=0) for a in arcs)
|
vars.flow = Dict(a => @variable(mip, lower_bound=0) for a in arcs)
|
||||||
vars.node = Dict(n => @variable(mip, binary=true) for n in values(process_nodes))
|
vars.node = Dict(n => @variable(mip, binary=true) for n in values(process_nodes))
|
||||||
@@ -78,17 +83,17 @@ function build_model(instance::ReverseManufacturingInstance,
|
|||||||
|
|
||||||
println(" Creating objective function...")
|
println(" Creating objective function...")
|
||||||
obj = @expression(mip, 0 * @variable(mip))
|
obj = @expression(mip, 0 * @variable(mip))
|
||||||
for a in arcs
|
for a in tqdm(arcs)
|
||||||
for c in keys(a.costs)
|
for c in keys(a.costs)
|
||||||
add_to_expression!(obj, a.costs[c], vars.flow[a])
|
add_to_expression!(obj, a.costs[c], vars.flow[a])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for n in values(process_nodes)
|
for n in tqdm(values(process_nodes))
|
||||||
add_to_expression!(obj, n.cost, vars.node[n])
|
add_to_expression!(obj, n.cost, vars.node[n])
|
||||||
end
|
end
|
||||||
@objective(mip, Min, obj)
|
@objective(mip, Min, obj)
|
||||||
|
|
||||||
return return ReverseManufacturingModel(mip,
|
return ReverseManufacturingModel(mip,
|
||||||
vars,
|
vars,
|
||||||
arcs,
|
arcs,
|
||||||
decision_nodes,
|
decision_nodes,
|
||||||
@@ -97,7 +102,7 @@ end
|
|||||||
|
|
||||||
function create_decision_node_constraints!(mip, nodes, vars)
|
function create_decision_node_constraints!(mip, nodes, vars)
|
||||||
println(" Creating decision-node constraints...")
|
println(" Creating decision-node constraints...")
|
||||||
for (id, n) in nodes
|
for (id, n) in tqdm(nodes)
|
||||||
@constraint(mip,
|
@constraint(mip,
|
||||||
sum(vars.flow[a] for a in n.incoming_arcs) + n.balance ==
|
sum(vars.flow[a] for a in n.incoming_arcs) + n.balance ==
|
||||||
sum(vars.flow[a] for a in n.outgoing_arcs))
|
sum(vars.flow[a] for a in n.outgoing_arcs))
|
||||||
@@ -106,7 +111,7 @@ end
|
|||||||
|
|
||||||
function create_process_node_constraints!(mip, nodes, vars)
|
function create_process_node_constraints!(mip, nodes, vars)
|
||||||
println(" Creating process-node constraints...")
|
println(" Creating process-node constraints...")
|
||||||
for (id, n) in nodes
|
for (id, n) in tqdm(nodes)
|
||||||
# Output amount is implied by input amount
|
# Output amount is implied by input amount
|
||||||
input_sum = isempty(n.incoming_arcs) ? 0 : sum(vars.flow[a] for a in n.incoming_arcs)
|
input_sum = isempty(n.incoming_arcs) ? 0 : sum(vars.flow[a] for a in n.incoming_arcs)
|
||||||
for a in n.outgoing_arcs
|
for a in n.outgoing_arcs
|
||||||
@@ -228,8 +233,7 @@ function calculate_distance(source_lat, source_lon, dest_lat, dest_lon)::Float64
|
|||||||
end
|
end
|
||||||
|
|
||||||
function solve(filename::String;
|
function solve(filename::String;
|
||||||
optimizer=with_optimizer(Cbc.Optimizer,
|
optimizer=Cbc.Optimizer)
|
||||||
logLevel=0))
|
|
||||||
println("Reading $filename")
|
println("Reading $filename")
|
||||||
instance = ReverseManufacturing.readfile(filename)
|
instance = ReverseManufacturing.readfile(filename)
|
||||||
model = ReverseManufacturing.build_model(instance, optimizer)
|
model = ReverseManufacturing.build_model(instance, optimizer)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using ReverseManufacturing, Cbc, JuMP, Printf
|
|||||||
|
|
||||||
@testset "Model" begin
|
@testset "Model" begin
|
||||||
instance = ReverseManufacturing.load("samples/s1")
|
instance = ReverseManufacturing.load("samples/s1")
|
||||||
model = ReverseManufacturing.build_model(instance, with_optimizer(Cbc.Optimizer))
|
model = ReverseManufacturing.build_model(instance, Cbc.Optimizer)
|
||||||
|
|
||||||
# Verify nodes
|
# Verify nodes
|
||||||
@test ("P1", "Origin", "C1") in keys(model.decision_nodes)
|
@test ("P1", "Origin", "C1") in keys(model.decision_nodes)
|
||||||
|
|||||||
Reference in New Issue
Block a user