Accelerate model generation

gh-actions
Alinson S. Xavier 5 years ago
parent 472182b200
commit c10eb506a6

@ -2,7 +2,7 @@
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
using JuMP, LinearAlgebra, Geodesy, Cbc, Clp, ProgressBars
using JuMP, LinearAlgebra, Geodesy, Cbc, Clp, ProgressBars, Printf
mutable struct ManufacturingModel
@ -83,7 +83,7 @@ end
function create_objective_function!(model::ManufacturingModel)
mip, vars, graph, T = model.mip, model.vars, model.graph, model.instance.time
obj = @expression(mip, 0 * @variable(mip))
obj = AffExpr(0.0)
# Process node costs
for n in values(graph.process_nodes), t in 1:T
@ -158,9 +158,12 @@ end
function create_process_node_constraints!(model::ManufacturingModel)
mip, vars, graph, T = model.mip, model.vars, model.graph, model.instance.time
for n in graph.process_nodes, t in 1:T
for t in 1:T, n in graph.process_nodes
# Output amount is implied by input amount
input_sum = isempty(n.incoming_arcs) ? 0 : sum(vars.flow[a, t] for a in n.incoming_arcs)
input_sum = AffExpr(0.0)
for a in n.incoming_arcs
add_to_expression!(input_sum, 1.0, vars.flow[a, t])
end
for a in n.outgoing_arcs
@constraint(mip, vars.flow[a, t] == a.values["weight"] * input_sum)
end
@ -196,19 +199,25 @@ end
function solve(filename::String;
milp_optimizer=optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0),
lp_optimizer=optimizer_with_attributes(Clp.Optimizer, "LogLevel" => 0))
println("Reading $filename...")
@info "Reading $filename..."
instance = RELOG.load(filename)
println("Building graph...")
@info "Building graph..."
graph = RELOG.build_graph(instance)
@info @sprintf(" %12d time periods", instance.time)
@info @sprintf(" %12d process nodes", length(graph.process_nodes))
@info @sprintf(" %12d shipping nodes (plant)", length(graph.plant_shipping_nodes))
@info @sprintf(" %12d shipping nodes (collection)", length(graph.collection_shipping_nodes))
@info @sprintf(" %12d arcs", length(graph.arcs))
println("Building optimization model...")
@info "Building optimization model..."
model = RELOG.build_model(instance, graph, milp_optimizer)
println("Optimizing MILP...")
@info "Optimizing MILP..."
JuMP.optimize!(model.mip)
println("Re-optimizing with integer variables fixed...")
@info "Re-optimizing with integer variables fixed..."
all_vars = JuMP.all_variables(model.mip)
vals = Dict(var => JuMP.value(var) for var in all_vars)
JuMP.set_optimizer(model.mip, lp_optimizer)
@ -220,7 +229,7 @@ function solve(filename::String;
end
JuMP.optimize!(model.mip)
println("Extracting solution...")
@info "Extracting solution..."
return get_solution(model)
end

Loading…
Cancel
Save