Gurobi network simplex
AnsweredHi,
I am testing instances of the transportation problem with the Gurobi's network simplex algorithm.
I can write down the corresponding LP models and then set the parameter NetworkAlg to 1. However, I have memory issues in very large instances due to the LP models.
Is there a way to launch the network simplex with Gurobi without specifically building an LP model (using only the input information about transportation costs, supplies and demands)?
Thank you,
Best regards
Rosario
-
Official comment
This post is more than two years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support. -
Hi Rosario,
For the command line we only accept the following Model File Formats.
Alternatively, you can load the instances to another interface (e.g. a graph modelling tool) and use the Gurobi API to formulate the model and solve it (this won't require you to write any new file).
I did recently for the min-cost flow DIMACs instances so I share the code below (no guarantees). Usage \(\texttt{python3 script_name.py path/to/dimacs.min}\)Cheers,
Davidimport time
import sys
from pathlib import Path
import gurobipy as gp
from networkx import DiGraph
def read_dimacs_flow(fname):
g = DiGraph()
ecount = 0
with open(fname) as f:
lines = f.readlines()
for l in lines:
if "c " in l:
continue
if "n " in l:
if "min" in l:
continue
s = l.split(" ")
nid = int(s[1])
nsupply = int(s[2])
g.add_node(nid, demand=nsupply)
if "a " in l:
s = l.split(" ")
source_id = int(s[1])
target_id = int(s[2])
low = int(s[3])
cap = int(s[4])
cost = int(s[5])
g.add_edge(source_id, target_id, capacity=cap, weight=cost)
ecount += 1
print(f"Loaded graph with")
print(f"Num of nodes: {g.number_of_nodes()}")
print(f"Num of arcs: {g.number_of_edges()} {ecount=}")
return g
def solve(g, name):
with gp.Env(params={"NetworkAlg": 1}) as env, gp.Model(name, env=env) as model:
edges, capacities, costs = gp.multidict(
{(i, j): [d["capacity"], d["weight"]] for i, j, d in g.edges(data=True)}
)
nodes = list(g.nodes(data=True))
x = {
(i, j): model.addVar(
name=f"flow[{i},{j}]",
ub=capacities[i, j],
obj=costs[i, j],
)
for i, j in edges
}
flow_constrs = {}
for n, data in nodes:
dmd = 0
if "demand" in data:
dmd = data["demand"]
flow_constrs[n] = model.addConstr(
(
gp.quicksum(x[n, j] for j in g.successors(n))
- gp.quicksum(x[j, n] for j in g.predecessors(n))
== dmd
),
name=f"flow_balance[{n}]",
)
model.write(f"{name}.mps.bz2")
t = time.time()
model.optimize()
print(f"Using Gurobi\t{model.objval}\ttaken {time.time() - t}")
def get_name(s):
return str(Path(s).stem)
g = read_dimacs_flow(sys.argv[1])
solve(g, get_name(sys.argv[1]))0 -
Hi David,
thank you for your fast reply and your advice!
Cheers,
Rosario
0
Post is closed for comments.
Comments
3 comments