forked from tearf001/Training-Python-Public
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGToposort.py
More file actions
executable file
·101 lines (83 loc) · 3.08 KB
/
GToposort.py
File metadata and controls
executable file
·101 lines (83 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
""" topological sort of direct graph
"""
from 图.Graph import *
inf = float("inf") # infinity
# We suppose that A[i][i] = unconn value
# AOV 网,拓扑排序
def toposort(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 # Thereis no 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
"""
# AOE 网,关键路径
# graph 里无边用 infinity 表示
def criticalPath(graph):
toposeq = toposort(graph)
if toposeq == False:
return False # no topo-sequence, cannot continue
vnum = graph.vertex_num()
ee, le = [0] * vnum, [infinity] * vnum
crtPath = []
setEventE(vnum, graph, toposeq, ee)
setEventL(vnum, graph, toposeq, ee[vnum - 1], le)
for i in range(vnum):
for j, w in graph.out_edges(i):
if ee[i] == le[j] - w: # a critical action
crtPath.append([i, j, ee[i]])
return crtPath # return the critical actions
def setEventE(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
def setEventL(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)
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)
## toposeq = toposort(g6)
## print(toposeq)
cp = criticalPath(g7)
print(cp)
pass