Skip to content
Snippets Groups Projects
Commit c9ef2dfe authored by Gabriel Gehrke's avatar Gabriel Gehrke
Browse files

removed the unfinished max flow problem

parent 03ce64d3
No related branches found
No related tags found
No related merge requests found
%% Cell type:code id: tags:
``` python
from model import MultiSourceSinkMaxFlow
import itertools
import random
```
%% Cell type:code id: tags:
``` python
instance = MultiSourceSinkMaxFlow()
# define source and sink nodes
instance.add_source("S1")
instance.add_source("S2")
instance.add_sink("T1")
instance.add_sink("T2")
instance.add_edge("S1", "A", capacity=35.7)
instance.add_edge("S1", "D", capacity=59.0)
instance.add_edge("S2", "B", capacity=20.3)
instance.add_edge("S2", "C", capacity=47.38)
instance.add_edge("A", "B", capacity=9.8)
instance.add_edge("B", "D", capacity=50.5)
instance.add_edge("C", "D", capacity=50.0)
instance.add_edge("D", "T2", capacity=100.0)
```
%% Cell type:code id: tags:
``` python
solution = instance.optimize()
instance.draw(utilizations=solution)
```
%% Output
Set parameter Username
Academic license - for non-commercial use only - expires 2023-12-04
Gurobi Optimizer version 9.5.2 build v9.5.2rc0 (linux64)
Thread count: 12 physical cores, 24 logical processors, using up to 24 threads
Optimize a model with 4 rows, 8 columns and 11 nonzeros
Model fingerprint: 0x6d47b9d0
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [1e+00, 1e+00]
Bounds range [1e+01, 1e+02]
RHS range [0e+00, 0e+00]
Presolve removed 4 rows and 8 columns
Presolve time: 0.00s
Presolve: All rows and columns removed
Iteration Objective Primal Inf. Dual Inf. Time
0 1.0000000e+02 0.000000e+00 0.000000e+00 0s
Solved in 0 iterations and 0.00 seconds (0.00 work units)
Optimal objective 1.000000000e+02
import gurobipy as gp
from gurobipy import GRB
import networkx as nx
from typing import Any, List, Set, Tuple, Dict
import matplotlib.pyplot as plt
Node = Any
Edge = Tuple[Node, Node]
class MultiSourceSinkMaxFlow():
def __init__(self) -> None:
self.graph = nx.DiGraph()
self.sources = set()
self.sinks = set()
def add_node(self, node: Node):
self.graph.add_node(node)
def add_source(self, node: Node):
self.add_node(node)
self.sources.add(node)
def add_sink(self, node: Node):
self.add_node(node)
self.sinks.add(node)
def add_edge(self, node1: Node, node2: Node, capacity: float):
assert not self.graph.has_edge(node1, node2)
self.graph.add_edge(node1, node2, capacity=capacity)
def optimize(self):
m = gp.Model()
edge_utilization_vars = {
(p, q): m.addVar(lb=0.0, ub=self.graph[p][q]["capacity"], vtype=GRB.CONTINUOUS) for (p, q) in self.graph.edges()
}
target_term = 0.0
for v in self.graph.nodes():
if v in self.sources:
continue
elif v in self.sinks:
incoming_edges = self.graph.in_edges(v, data=False)
incoming_flow = sum(edge_utilization_vars[e] for e in incoming_edges)
target_term += incoming_flow
continue
incoming_edges = self.graph.in_edges(v, data=False)
outgoing_edges = self.graph.out_edges(v, data=False)
in_sum = sum(edge_utilization_vars[e] for e in incoming_edges)
out_sum = sum(edge_utilization_vars[e] for e in outgoing_edges)
m.addConstr(in_sum == out_sum)
m.setObjective(target_term, GRB.MAXIMIZE)
m.optimize()
utilizations = {e: var.X for e, var in edge_utilization_vars.items()}
return utilizations
def draw(self, utilizations: Dict[Edge, float]):
fig = plt.figure()
fig.set_size_inches(12, 12)
edge_labels = {
e: f"{round(util, 2)} / {round(self.graph[e[0]][e[1]]['capacity'], 2)}" for e, util in utilizations.items()
}
layout = nx.layout.planar_layout(self.graph)
nx.draw_networkx(
self.graph,
labels={n: str(n) for n in self.graph.nodes()},
pos=layout,
node_color=["orange" if n in self.sinks else ("green" if n in self.sources else "grey") for n in self.graph.nodes()]
)
nx.draw_networkx_edge_labels(self.graph, pos=layout, edge_labels=edge_labels, font_size=10)
plt.show()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment