GreedySinglePass.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package algorithm.binary;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.concurrent.atomic.AtomicInteger;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9. import api.AlgorithmFrameworkFlex;
  10. import classes.AbstractCanvasObject;
  11. import classes.Flexibility;
  12. import classes.GroupNode;
  13. import classes.HolonElement;
  14. import classes.HolonObject;
  15. import classes.HolonSwitch;
  16. import ui.model.Model;
  17. import utility.StringFormat;
  18. import utility.Tuple;
  19. public class GreedySinglePass extends AlgorithmFrameworkFlex {
  20. private int problemSize = 0;
  21. private boolean moreInformation = false;
  22. public GreedySinglePass() {
  23. super();
  24. addBooleanParameter("More Information", moreInformation, booleanValue -> moreInformation = booleanValue);
  25. }
  26. protected List<Integer> generateRandomLayerIndexList() {
  27. Model model = control.getModel();
  28. List<AbstractCanvasObject> nodes = (dGroupNode != null) ? dGroupNode.getModel().getNodes()
  29. : model.getObjectsOnCanvas();
  30. List<Tuple<AbstractCanvasObject, Integer>> extractedObjects = new ArrayList<>();
  31. rollOut(nodes.stream(), extractedObjects, 0);
  32. // Group With Layer
  33. Map<Integer, List<AbstractCanvasObject>> sortetObjects = extractedObjects.stream().collect(
  34. Collectors.groupingBy(Tuple::getSecond, Collectors.mapping(Tuple::getFirst, Collectors.toList())));
  35. AtomicInteger count = new AtomicInteger(0);
  36. List<Integer> indexList = new ArrayList<>();
  37. //Generate Access and shuffle layer
  38. sortetObjects.entrySet().stream()
  39. //ReverseOrder
  40. .sorted((layer0, layer1) -> -Integer.compare(layer0.getKey(), layer1.getKey()))
  41. //radomizeIndexes
  42. .forEach(entry -> {
  43. List<Integer> indexesInLayer = entry.getValue().stream().map(node -> count.getAndIncrement()).collect(Collectors.toList());
  44. //Randomize Layer
  45. Collections.shuffle(indexesInLayer);
  46. indexList.addAll(indexesInLayer);
  47. });
  48. //System.out.println(indexList.stream().map(Object::toString).collect(Collectors.joining(", ")));
  49. return indexList;
  50. }
  51. protected void rollOut(Stream<AbstractCanvasObject> nodes, List<Tuple<AbstractCanvasObject, Integer>> objects,
  52. int layer) {
  53. nodes.forEach(node -> {
  54. if (node instanceof HolonObject) {
  55. HolonObject hObject = (HolonObject) node;
  56. if (this.algoUseKillSwitch) {
  57. objects.add(new Tuple<>(node, layer));
  58. }
  59. if (this.algoUseElements) {
  60. for (@SuppressWarnings("unused") HolonElement hE : hObject.getElements()) {
  61. objects.add(new Tuple<>(node, layer));
  62. }
  63. }
  64. if (this.algoUseFlexes) {
  65. for (HolonElement hE : hObject.getElements()) {
  66. for(Flexibility flex : hE.flexList) {
  67. switch(control.getSimManager().getActualFlexManager().getFlexWrapperFromFlexibility(flex).getState()) {
  68. case IN_USE:
  69. case ON_COOLDOWN:
  70. objects.add(new Tuple<>(node, layer));
  71. break;
  72. case OFFERED:
  73. objects.add(new Tuple<>(node, layer));
  74. break;
  75. case NOT_OFFERED:
  76. case UNAVAILABLE:
  77. default:
  78. break;
  79. }
  80. }
  81. }
  82. }
  83. } else if (node instanceof HolonSwitch && algoUseSwitches) {
  84. objects.add(new Tuple<>(node, layer));
  85. }else if (node instanceof GroupNode ) {
  86. GroupNode groupNode = (GroupNode) node;
  87. rollOut(groupNode.getNodes().stream(), objects, layer +1);
  88. }
  89. });
  90. }
  91. @Override
  92. protected Individual executeAlgo() {
  93. Individual best = new Individual();
  94. best.position = extractPositionAndAccess();
  95. println("Bit-Array_length: " + best.position.size());
  96. best.fitness = evaluatePosition(best.position);
  97. List<Double> runList = new ArrayList<Double>();
  98. runList.add(best.fitness);
  99. println("Start with: " + StringFormat.doubleFixedPlaces(2, best.fitness));
  100. problemSize = best.position.size();
  101. Individual bestFound = new Individual(best);
  102. bestFound.fitness = Float.MAX_VALUE;
  103. Individual start = new Individual(best);
  104. List<Integer> radomizedForEachLayerIndexList = generateRandomLayerIndexList();
  105. for (Integer index : radomizedForEachLayerIndexList) {
  106. boolean actualValue = start.position.get(index);
  107. start.position.set(index, !actualValue);
  108. double fitness = evaluatePosition(start.position);
  109. boolean kicked = fitness < bestFound.fitness;
  110. if (kicked) {
  111. bestFound = new Individual(start);
  112. bestFound.fitness = fitness;
  113. } else {
  114. start.position.set(index, actualValue);
  115. }
  116. if (bestFound.fitness < best.fitness) {
  117. best = bestFound;
  118. }
  119. runList.add(bestFound.fitness);
  120. if (cancel)
  121. return null;
  122. println("Fitness: " + fitness + "\tFlippedIndex = " + index + "(" + problemSize + ")" + kicked);
  123. }
  124. console.println("Fitness: " + bestFound.fitness);
  125. this.runList = runList;
  126. return best;
  127. }
  128. protected void println(String value) {
  129. if (moreInformation)
  130. console.println(value);
  131. }
  132. @Override
  133. protected int getProgressBarMaxCount() {
  134. List<Boolean> best = extractPositionAndAccess();
  135. problemSize = best.size();
  136. return problemSize * rounds;
  137. }
  138. @Override
  139. protected String algoInformationToPrint() {
  140. return "NoParameter";
  141. }
  142. @Override
  143. protected String plottFileName() {
  144. return "plottGreedyRandom.txt";
  145. }
  146. }