Guest User

Untitled

a guest
Nov 4th, 2015
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 KB | None | 0 0
  1. import networkx as nx
  2. import pylab
  3.  
  4. from collections import namedtuple
  5.  
  6. K_d = 1.1 # коефициент неучтенных работ
  7. K_vn = 1.1 # коефициент производительности труда
  8.  
  9.  
  10.  
  11. # t_P_j = max(t_p_i + T_ij)
  12.  
  13. T_ij_values = {
  14. (0,1): 3,
  15. (1,2): 7,
  16. (1,3): 4,
  17. (2,5): 4,
  18. (3,5): 3,
  19. (5,12): 4,
  20. (12,15): 6,
  21. (12,14): 2,
  22. (1,4): 6,
  23. (9,11): 4,
  24. (15,16): 3,
  25. (3,13): (48,2),
  26. (13,14): (80,2),
  27. (14,15): (160,4),
  28. (11,15): (48,3),
  29. (4,6): (144,6),
  30. (4,7): (16,2),
  31. (6,8): (32,2),
  32. (6,9): (64,4),
  33. (8,9): (192,4),
  34. (4,7): (64,2),
  35. (7,10): (160,2),
  36. (10,11): (64,2),
  37.  
  38. (3,6): 0,
  39. (9, 10): 0
  40. }
  41.  
  42. def process_laboriousness(items):
  43. T_ij = lambda t_ij, n_ij: int((t_ij*K_d)/(n_ij*K_vn)) # продолжительность работы в раб днях
  44.  
  45. tmp = []
  46. for key in items:
  47. if key==-1: break
  48. current_val = T_ij_values[key]
  49. if isinstance(current_val, tuple):
  50. tmp.append((*key, T_ij(*current_val)))
  51. else:
  52. tmp.append((*key, current_val))
  53. return tmp
  54.  
  55.  
  56. def generate_nodes(DG):
  57. Node = namedtuple('Node', 't_p R_i t_n i')
  58.  
  59. nodes = []
  60. for key, pred in DG.pred.items():
  61. if not pred:
  62. nodes.append(Node(t_p=0, R_i=0, t_n=0, i=0))
  63. continue
  64.  
  65. t_p = max(p['weight']+nodes[k].t_p for k,p in pred.items()) # t_p_j + t_p_i
  66.  
  67. node = Node(t_p=t_p, R_i=0, t_n=0,i=key,)
  68. nodes.append(node)
  69.  
  70. for key, pred in sorted(DG.adj.items(), reverse=True):
  71. if not pred:
  72. node = nodes[key]
  73. nodes[key] = Node(t_p=node.t_p, R_i=0, t_n=node.t_p, i=key)
  74. continue
  75.  
  76. t_n = min(nodes[k].t_n-p['weight'] for k,p in pred.items()) # t_n_j - t_n_i
  77.  
  78. node = nodes[key]
  79. nodes[key] = Node(t_p=node.t_p, R_i=t_n - node.t_p, t_n=t_n,i=key,)
  80. return nodes
  81.  
  82.  
  83. if __name__=='__main__':
  84. weighted_edges = process_laboriousness(T_ij_values)
  85. DG=nx.DiGraph(t_p=0, R_i=0, t_n=0, i=0)
  86. DG.add_weighted_edges_from(weighted_edges)
  87.  
  88. elarge=[(u,v) for (u,v,d) in DG.edges(data=True) if d['weight'] >= 1]
  89. esmall=[(u,v) for (u,v,d) in DG.edges(data=True) if d['weight'] ==0]
  90.  
  91. pos=nx.pygraphviz_layout(DG)
  92.  
  93. pylab.figure(1,figsize=(30,30))
  94. # nodes
  95. nx.draw_networkx_nodes(DG,pos,node_size=2300)
  96.  
  97. # edges
  98. nx.draw_networkx_edges(DG,pos,edgelist=elarge,
  99. width=2)
  100. nx.draw_networkx_edges(DG,pos,edgelist=esmall,
  101. width=2,alpha=0.5,edge_color='b',style='dashed')
  102.  
  103. # labels
  104. nodes = generate_nodes(DG)
  105. pattern = ''' {R_i}\n{t_p} X {t_n}\n {i} '''
  106. labels = {n.i: pattern.format(R_i=n.t_n-n.t_p, t_n=n.t_n, i=n.i, t_p=n.t_p) for n in nodes}
  107. nx.draw_networkx_labels(DG,pos,labels,font_size=14,font_family='sans-serif', font_color='blue')
  108.  
  109. # edge labels
  110. pattern = '{weight} \n ({R_p},{R_1},{R_2},{R_free_ij})'
  111. edge_labels = {}
  112. for i,j,d in DG.edges(data=True):
  113. # R_p = t_n_j - t_p_i - T_ij
  114. # R_1 = t_n_j - t_n_i - T_ij
  115. # R_2 = t_p_j - t_p_i - T_ij
  116. # R_free_ij = t_p_j - t_n_i - T_ij
  117. R_p = nodes[j].t_n - nodes[i].t_p - d['weight']
  118. R_1 = nodes[j].t_n - nodes[i].t_n - d['weight']
  119. R_2 = nodes[j].t_p - nodes[i].t_p - d['weight']
  120. R_free_ij = nodes[j].t_p - nodes[i].t_n - d['weight']
  121.  
  122. edge_labels[(i,j)] = pattern.format(weight=d['weight'], R_p=R_p,R_1=R_1,R_2=R_2,R_free_ij=R_free_ij)
  123.  
  124. nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels)
  125. pylab.axis('off')
  126. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment