SimulationManager.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package holeg.ui.controller;
  2. import holeg.model.AbstractCanvasObject;
  3. import holeg.model.Edge;
  4. import holeg.model.Edge.EdgeState;
  5. import holeg.model.Holon;
  6. import holeg.model.HolonObject;
  7. import holeg.model.HolonSwitch;
  8. import holeg.model.HolonSwitch.SwitchState;
  9. import holeg.model.Model;
  10. import java.util.ArrayList;
  11. import java.util.HashSet;
  12. import java.util.LinkedList;
  13. import java.util.List;
  14. import java.util.ListIterator;
  15. import java.util.Optional;
  16. import java.util.Set;
  17. import java.util.logging.Logger;
  18. import java.util.stream.Collectors;
  19. public class SimulationManager {
  20. private static final Logger log = Logger.getLogger(SimulationManager.class.getName());
  21. private final Control control;
  22. public SimulationManager(Control control) {
  23. log.fine("Construct SimulationManager");
  24. this.control = control;
  25. }
  26. public void calculateStateForIteration(int timeStep) {
  27. Model model = control.getModel();
  28. model.getCanvas().getAllSwitchObjectsRecursive().forEach(sw -> sw.calculateState(timeStep));
  29. List<HolonObject> holonObjectList = model.getCanvas().getAllHolonObjectsRecursive()
  30. .collect(Collectors.toList());
  31. List<Edge> edgeList = new ArrayList<>(model.getEdgesOnCanvas());
  32. Set<Holon> holons = getHolons(holonObjectList, edgeList, timeStep);
  33. holons.forEach(Holon::calculate);
  34. model.holons = holons;
  35. }
  36. private Set<Holon> getHolons(List<HolonObject> holonObjectList, List<Edge> edgeList,
  37. int timeStep) {
  38. Set<Holon> holons = new HashSet<>();
  39. for (Holon holon : calculateHolonStructure(holonObjectList, edgeList)) {
  40. final float energyOnCables = holon.holonObjects.stream().map(hO -> {
  41. hO.calculateEnergy(timeStep);
  42. return hO.getActualEnergy();
  43. })
  44. .filter(energy -> energy > 0.0f).reduce(0.0f, (Float::sum));
  45. // find the edge with the energy supplied from his two connected objects are
  46. // the biggest, from all cables that the network give more energy than the
  47. // edge capacity.
  48. Optional<Edge> edge = holon.edges.stream()
  49. .filter(e -> energyOnCables > e.maxCapacity && e.mode == Edge.EdgeMode.Normal)
  50. .max((lhs, rhs) -> Float.compare(lhs.getEnergyFromConneted(),
  51. rhs.getEnergyFromConneted()));
  52. edge.ifPresentOrElse(e -> {
  53. //Burn Cable
  54. e.setState(EdgeState.Burned);
  55. e.setActualFlow(0.0f);
  56. //Split Holon
  57. holons.addAll(
  58. getHolons(new ArrayList<>(holon.holonObjects), new ArrayList<>(holon.edges), timeStep));
  59. }, () -> {
  60. holon.edges.forEach(e -> e.setActualFlow(energyOnCables));
  61. holons.add(holon);
  62. });
  63. }
  64. return holons;
  65. }
  66. Set<Holon> calculateHolonStructure(List<HolonObject> holonObjectList, List<Edge> edgeList) {
  67. Set<Holon> holons = new HashSet<>();
  68. while (!holonObjectList.isEmpty()) {
  69. // lookAt the first holonObject and find his neighbors
  70. HolonObject lookAtObject = holonObjectList.get(0);
  71. // delete out of list
  72. holonObjectList.remove(0);
  73. // create a new Network
  74. Holon actualNetwork = new Holon(lookAtObject);
  75. // create List of neighbors
  76. LinkedList<AbstractCanvasObject> neighbors = new LinkedList<>();
  77. populateListOfNeighbors(edgeList, lookAtObject, actualNetwork, neighbors);
  78. while (!neighbors.isEmpty()) {
  79. AbstractCanvasObject lookAtNeighbor = neighbors.getFirst();
  80. if (lookAtNeighbor instanceof HolonObject) {
  81. holonObjectList.remove(lookAtNeighbor);
  82. }
  83. actualNetwork.add(lookAtNeighbor);
  84. // When HolonSwitch Check if closed
  85. if (!(lookAtNeighbor instanceof HolonSwitch sw) || sw.getState() == SwitchState.Closed) {
  86. populateListOfNeighbors(edgeList, lookAtNeighbor, actualNetwork, neighbors);
  87. }
  88. neighbors.removeFirst();
  89. }
  90. holons.add(actualNetwork);
  91. }
  92. for (Edge e : edgeList) {
  93. e.setActualFlow(0.0f);
  94. }
  95. return holons;
  96. }
  97. /**
  98. * Adds neighbors.
  99. */
  100. void populateListOfNeighbors(List<Edge> edgeList, AbstractCanvasObject lookAtObject,
  101. Holon actualNetwork, LinkedList<AbstractCanvasObject> neighbors) {
  102. ListIterator<Edge> iter = edgeList.listIterator();
  103. while (iter.hasNext()) {
  104. Edge lookAtEdge = iter.next();
  105. if (lookAtEdge.getState() == EdgeState.Working && lookAtEdge.isConnectedTo(lookAtObject)) {
  106. iter.remove();
  107. actualNetwork.edges.add(lookAtEdge);
  108. // Add neighbor
  109. AbstractCanvasObject edgeNeighbor;
  110. if (lookAtEdge.getA().equals(lookAtObject)) {
  111. edgeNeighbor = lookAtEdge.getB();
  112. } else {
  113. edgeNeighbor = lookAtEdge.getA();
  114. }
  115. if (!neighbors.contains(edgeNeighbor)) {
  116. neighbors.add(edgeNeighbor);
  117. }
  118. }
  119. }
  120. }
  121. }