GenAlgoHandler.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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.Components.GeneticAlgo;
  11. import algorithms.geneticAlgorithm.Components.Selections.TournamentRankSelection;
  12. import algorithms.geneticAlgorithm.Components.Selections.TournamentSelectionStrategy;
  13. import algorithms.geneticAlgorithm.holegGA.Components.HolegCrossover;
  14. import algorithms.geneticAlgorithm.holegGA.Components.HolegFactory;
  15. import algorithms.geneticAlgorithm.holegGA.Components.HolegFittnessFkt;
  16. import algorithms.geneticAlgorithm.holegGA.Components.HolegFittnessScenario;
  17. import algorithms.geneticAlgorithm.holegGA.Components.HolegGeneration;
  18. import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
  19. import algorithms.geneticAlgorithm.holegGA.Components.HolegMutation;
  20. public class GenAlgoHandler {
  21. ArrayList<GAResultListener<HolegIndividual>> listeners = new ArrayList<GAResultListener<HolegIndividual>>();
  22. HolegFactory factory;
  23. Control controller;
  24. Model model;
  25. int genCount;
  26. public int popSize;
  27. public int tournamentSize;
  28. public double tournamentProb;
  29. boolean onlyNodes;
  30. GeneticAlgo<HolegIndividual> holegGA;
  31. TournamentRankSelection<HolegIndividual> tRS;
  32. HolegMutation hM;
  33. HolegCrossover hC;
  34. ArrayList<AbstractCpsObject> objSpace;
  35. public GenAlgoHandler(Control controller, Model model){
  36. this.controller = controller;
  37. this.model = model;
  38. genCount = 1;
  39. popSize = 100;
  40. objSpace = new ArrayList<AbstractCpsObject>();
  41. for(Category cat : model.getCategories()){
  42. for(AbstractCpsObject obj : cat.getObjects()){
  43. objSpace.add(obj);
  44. }
  45. }
  46. ArrayList<AbstractCpsObject> origin = model.getObjectsOnCanvas();
  47. factory = new HolegFactory(objSpace, 0, 0);
  48. factory.originObjects = origin;
  49. onlyNodes = false;
  50. hC = new HolegCrossover();
  51. //HolegFittnessFkt hF = new HolegFittnessFkt(controller);
  52. HolegFittnessScenario hF = new HolegFittnessScenario(controller);
  53. hM = new HolegMutation(0.01);
  54. hM.setObjectSpace(objSpace);
  55. tRS = new TournamentRankSelection<HolegIndividual>();
  56. holegGA = new GeneticAlgo<HolegIndividual>(tRS, hC, hM, hF, factory, popSize);
  57. }
  58. public void createGeneration(int objAmount, int edgeAmount){
  59. factory.maxObjects = objAmount;
  60. factory.maxConnections = edgeAmount;
  61. factory.onlyNodes = onlyNodes;
  62. holegGA.popSize = popSize;
  63. tRS.tournamentSize = tournamentSize;
  64. if(genCount == 1){
  65. holegGA.generateRandomPopulation();
  66. HolegGeneration holegGen = new HolegGeneration(genCount);
  67. holegGen.setGeneration(holegGA.getSortedPopulation());
  68. addPopulationListeners(holegGen);
  69. //addPopulationListeners(genCount, sortPopulation(holegGA.getPopulation()));
  70. //addPopulationListeners(genCount, holegGA.getPopulation());
  71. }else{
  72. holegGA.createNextGeneration();
  73. HolegGeneration holegGen = new HolegGeneration(genCount);
  74. holegGen.setGeneration(holegGA.getSortedPopulation());
  75. addPopulationListeners(holegGen);
  76. //addPopulationListeners(genCount, sortPopulation(holegGA.getPopulation()));
  77. }
  78. genCount++;
  79. }
  80. public void mutationTest(int objAmount, int edgeAmount){
  81. factory.maxObjects = objAmount;
  82. factory.maxConnections = edgeAmount;
  83. factory.onlyNodes = onlyNodes;
  84. HolegIndividual parent = factory.createRandomIndividual();
  85. ArrayList<HolegIndividual> jo = new ArrayList<HolegIndividual>();
  86. jo.add(parent);
  87. jo.add(parent);
  88. HolegGeneration joGen = new HolegGeneration(genCount);
  89. joGen.setGeneration(jo);
  90. addPopulationListeners(joGen);
  91. genCount++;
  92. ArrayList<HolegIndividual> jo2 = new ArrayList<HolegIndividual>();
  93. HolegIndividual removeObject = hC.crossOver(jo).get(0);
  94. HolegIndividual addObject = hC.crossOver(jo).get(0);
  95. HolegIndividual changeObject = hC.crossOver(jo).get(0);
  96. HolegIndividual removeEdge = hC.crossOver(jo).get(0);
  97. HolegIndividual addEdge = hC.crossOver(jo).get(0);
  98. HolegIndividual changeEdge = hC.crossOver(jo).get(0);
  99. hM.removeObject(removeObject);
  100. hM.addObject(addObject);
  101. hM.changeObject(changeObject);
  102. hM.removeEdge(removeEdge);
  103. hM.addEdge(addEdge);
  104. hM.changeEdge(changeEdge);
  105. jo2.add(removeObject);
  106. jo2.add(addObject);
  107. jo2.add(changeObject);
  108. jo2.add(removeEdge);
  109. jo2.add(addEdge);
  110. jo2.add(changeEdge);
  111. HolegGeneration jo2Gen = new HolegGeneration(genCount);
  112. jo2Gen.setGeneration(jo2);
  113. addPopulationListeners(jo2Gen);
  114. genCount++;
  115. }
  116. public void drawIndividual(HolegIndividual hI){
  117. if(hI.drawn){
  118. //draws Individual with the positions in the objects
  119. drawIndividualWithPos(hI);
  120. }else{
  121. //draws Individual as a default grid
  122. drawIndividualWithoutPos(hI);
  123. hI.drawn = true;
  124. }
  125. }
  126. public void drawIndividualWithPos(HolegIndividual hI){
  127. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  128. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  129. for(int i = 0; i < hI.getIndexes().size(); i++){
  130. controller.addObjectCanvas(hI.getObjectAt(i));
  131. }
  132. for(CpsEdge e : hI.getEdges()){
  133. controller.addEdgeOnCanvas(e);
  134. }
  135. }
  136. public void drawIndividualWithoutPos(HolegIndividual hI){
  137. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  138. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  139. int originBound = (int) Math.ceil(Math.sqrt(hI.originIndexes.size()));
  140. int row = -1;
  141. int x = 50;
  142. int y = 50;
  143. int dist = 100;
  144. boolean isX = true;
  145. int allBound = (int) Math.ceil(Math.sqrt(hI.indexes.size()));
  146. ArrayList<ArrayList<Integer>> objectField = new ArrayList<ArrayList<Integer>>();
  147. for(int i = 0; i < hI.originIndexes.size(); i++){
  148. if(i % originBound == 0){
  149. row++;
  150. objectField.add(new ArrayList<Integer>());
  151. }
  152. objectField.get(row).add(hI.originIndexes.get(i));
  153. }
  154. row = 0;
  155. for(int j = hI.originIndexes.size(); j < hI.indexes.size(); j++){
  156. boolean inserted = false;
  157. while(!inserted){
  158. if(objectField.size() <= row){
  159. objectField.add(new ArrayList<Integer>());
  160. objectField.get(row).add(hI.indexes.get(j));
  161. inserted = true;
  162. }else{
  163. if(objectField.get(row).size() < allBound){
  164. objectField.get(row).add(hI.indexes.get(j));
  165. inserted = true;
  166. }else{
  167. row++;
  168. }
  169. }
  170. }
  171. }
  172. for(int k = 0; k < objectField.size(); k++){
  173. for(int l = 0; l < objectField.get(k).size(); l++){
  174. AbstractCpsObject toDraw = hI.getObjectWithIndex(objectField.get(k).get(l));
  175. toDraw.setPosition(new Position(x + (l*dist), y +(k*dist)));
  176. controller.addObjectCanvas(toDraw);
  177. }
  178. }
  179. for(CpsEdge e : hI.getEdges()){
  180. controller.addEdgeOnCanvas(e);
  181. }
  182. }
  183. public void addListener(GAResultListener<HolegIndividual> listener){
  184. listeners.add(listener);
  185. }
  186. public void addPopulationListeners(HolegGeneration holegGen){
  187. for(GAResultListener<HolegIndividual> listener : listeners){
  188. listener.populationCreated(holegGen);
  189. }
  190. }
  191. public ArrayList<HolegIndividual> sortPopulation(ArrayList<HolegIndividual> individuals){
  192. ArrayList<HolegIndividual> sortedList = new ArrayList<HolegIndividual>();
  193. for(HolegIndividual hI : individuals){
  194. for(int i = 0; i <= sortedList.size(); i++){
  195. if(i == sortedList.size()){
  196. sortedList.add(hI);
  197. break;
  198. }else if(sortedList.get(i).getFittness() < hI.getFittness()){
  199. sortedList.add(i, hI);
  200. break;
  201. }
  202. }
  203. }
  204. return sortedList;
  205. }
  206. }