|
|
|
@ -192,12 +192,12 @@ function create_process_node_constraints!(model::ManufacturingModel)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function solve(filename::String;
|
|
|
|
|
milp_optimizer=optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0),
|
|
|
|
|
lp_optimizer=optimizer_with_attributes(Clp.Optimizer, "LogLevel" => 0))
|
|
|
|
|
|
|
|
|
|
@info "Reading $filename..."
|
|
|
|
|
instance = RELOG.load(filename)
|
|
|
|
|
default_milp_optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
|
|
|
|
|
default_lp_optimizer = optimizer_with_attributes(Clp.Optimizer, "LogLevel" => 0)
|
|
|
|
|
|
|
|
|
|
function solve(instance::Instance;
|
|
|
|
|
milp_optimizer=default_milp_optimizer,
|
|
|
|
|
lp_optimizer=default_lp_optimizer)
|
|
|
|
|
|
|
|
|
|
@info "Building graph..."
|
|
|
|
|
graph = RELOG.build_graph(instance)
|
|
|
|
@ -213,6 +213,11 @@ function solve(filename::String;
|
|
|
|
|
@info "Optimizing MILP..."
|
|
|
|
|
JuMP.optimize!(model.mip)
|
|
|
|
|
|
|
|
|
|
if !has_values(model.mip)
|
|
|
|
|
@warn "No solution available"
|
|
|
|
|
return Dict()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@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)
|
|
|
|
@ -229,6 +234,18 @@ function solve(filename::String;
|
|
|
|
|
return get_solution(model)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function solve(filename::String;
|
|
|
|
|
milp_optimizer=default_milp_optimizer,
|
|
|
|
|
lp_optimizer=default_lp_optimizer)
|
|
|
|
|
|
|
|
|
|
@info "Reading $filename..."
|
|
|
|
|
instance = RELOG.parsefile(filename)
|
|
|
|
|
|
|
|
|
|
return solve(instance,
|
|
|
|
|
milp_optimizer=milp_optimizer,
|
|
|
|
|
lp_optimizer=lp_optimizer)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function get_solution(model::ManufacturingModel)
|
|
|
|
|
mip, vars, eqs, graph, instance = model.mip, model.vars, model.eqs, model.graph, model.instance
|
|
|
|
|
T = instance.time
|
|
|
|
|