Python实现AOV网络——拓扑排序,AOE网络——关键路径
2018-03-28 17:42
435 查看
找代码废了很大的时间,有些代码存在问题,或者是不好理解,这个是python的,C或Java的较多。
理解程序还是费了我不少脑细胞的,多亏了有裘老师的帮助啊,后续会跟进的,努力加油!
#裘宗燕数据结构中的aoe网络代码
"""topological sort of direct graph
"""
class Graph: #basic graph class, using adjacent matrix
def __init__(self, mat, unconn = 0):
vnum1 = len(mat) #行数
for x in mat:
if len(x) != vnum1: # Check square matrix检查是否为方阵
raise ValueError("Argumentfor 'GraphA' is bad.")
self.mat = [mat[i][:] for i inrange(vnum1)]
self.unconn = unconn
self.vnum = vnum1
def _out_edges(mat, vi, unconn):
edges = []
row = mat[vi]
for i in range(len(row)):
if row[i] != unconn:
#print(edges) #都为空
edges.append((i, row[i]))
#print(edges)
return edges
def vertex_num(self):
return self.vnum
classGraphA(Graph):
def __init__(self, mat, unconn = 0):
vnum1 = len(mat)
for x in mat:
if len(x) != vnum1: # Check squarematrix,检查是否为方阵
raise ValueError("Argumentfor 'GraphA' is bad.")
self.mat = [Graph._out_edges(mat, i,unconn)
for i in range(vnum1)]
self.vnum = vnum1
self.unconn = unconn
def add_vertex(self): # For new vertex,return an index allocated
self.mat.append([])
self.vnum += 1
return self.vnum
def add_edge(self, vi, vj, val = 1):
assert 0 <= vi < self.vnum and 0<= vj < self.vnum
row = self.mat[vi]
for i in range(len(row)):
if row[i][0] == vj: # replace avalue for mat[vi][vj]
self.mat[vi][i] = (vj, val)
return
if row[i][0] > vj: break
else:
i += 1 # adjust for the new entryat the end
self.mat[vi].insert(i, (vj, val))
def get_edge(self, vi, vj):
assert 0 <= vi < self.vnum and 0<= vj < self.vnum
for i, val in self.mat[vi]: if i == vj: return val
return self.unconn
def out_edges(self, vi):
assert 0 <= vi < self.vnum ; return self.mat[vi]
inf =float("inf") # infinity
deftoposort(graph):
vnum = graph.vertex_num()
indegree, toposeq, zerov = [0]*vnum, [], -1
for vi in range(vnum):
for v, w in graph.out_edges(vi):indegree[v] += 1
for vi in range(vnum):
if indegree[vi] == 0:
indegree[vi] = zerov; zerov = vi
for n in range(vnum):
if zerov == -1: return False # Thereisno topo-seq
toposeq.append(zerov)
vi = zerov; zerov = indegree[zerov]
for v, w in graph.out_edges(vi):
indegree[v] -= 1
if indegree[v] == 0:
indegree[v] = zerov; zerov = v
return toposeq
"""generate critical path of AOE
"""
defcriticalPath(graph):
toposeq = toposort(graph)
if toposeq == False:
return False # no topo-sequence, cannotcontinue
vnum = graph.vertex_num()
ee, le = [0]*vnum, [inf]*vnum
crtPath = []
setEventE(vnum, graph, toposeq, ee)
print(ee)
setEventL(vnum, graph, toposeq, ee[vnum-1],le)
print(le)
for i in range(vnum):
for j, w in graph.out_edges(i):
if ee[i] == le[j] - w: # 列表中是列表,关键活动
crtPath.append([i, j, ee[i]])
return crtPath # 返回关键活动
defsetEventE(vnum, graph, toposeq, ee):
for k in range(vnum-1): # 最后一个顶点不必做
i = toposeq[k]
for j, w in graph.out_edges(i):
if ee[i] + w > ee[j]: # 事件j需更晚结束
ee[j] = ee[i] + w
defsetEventL(vnum, graph, toposeq, eelast, le):
for i in range(vnum): le[i] = eelast
for k in range(vnum-2, -1, -1):# 逆拓扑排序,最后顶点不必做
i = toposeq[k]
for j, w in graph.out_edges(i):
if le[j] - w < le[i]: # 事件i需更早时间
le[i] = le[j] - w
if __name__ =='__main__':
gmat6 = [[0,0,1,0,0,0,0,1,0],
[0,0,1,1,1,0,0,0,0],
[0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,1,0,0]]
g6 = GraphA(gmat6)
toposeq = toposort(g6)
print(toposeq)
gmat7 = [[inf, 6, 4, 5,inf,inf,inf,inf,inf],
[inf,inf,inf,inf, 1,inf,inf,inf,inf],
[inf,inf,inf,inf, 1,inf,inf,inf,inf],
[inf,inf,inf,inf,inf, 2,inf,inf,inf],
[inf,inf,inf,inf,inf,inf, 9, 7,inf],
[inf,inf,inf,inf,inf,inf,inf, 4,inf],
[inf,inf,inf,inf,inf,inf,inf,inf, 2],
[inf,inf,inf,inf,inf,inf,inf,inf, 4],
[inf,inf,inf,inf,inf,inf,inf,inf,inf]]
g7 = GraphA(gmat7, inf)
cp = criticalPath(g7)
print(cp)
pass
理解程序还是费了我不少脑细胞的,多亏了有裘老师的帮助啊,后续会跟进的,努力加油!
#裘宗燕数据结构中的aoe网络代码
"""topological sort of direct graph
"""
class Graph: #basic graph class, using adjacent matrix
def __init__(self, mat, unconn = 0):
vnum1 = len(mat) #行数
for x in mat:
if len(x) != vnum1: # Check square matrix检查是否为方阵
raise ValueError("Argumentfor 'GraphA' is bad.")
self.mat = [mat[i][:] for i inrange(vnum1)]
self.unconn = unconn
self.vnum = vnum1
def _out_edges(mat, vi, unconn):
edges = []
row = mat[vi]
for i in range(len(row)):
if row[i] != unconn:
#print(edges) #都为空
edges.append((i, row[i]))
#print(edges)
return edges
def vertex_num(self):
return self.vnum
classGraphA(Graph):
def __init__(self, mat, unconn = 0):
vnum1 = len(mat)
for x in mat:
if len(x) != vnum1: # Check squarematrix,检查是否为方阵
raise ValueError("Argumentfor 'GraphA' is bad.")
self.mat = [Graph._out_edges(mat, i,unconn)
for i in range(vnum1)]
self.vnum = vnum1
self.unconn = unconn
def add_vertex(self): # For new vertex,return an index allocated
self.mat.append([])
self.vnum += 1
return self.vnum
def add_edge(self, vi, vj, val = 1):
assert 0 <= vi < self.vnum and 0<= vj < self.vnum
row = self.mat[vi]
for i in range(len(row)):
if row[i][0] == vj: # replace avalue for mat[vi][vj]
self.mat[vi][i] = (vj, val)
return
if row[i][0] > vj: break
else:
i += 1 # adjust for the new entryat the end
self.mat[vi].insert(i, (vj, val))
def get_edge(self, vi, vj):
assert 0 <= vi < self.vnum and 0<= vj < self.vnum
for i, val in self.mat[vi]: if i == vj: return val
return self.unconn
def out_edges(self, vi):
assert 0 <= vi < self.vnum ; return self.mat[vi]
inf =float("inf") # infinity
deftoposort(graph):
vnum = graph.vertex_num()
indegree, toposeq, zerov = [0]*vnum, [], -1
for vi in range(vnum):
for v, w in graph.out_edges(vi):indegree[v] += 1
for vi in range(vnum):
if indegree[vi] == 0:
indegree[vi] = zerov; zerov = vi
for n in range(vnum):
if zerov == -1: return False # Thereisno topo-seq
toposeq.append(zerov)
vi = zerov; zerov = indegree[zerov]
for v, w in graph.out_edges(vi):
indegree[v] -= 1
if indegree[v] == 0:
indegree[v] = zerov; zerov = v
return toposeq
"""generate critical path of AOE
"""
defcriticalPath(graph):
toposeq = toposort(graph)
if toposeq == False:
return False # no topo-sequence, cannotcontinue
vnum = graph.vertex_num()
ee, le = [0]*vnum, [inf]*vnum
crtPath = []
setEventE(vnum, graph, toposeq, ee)
print(ee)
setEventL(vnum, graph, toposeq, ee[vnum-1],le)
print(le)
for i in range(vnum):
for j, w in graph.out_edges(i):
if ee[i] == le[j] - w: # 列表中是列表,关键活动
crtPath.append([i, j, ee[i]])
return crtPath # 返回关键活动
defsetEventE(vnum, graph, toposeq, ee):
for k in range(vnum-1): # 最后一个顶点不必做
i = toposeq[k]
for j, w in graph.out_edges(i):
if ee[i] + w > ee[j]: # 事件j需更晚结束
ee[j] = ee[i] + w
defsetEventL(vnum, graph, toposeq, eelast, le):
for i in range(vnum): le[i] = eelast
for k in range(vnum-2, -1, -1):# 逆拓扑排序,最后顶点不必做
i = toposeq[k]
for j, w in graph.out_edges(i):
if le[j] - w < le[i]: # 事件i需更早时间
le[i] = le[j] - w
if __name__ =='__main__':
gmat6 = [[0,0,1,0,0,0,0,1,0],
[0,0,1,1,1,0,0,0,0],
[0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,1,0,0],
[0,0,0,0,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,1,0,0]]
g6 = GraphA(gmat6)
toposeq = toposort(g6)
print(toposeq)
gmat7 = [[inf, 6, 4, 5,inf,inf,inf,inf,inf],
[inf,inf,inf,inf, 1,inf,inf,inf,inf],
[inf,inf,inf,inf, 1,inf,inf,inf,inf],
[inf,inf,inf,inf,inf, 2,inf,inf,inf],
[inf,inf,inf,inf,inf,inf, 9, 7,inf],
[inf,inf,inf,inf,inf,inf,inf, 4,inf],
[inf,inf,inf,inf,inf,inf,inf,inf, 2],
[inf,inf,inf,inf,inf,inf,inf,inf, 4],
[inf,inf,inf,inf,inf,inf,inf,inf,inf]]
g7 = GraphA(gmat7, inf)
cp = criticalPath(g7)
print(cp)
pass
相关文章推荐
- 关键路径(AOE)—基于拓扑排序(AOV)
- AOE网络与关键路径(二)——实现
- 数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE
- Python递归解决AOE网络最长路关键路径的问题
- AOE网络的算法,活动的最早开始时间,最晚结束时间,关键活动,关键路径
- 拓扑排序 关键路径的代码实现
- 图功能的实现C++(最短路径,关键路径,拓扑排序,关节点,~~~~~~~~~~等等)
- 拓扑排序--关键路径实现
- 数据结构之---C语言实现关键路径AOE图
- AOE网络与关键路径(一)
- 拓扑排序和关键路径算法实现
- 拓扑排序与AOE图关键路径
- AOE网络的关键路径问题
- AOE网络,最长路关键路径的学习
- 图的拓扑排序、关键路径、最短路径算法 -- C++实现
- 去噪自编码网络-Python Keras实现
- 神经网络之python实现
- 神经网络基础 - Python编程实现标准BP算法
- 纯Python实现的网络服务框架 pyxxnet3
- 【算法——Python实现】有权图求单源最短路径Dijkstra算法