GenAlgoHandler.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package algorithms.geneticAlgorithm.holegGA;
  2. import java.util.ArrayList;
  3. import classes.AbstractCpsObject;
  4. import classes.Category;
  5. import classes.CpsEdge;
  6. import classes.Position;
  7. import ui.controller.Control;
  8. import ui.model.Model;
  9. import algorithms.geneticAlgorithm.Components.GAResultListener;
  10. import algorithms.geneticAlgorithm.holegGA.Components.HolegCrossover;
  11. import algorithms.geneticAlgorithm.holegGA.Components.HolegFactory;
  12. import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
  13. public class GenAlgoHandler {
  14. ArrayList<GAResultListener<HolegIndividual>> listeners = new ArrayList<GAResultListener<HolegIndividual>>();
  15. HolegFactory factory;
  16. Control controller;
  17. Model model;
  18. int genCount;
  19. boolean onlyNodes;
  20. public GenAlgoHandler(Control controller, Model model){
  21. this.controller = controller;
  22. this.model = model;
  23. genCount = 1;
  24. ArrayList<AbstractCpsObject> objSpace = new ArrayList<AbstractCpsObject>();
  25. for(Category cat : model.getCategories()){
  26. for(AbstractCpsObject obj : cat.getObjects()){
  27. objSpace.add(obj);
  28. }
  29. }
  30. ArrayList<AbstractCpsObject> origin = model.getObjectsOnCanvas();
  31. factory = new HolegFactory(objSpace, 5, 5);
  32. factory.originObjects = origin;
  33. onlyNodes = false;
  34. }
  35. public void createGeneration(int objAmount, int edgeAmount){
  36. factory.maxObjects = objAmount;
  37. factory.maxConnections = edgeAmount;
  38. factory.onlyNodes = onlyNodes;
  39. ArrayList<HolegIndividual> population = new ArrayList<HolegIndividual>();
  40. for(int i = 1; i <= 2; i++){
  41. population.add(factory.createRandomIndividual());
  42. }
  43. addPopulationListeners(genCount, population);
  44. genCount++;
  45. ArrayList<HolegIndividual> children = new ArrayList<HolegIndividual>();
  46. HolegCrossover hC = new HolegCrossover();
  47. //for(int j = 1; j <= 2; j++){
  48. children.addAll(hC.crossOver(population));
  49. //}
  50. addPopulationListeners(genCount, children);
  51. genCount++;
  52. }
  53. public void drawIndividual(HolegIndividual hI){
  54. if(hI.drawn){
  55. //draws Individual with the positions in the objects
  56. drawIndividualWithPos(hI);
  57. }else{
  58. //draws Individual as a default grid
  59. drawIndividualWithoutPos(hI);
  60. hI.drawn = true;
  61. }
  62. }
  63. public void drawIndividualWithPos(HolegIndividual hI){
  64. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  65. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  66. for(int i = 0; i < hI.getIndexes().size(); i++){
  67. controller.addObjectCanvas(hI.getObjectAt(i));
  68. }
  69. for(CpsEdge e : hI.getEdges()){
  70. controller.addEdgeOnCanvas(e);
  71. }
  72. }
  73. public void drawIndividualWithoutPos(HolegIndividual hI){
  74. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  75. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  76. int originBound = (int) Math.ceil(Math.sqrt(hI.originIndexes.size()));
  77. int row = -1;
  78. int x = 50;
  79. int y = 50;
  80. int dist = 100;
  81. boolean isX = true;
  82. int allBound = (int) Math.ceil(Math.sqrt(hI.indexes.size()));
  83. ArrayList<ArrayList<Integer>> objectField = new ArrayList<ArrayList<Integer>>();
  84. for(int i = 0; i < hI.originIndexes.size(); i++){
  85. if(i % originBound == 0){
  86. row++;
  87. objectField.add(new ArrayList<Integer>());
  88. }
  89. objectField.get(row).add(hI.originIndexes.get(i));
  90. }
  91. row = 0;
  92. for(int j = hI.originIndexes.size(); j < hI.indexes.size(); j++){
  93. boolean inserted = false;
  94. while(!inserted){
  95. if(objectField.size() <= row){
  96. objectField.add(new ArrayList<Integer>());
  97. objectField.get(row).add(hI.indexes.get(j));
  98. inserted = true;
  99. }else{
  100. if(objectField.get(row).size() < allBound){
  101. objectField.get(row).add(hI.indexes.get(j));
  102. inserted = true;
  103. }else{
  104. row++;
  105. }
  106. }
  107. }
  108. }
  109. for(int k = 0; k < objectField.size(); k++){
  110. for(int l = 0; l < objectField.get(k).size(); l++){
  111. AbstractCpsObject toDraw = hI.getObjectWithIndex(objectField.get(k).get(l));
  112. toDraw.setPosition(new Position(x + (l*dist), y +(k*dist)));
  113. controller.addObjectCanvas(toDraw);
  114. }
  115. }
  116. for(CpsEdge e : hI.getEdges()){
  117. controller.addEdgeOnCanvas(e);
  118. }
  119. }
  120. public void addListener(GAResultListener<HolegIndividual> listener){
  121. listeners.add(listener);
  122. }
  123. public void addPopulationListeners(int generation, ArrayList<HolegIndividual> population){
  124. for(GAResultListener<HolegIndividual> listener : listeners){
  125. listener.populationCreated(generation, population);
  126. }
  127. }
  128. }