Advertisement
avogatro

MPM Buffer Calculation

Oct 4th, 2014
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.46 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf8 -*-
  3. __author__ = "Jiezheng Zhang"
  4. __copyright__ = "Copyright 2014, Jiezheng Zhang"
  5. __credits__ = ["Jiezheng (Sebastian) Zhang", "Altan Karakul", "Yusuf Azal","Wassilij Mikheyev"]
  6. __license__ = "GPL"
  7. __version__ = "1.0.0"
  8. __email__ = "jiezheng.zhang@gmail.com" 
  9.            
  10. import math,sys
  11. ####################################################
  12. #Schritt 1 Input
  13.  
  14. #Dauer von Vorgänge
  15. D = [0,8,16,36,8,20,20,16,16,16,12,12,12,8,2,0]
  16.  
  17. #Zmin mit Graph Topologie
  18. #Datentyp 2D Dictionary
  19. #Beispiel
  20. #Definiert z.B. durch  Z = {0:{1:5},1:{}}
  21. #Z[0][1]ist Zmin von Vorgang 0 zu Vorgang 1,gleich 5
  22. #Knote 1 hat kein Nachfolger
  23. Z = {0:{1:0,2:0},
  24.      1:{4:0,5:0,7:0,8:0},
  25.      2:{3:0},
  26.      3:{11:0,12:0},
  27.      4:{6:0},
  28.      5:{11:0},
  29.      6:{12:0},
  30.      7:{9:0},
  31.      8:{10:0},
  32.      9:{7:-34,11:0},
  33.      10:{8:-30,12:0},
  34.      11:{13:0},
  35.      12:{13:0},
  36.      13:{11:-24,12:-24,14:8},
  37.      14:{15:0},
  38.      15:{}
  39.     }
  40.  
  41. #Max. Projekt Dauer
  42. T = sys.maxint
  43. Debug = True
  44. ####################################################
  45. #Schritt 2 Bestimmung von FAZ
  46.  
  47. #Init
  48.  
  49. #Queue fuer noch zu bearbeitende Vorgänge
  50. Q = [0]
  51. # early start time
  52. FAZ = [-sys.maxint-1 for x in xrange(len(D))]
  53. FAZ[0] = 0
  54. #invertiere Z zu Vorgaenger Dictionary P
  55. #P[j][i] == Z[i][j]
  56. P={0:{}}
  57. for i in Z:
  58.     for j in Z[i]:
  59.         if not P.has_key(j):
  60.             P[j] = {}
  61.         P[j][i] = Z[i][j]
  62. #FAZ
  63. if Debug:
  64.     print "#Vorwaertsrechnung:"
  65. while Q:
  66.     i = Q.pop(0)
  67.     for j in Z[i]:
  68.         if FAZ[j] < FAZ[i] + D[i]+Z[i][j]:
  69.             FAZ[j] = FAZ[i] + D[i]+Z[i][j]
  70.             if j not in Q:
  71.                 Q.append(j)
  72.     #Debug output
  73.     if Debug:
  74.         print "FAZ:","\n", FAZ
  75.         print "Q:","\n", Q
  76.  
  77.  
  78. #Logische Fehler bei Projektendtermin entdecken
  79. for i in xrange(len(FAZ)):
  80.     if T < FAZ[i]:
  81.         print "der vorgegebene Projektendtermin ist nicht zu halten"
  82.         sys.exit()
  83.  
  84. ####################################################
  85. #Schritt 3 Bestimmung von SAZ
  86.  
  87. #Init
  88. if T == sys.maxint:
  89.     T = FAZ[-1]
  90.  
  91. SAZ = [sys.maxint for x in xrange(len(D))]
  92. SAZ[-1] = T
  93. Q = [len(SAZ)-1]
  94. if Debug:
  95.     print "#Rueckwaertsrechnung:"
  96.  
  97. while Q:
  98.     i = Q.pop(0)
  99.     for k in P[i]:
  100.         if SAZ[k] > SAZ[i] - D[k]-Z[k][i]:
  101.             SAZ[k] = SAZ[i] - D[k]-Z[k][i]
  102.             if k not in Q:
  103.                 Q.append(k)
  104.     #Debug output
  105.     if Debug:
  106.         print "SAZ:",SAZ
  107.         print "Q", Q
  108.              
  109.  
  110. ####################################################
  111. #Schritt 4 Puffer
  112. FEZ = [0 for x in xrange(len(D))]
  113. SEZ = [0 for x in xrange(len(D))]
  114. GP = [0 for x in xrange(len(D))]
  115. K = []
  116.  
  117. FP = [0 for x in xrange(len(D))]
  118. FRP = [0 for x in xrange(len(D))]
  119. UP = [0 for x in xrange(len(D))]
  120.  
  121. for i in xrange(len(D)):
  122.     FEZ[i] = FAZ[i]+D[i]
  123.     SEZ[i] = SAZ[i]+D[i]
  124.     GP[i] = SAZ[i]-FAZ[i]
  125.  
  126.     if GP[i] == FAZ[0]:
  127.         K.append(True)
  128.     else:
  129.         K.append(False)
  130.    
  131.     minFAZjMinusZij = None
  132.     FP[i] = - FEZ[i]
  133.     for j in Z[i]:
  134.         if minFAZjMinusZij is not None:
  135.             minFAZjMinusZij = min(minFAZjMinusZij,FAZ[j]-Z[i][j])
  136.         else:
  137.             minFAZjMinusZij = FAZ[j]-Z[i][j]
  138.         FP[i] = minFAZjMinusZij - FEZ[i]
  139.      
  140.     if minFAZjMinusZij is None:
  141.         minFAZjMinusZij=0
  142.  
  143.  
  144.     maxSEZkPlusZkj = None
  145.     FRP[i] = SAZ[i]
  146.     for k in P[i]:
  147.             maxSEZkPlusZkj = max(maxSEZkPlusZkj,SEZ[k]+Z[k][i])
  148.             FRP[i] = SAZ[i]-maxSEZkPlusZkj
  149.  
  150.     if maxSEZkPlusZkj is None:
  151.         maxSEZkPlusZkj=0
  152.     UP[i]= max(0,minFAZjMinusZij - maxSEZkPlusZkj - D[i])
  153. ####################################################
  154. #output
  155.  
  156. print ("i\tD\tFAZ\tFEZ\tSAZ\tSEZ\tGP\tK\tFP\tFRP\tUP")
  157. for i in xrange(len(FAZ)):
  158.     print "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format(i,D[i],
  159.                                                                 FAZ[i],
  160.                                                                 FEZ[i],
  161.                                                                 SAZ[i],
  162.                                                                 SEZ[i],
  163.                                                                 GP[i],
  164.                                 K[i],                               K[i],
  165.                                                                 FP[i],
  166.                                                                 FRP[i],
  167.                                                                 UP[i]
  168.                                                                 )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement