I am attempting to capture the nature of a "source" node as well as a "sink" node where the net flow for each node aside from the source and sink is zero. Here is my code so far:
import gurobipy as gp
from gurobipy import GRB
import pandas
import os
# writes constraints and objective to model file for easier inspection
def write_to_file(model, filestring):
directory = os.getcwd()
filename = directory+filestring
if model.write(filename):
return 0
else:
print("failed to write to file")
return -1
# nodes
# for my example, SOURCE s = 2 and SINK t = 7
vertices = [1,2,3,4,5,6,7]
# arcs = edges, each arc has a fixed capacity
arcs, capacity = gp.multidict({
(2,1) : 100,
(2,3) : 50,
(3,4) : 25,
(4,7) : 25,
(3,6) : 200,
(1,6) : 500,
(3,7) : 25,
(6,5) : 500,
(6,7) : 50,
(5,7) : 200
})
# create model
m = gp.Model("Maximum Flow Problem")
# define variables
flow = m.addVars(arcs, name = "flow")
# flow capacity
m.addConstrs(
(flow.sum(i,j) <= capacity[i,j] for i,j in arcs), "cap")
# flow conservation ISSUE HERE!
m.addConstrs(
(flow.sum('*',j) - flow.sum(j,'*') == 0 for j in vertices), "node")
obj = (flow.sum('*', 7) - flow.sum(7,'*'))
m.setObjective(obj, GRB.MAXIMIZE)
#write_to_file(m, "\\rec2_model_simple.lp")
m.optimize()
The issue has to do with the flow conservation constraint. I want to ensure all flow going in and out of all nodes that aren't s=2
and t=7
to equal zero; however, I do not know how to capture this in my constraint.
I would like to have something like:
m.addConstrs(
(flow.sum('*',j) - flow.sum(j,'*') == 0 for j != 2 or j != 7 in vertices), "node")
This throws an error, but I am curious if there is something similar in nature to capture this notion of a "source" and a "sink" in my flow conservation constraint. This may be a question more geared towards the python language instead of gurobipy, but since it is a question specific to modeling, I felt as though it is appropriate here.