Ik ben eigenlijk al een hele tijd aan het piekeren over de reden waarom mijn code niet werkt. Ik heb onderdelen afzonderlijk getest en heb op internet gezocht of het kan helpen, maar het mocht niet baten.
Ik krijg een foutmelding dat de traceback is:
Traceback (most recent call last):
File "yes2.py", line 62, in <module>
g.add_edge(row_index,col_index, b)
File "yes2.py", line 27, in add_edge
self.adj[u].append(edge)
KeyError: 0
De twee delen met fouten zijn
def add_edge(self, u, v, w=0):
if u == v:
raise ValueError("u == v")
edge = Edge(u,v,w)
redge = Edge(v,u,0)
edge.redge = redge
redge.redge = edge
self.adj[u].append(edge) #### LINE 27 ####
self.adj[v].append(redge)
self.flow[edge] = 0
self.flow[redge] = 0
en
g = FlowNetwork()
map(g.add_vertex, ['0','1','2','3','4','5','6'])
with open('network.txt', "r") as file:
for row_index, row in enumerate(file):
for col_index, value in enumerate(row.split(",")):
b = int(value)
if b != 0:
g.add_edge(row_index,col_index, b) ### LINE 62 ####
En hier is de voltooide code, want zonder deze kan het moeilijk zijn om te zien wat er gebeurt
class Edge(object):
def __init__(self, u, v, w):
self.source = u
self.sink = v
self.capacity = w
def __repr__(self):
return "%s->%s:%s" % (self.source, self.sink, self.capacity)
class FlowNetwork(object):
def __init__(self):
self.adj = {}
self.flow = {}
def add_vertex(self, vertex):
self.adj[vertex] = []
def get_edges(self, v):
return self.adj[v]
def add_edge(self, u, v, w=0):
if u == v:
raise ValueError("u == v")
edge = Edge(u,v,w)
redge = Edge(v,u,0)
edge.redge = redge
redge.redge = edge
self.adj[u].append(edge)
self.adj[v].append(redge)
self.flow[edge] = 0
self.flow[redge] = 0
def find_path(self, source, sink, path):
if source == sink:
return path
for edge in self.get_edges(source):
residual = edge.capacity - self.flow[edge]
if residual > 0 and not (edge,residual) in path:
result = self.find_path( edge.sink, sink, path + [(edge,residual)] )
if result != None:
return result
def max_flow(self, source, sink):
path = self.find_path(source, sink, [])
while path != None:
flow = min(res for edge,res in path)
for edge,res in path:
self.flow[edge] += flow
self.flow[edge.redge] -= flow
path = self.find_path(source, sink, [])
return sum(self.flow[edge] for edge in self.get_edges(source))
g = FlowNetwork()
map(g.add_vertex, ['0','1','2','3','4','5','6'])
with open('network.txt', "r") as file:
# enumerate allows you to iterate through the list with an index and an object
for row_index, row in enumerate(file):
# split allows you to break a string apart with a string key
for col_index, value in enumerate(row.split(",")):
#convert value from string to int
b = int(value)
if b != 0:
g.add_edge(row_index,col_index, b)
print g.max_flow('1','6')
Hartelijk dank voor uw tijd, zeer gewaardeerd.
Antwoord 1, autoriteit 100%
De foutmelding die je krijgt is dat self.adj
nog geen sleutel 0
heeft. Je probeert iets toe te voegen aan een lijst die nog niet bestaat.
Overweeg het gebruik van een defaultdict
vervang in plaats daarvan deze regel (in __init__
):
self.adj = {}
met dit:
self.adj = defaultdict(list)
Je moet bovenaan importeren:
from collections import defaultdict
In plaats van een KeyError
op te werpen, maakt self.adj[0].append(edge)
nu automatisch een lijst om aan toe te voegen.
Antwoord 2, autoriteit 35%
De standaarddict-oplossing is beter.
Maar voor de volledigheid zou je ook kunnen controleren en een lege lijst maken voor de append.
Voeg de + regels toe:
+ if not u in self.adj.keys():
+ self.adj[u] = []
self.adj[u].append(edge)
.
.
Antwoord 3, autoriteit 10%
Het komt alleen wanneer uw lijst of woordenboek niet beschikbaar is in de lokale functie.
Antwoord 4
Probeer dit:
class Flonetwork(Object):
def __init__(self,adj = {},flow={}):
self.adj = adj
self.flow = flow