基本的に、コードが機能しない理由についてしばらく頭を悩ませてきました。部品を個別にテストし、ウェブ全体を見て、役立つかどうかを確認しました。トレースバックが次のエラーになる
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
エラーのある2つの部分は
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
そして
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 ####
これが完成したコードです。これがないと、何が起こっているかを見るのが難しいかもしれません
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')
お時間をいただきありがとうございます。
表示されるエラーは、_self.adj
_にキー_0
_がまだないということです。まだ存在しないリストに追加しようとしています。
代わりに defaultdict
を使用して、この行を(___init__
_で)置き換えることを検討してください。
_self.adj = {}
_
これとともに:
_self.adj = defaultdict(list)
_
上部でインポートする必要があります。
_from collections import defaultdict
_
KeyError
を上げるのではなく、self.adj[0].append(Edge)
が追加するリストを自動的に作成します。
Defaultdictソリューションの方が優れています。ただし、完全を期すために、追加する前に空のリストをチェックして作成することもできます。 +行を追加します。
+ if not u in self.adj.keys():
+ self.adj[u] = []
self.adj[u].append(Edge)
.
.
これを試して:
class Flonetwork(Object):
def __init__(self,adj = {},flow={}):
self.adj = adj
self.flow = flow