Code
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pyomo.environ as pyo
Durch die Daten unten ist der ungerichtete Graph der Abbildung Abbildung 1 gegeben, dessen Kantengewichte die Strecken zwischen den Endknoten der Kanten angegeben hat. Wir bestimmen mittels der LP-Formulierung die kürzesten Wege vom Konten \(S\) zu allen anderen Knoten.
Wie im Abschnitt Kürzester Weg beschrieben formulieren wir den ungerichteten Graphen um zu einem äquivalenten gerichteten Graphen mit den Kantengewichten \(w_{ij}\) auf den Kanten zwischen den Knoten \(i\) und \(j\). Die Abbildung Abbildung 2 zeigt den zugehörigen gerichteten Graphen.
model = pyo.ConcreteModel()
model.N = pyo.Set(initialize=nodes) # set of nodes
model.E = pyo.Set(initialize=edges) # set of edges
model.x = pyo.Var(model.E, domain=pyo.NonNegativeReals)
model.obj = pyo.Objective(expr=
sum(weight_directed[i, j]*model.x[i, j] for (i, j) in edges),
sense=pyo.minimize)
@model.Constraint(model.N)
def node_balance(model, i):
return sum(model.x[i, n] for n in model.N if (i, n) in model.E) - \
sum(model.x[n, i] for n in model.N if (n, i) in model.E) == \
ext_flow[i]
solver = pyo.SolverFactory('cbc')
# solver = pyo.SolverFactory('glpk')
# solver = pyo.SolverFactory('appsi_highs')
# solver = pyo.SolverFactory('gurobi')
results = solver.solve(model, tee=False)
print(f"status = {results.solver.status}")
print(f"minimum objective value = {pyo.value(model.obj):.2f}")
status = ok
minimum objective value = 46.00
flow on edge ('S', 'B') = 7.00
flow on edge ('B', 'D') = 2.00
flow on edge ('B', 'F') = 4.00
flow on edge ('F', 'G') = 2.00
flow on edge ('D', 'H') = 1.00
flow on edge ('F', 'C') = 1.00
flow on edge ('G', 'E') = 1.00
In Abbildung Abbildung 3 ist die Lösung des Problems dargestellt.