Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. package cpath;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.Stack;
  8.  
  9. /**
  10. * Stellt ein Projekt dar, das aus Arbeitspaketen besteht. Im Prinzip nichts
  11. * anderes als ein Graph mit Arbeitspaketen als Knoten. Das Projekt kennt nur
  12. * die Startknoten, diese kennen jeweils ihren Nachfolger.
  13. */
  14. public class Project {
  15.  
  16. private List<Workpackage> startNodes = new ArrayList<Workpackage>();
  17. private List<Workpackage> endNodes = new ArrayList<Workpackage>();
  18. private Set<Workpackage> criticalPathNodes = new HashSet<Workpackage>();
  19. private Set<Workpackage> allNodes = new HashSet<Workpackage>();
  20. private Stack<Workpackage> currentNodes = new Stack<Workpackage>();
  21.  
  22. public List<Workpackage> getStartNodes() {
  23. return startNodes;
  24. }
  25.  
  26. public void setStartNodes(List<Workpackage> startNodes) {
  27. this.startNodes = startNodes;
  28. }
  29.  
  30. public Set<Workpackage> getCriticalPathNodes() {
  31. return criticalPathNodes;
  32. }
  33.  
  34. public Set<Workpackage> getAllNodes() {
  35. return allNodes;
  36. }
  37.  
  38. public void computeCriticalPath() {
  39. resetLists();
  40. // TODO: Implementieren Sie diese Methode, so dass nach deren Aufruf
  41. // alle Werte im Graph gesetzt sind und die beiden verfuegbaren Sets
  42. // korrekt befuellt wurden. Veraendern Sie nicht die Workpackage-Klasse!
  43. // Zum Testen koennen Sie die beigefuegte Test-Klasse verwenden und
  44. // erweitern. Beachten Sie, dass ihre Implementierung generell
  45. // funktionieren und nicht nur dieses eine Problem loesen soll.
  46.  
  47. // ------------------------------------------------------------------------------|
  48. // VORWÄRTS ALLES DURCHGEHEN
  49. // ------------------------------------------------------------------------------|
  50.  
  51. // Fülle die Stack initial mit den Start-Nodes
  52. for (Workpackage wp : startNodes) {
  53. currentNodes.add(wp);
  54. }
  55.  
  56. while (!currentNodes.isEmpty()) {
  57.  
  58. List<Workpackage> childNodes = new ArrayList<Workpackage>();
  59.  
  60. while (!currentNodes.isEmpty()) {
  61.  
  62. Workpackage currentPackage = currentNodes.pop();
  63.  
  64. // If its not a start node we have to get the largest earliest finish of its
  65. // predecessors
  66. if (!startNodes.contains(currentPackage)) {
  67. Workpackage candidatePackage = null;
  68. for (Workpackage parPackage : currentPackage.getPredecessors()) {
  69. if (candidatePackage == null
  70. || parPackage.getEarliestFinish() > candidatePackage.getEarliestFinish()) {
  71. candidatePackage = parPackage;
  72. }
  73. }
  74. currentPackage.setEarliestStart(candidatePackage.getEarliestFinish());
  75. }
  76.  
  77. currentPackage.setEarliestFinish(currentPackage.getEarliestStart() + currentPackage.getDuration());
  78.  
  79. // If there are no successors we have a end-node
  80. if (currentPackage.getSuccessors().isEmpty()) {
  81. endNodes.add(currentPackage);
  82. } else {
  83. // Else add all children to the temp children list
  84. for (Workpackage childPackage : currentPackage.getSuccessors()) {
  85. childNodes.add(childPackage);
  86. }
  87. }
  88. }
  89.  
  90. for (Workpackage wp : childNodes) {
  91. currentNodes.push(wp);
  92. }
  93.  
  94. }
  95.  
  96. // ------------------------------------------------------------------------------|
  97. // RÜCKWÄRTS ALLES DURCHGEHEN
  98. // ------------------------------------------------------------------------------|
  99.  
  100. // Finde das package mit größten earliest finish
  101.  
  102. Workpackage candidatePackage = null;
  103. for (Workpackage wp : endNodes) {
  104. if (candidatePackage == null || wp.getEarliestFinish() > candidatePackage.getEarliestFinish()) {
  105. candidatePackage = wp;
  106. }
  107. }
  108.  
  109. for (Workpackage wp : endNodes) {
  110. wp.setLatestFinish(candidatePackage.getEarliestFinish());
  111. }
  112.  
  113. // Fülle die Stack initial mit den End-Nodes
  114. for (Workpackage wp : endNodes) {
  115. currentNodes.add(wp);
  116. }
  117.  
  118. while (!currentNodes.isEmpty()) {
  119.  
  120. List<Workpackage> parentNodes = new ArrayList<Workpackage>();
  121.  
  122. while (!currentNodes.isEmpty()) {
  123.  
  124. Workpackage currentPackage = currentNodes.pop();
  125.  
  126. // If its not a start node we have to get the smallest earliest finish of its
  127. // predecessors
  128. if (!endNodes.contains(currentPackage)) {
  129. candidatePackage = null;
  130. for (Workpackage succPackage : currentPackage.getSuccessors()) {
  131. if (candidatePackage == null
  132. || succPackage.getLatestStart() < candidatePackage.getLatestStart()) {
  133. candidatePackage = succPackage;
  134. }
  135. }
  136. currentPackage.setLatestFinish(candidatePackage.getLatestStart());
  137. }
  138.  
  139. currentPackage.setLatestStart(currentPackage.getLatestFinish() - currentPackage.getDuration());
  140. currentPackage.setSlack(currentPackage.getLatestStart() - currentPackage.getEarliestStart());
  141.  
  142. // Add all parents to the parent list
  143. if (!currentPackage.getPredecessors().isEmpty()) {
  144. for (Workpackage parentPackage : currentPackage.getPredecessors()) {
  145. parentNodes.add(parentPackage);
  146. }
  147. }
  148.  
  149. // Before going to the next package add this one to the allNodes list
  150. allNodes.add(currentPackage);
  151.  
  152. }
  153.  
  154. for (Workpackage wp : parentNodes) {
  155. currentNodes.push(wp);
  156. }
  157.  
  158. }
  159.  
  160. // ------------------------------------------------------------------------------|
  161. // KRITISCHE PFADE ERKENNEN
  162. // ------------------------------------------------------------------------------|
  163.  
  164. boolean isNoStartNode = true;
  165. Workpackage critPathNode = endNodes.stream().filter(x -> x.getSlack() == 0).findFirst().get();
  166.  
  167. while (isNoStartNode) {
  168. criticalPathNodes.add(critPathNode);
  169.  
  170. if (critPathNode.getPredecessors().isEmpty()) {
  171. isNoStartNode = false;
  172. } else {
  173. critPathNode = critPathNode.getPredecessors().stream().filter(x -> x.getSlack() == 0).findFirst().get();
  174. }
  175. }
  176.  
  177. }
  178.  
  179. private void resetLists() {
  180. currentNodes.clear();
  181. endNodes.clear();
  182. criticalPathNodes.clear();
  183. allNodes.clear();
  184. }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement