GenAlgoHandler.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package algorithms.geneticAlgorithm.holegGA;
  2. import java.util.ArrayList;
  3. import javax.swing.JTextField;
  4. import classes.AbstractCpsObject;
  5. import classes.Category;
  6. import classes.CpsEdge;
  7. import classes.CpsNode;
  8. import classes.HolonWildCard;
  9. import classes.Position;
  10. import ui.controller.Control;
  11. import ui.model.Model;
  12. import algorithms.geneticAlgorithm.Components.GAResultListener;
  13. import algorithms.geneticAlgorithm.Components.GASelectionStrategy;
  14. import algorithms.geneticAlgorithm.Components.GeneticAlgo;
  15. import algorithms.geneticAlgorithm.Components.Selections.TournamentProportionalSelection;
  16. import algorithms.geneticAlgorithm.Components.Selections.TournamentRankSelection;
  17. import algorithms.geneticAlgorithm.Components.Selections.TournamentSelectionStrategy;
  18. import algorithms.geneticAlgorithm.holegGA.Components.HolegCrossover;
  19. import algorithms.geneticAlgorithm.holegGA.Components.HolegFactory;
  20. import algorithms.geneticAlgorithm.holegGA.Components.HolegFittnessFkt;
  21. import algorithms.geneticAlgorithm.holegGA.Components.HolegFittnessScenario;
  22. import algorithms.geneticAlgorithm.holegGA.Components.HolegGeneration;
  23. import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
  24. import algorithms.geneticAlgorithm.holegGA.Components.HolegMutation;
  25. public class GenAlgoHandler {
  26. ArrayList<GAResultListener<HolegIndividual>> listeners = new ArrayList<GAResultListener<HolegIndividual>>();
  27. HolegFactory factory;
  28. Control controller;
  29. Model model;
  30. int genCount;
  31. GeneticAlgo<HolegIndividual> holegGA;
  32. TournamentSelectionStrategy tRS;
  33. //TournamentRankSelection<HolegIndividual> tRS;
  34. //TournamentProportionalSelection<HolegIndividual> tRS;
  35. HolegFittnessScenario hF;
  36. HolegMutation hM;
  37. HolegCrossover hC;
  38. ArrayList<AbstractCpsObject> objSpace;
  39. CpsNode theNode = new CpsNode("Node");
  40. public GenAlgoHandler(Control controller, Model model){
  41. this.controller = controller;
  42. this.model = model;
  43. genCount = 1;
  44. objSpace = new ArrayList<AbstractCpsObject>();
  45. for(Category cat : model.getCategories()){
  46. for(AbstractCpsObject obj : cat.getObjects()){
  47. if(!(obj instanceof HolonWildCard) && obj.useForGA){
  48. objSpace.add(obj);
  49. }
  50. }
  51. }
  52. ArrayList<AbstractCpsObject> origin = model.getObjectsOnCanvas();
  53. ArrayList<CpsEdge> edges = model.getEdgesOnCanvas();
  54. factory = new HolegFactory(objSpace, 0, 0);
  55. factory.originalObjects = origin;
  56. factory.originalEdges = edges;
  57. hC = new HolegCrossover();
  58. hF = new HolegFittnessScenario(controller);
  59. hM = new HolegMutation(0.01);
  60. hM.setObjectSpace(objSpace);
  61. tRS = new TournamentSelectionStrategy<HolegIndividual>();
  62. //tRS = new TournamentRankSelection<HolegIndividual>();
  63. //tRS = new TournamentProportionalSelection<HolegIndividual>();
  64. holegGA = new GeneticAlgo<HolegIndividual>(tRS, hC, hM, hF, factory, 0);
  65. }
  66. public void createGeneration(int genAmount, ParameterArray params){
  67. factory.maxConnections = (int)params.get(params.MAX_EDGES);
  68. factory.editEdges = (boolean)params.get(params.EDIT_EDGES);
  69. holegGA.popSize = (int)params.get(params.POPULATION_SIZE);
  70. tRS.tournamentSize = (int)params.get(params.TOURNAMENT_SIZE);
  71. tRS.selectProb = (double)params.get(params.TOURNAMENT_PROB);
  72. hF.setParameters(params);
  73. if((boolean)params.get(params.NODES_IN_WILDCARDS)){
  74. if(!objSpace.contains(theNode)){
  75. objSpace.add(theNode);
  76. }else{
  77. objSpace.remove(theNode);
  78. }
  79. }
  80. hM.setParameters(params);
  81. for(int i = 0; i < genAmount; i++){
  82. hF.initialize();
  83. if(genCount == 1){
  84. holegGA.generateRandomPopulation();
  85. HolegGeneration holegGen = new HolegGeneration(genCount);
  86. holegGen.setGeneration(holegGA.getSortedPopulation());
  87. addGenToPopulationListeners(holegGen);
  88. }else{
  89. holegGA.createNextGeneration();
  90. HolegGeneration holegGen = new HolegGeneration(genCount);
  91. holegGen.setGeneration(holegGA.getSortedPopulation());
  92. addGenToPopulationListeners(holegGen);
  93. }
  94. genCount++;
  95. }
  96. }
  97. public void drawIndividualWithPos(HolegIndividual hI){
  98. model.setObjectsOnCanvas(new ArrayList<AbstractCpsObject>());
  99. model.setEdgesOnCanvas(new ArrayList<CpsEdge>());
  100. hI.configurateNetwork();
  101. for(int i = 0; i < hI.getIndexes().size(); i++){
  102. controller.addObjectCanvas(hI.getObjectAt(i));
  103. }
  104. for(GAEdge e : hI.getAllEdges()){
  105. controller.addEdgeOnCanvas(e);
  106. }
  107. }
  108. public void addListener(GAResultListener<HolegIndividual> listener){
  109. listeners.add(listener);
  110. }
  111. public void addGenToPopulationListeners(HolegGeneration holegGen){
  112. for(GAResultListener<HolegIndividual> listener : listeners){
  113. listener.populationCreated(holegGen);
  114. }
  115. }
  116. public ArrayList<HolegIndividual> sortPopulation(ArrayList<HolegIndividual> individuals){
  117. ArrayList<HolegIndividual> sortedList = new ArrayList<HolegIndividual>();
  118. for(HolegIndividual hI : individuals){
  119. for(int i = 0; i <= sortedList.size(); i++){
  120. if(i == sortedList.size()){
  121. sortedList.add(hI);
  122. break;
  123. }else if(sortedList.get(i).getFittness() < hI.getFittness()){
  124. sortedList.add(i, hI);
  125. break;
  126. }
  127. }
  128. }
  129. return sortedList;
  130. }
  131. public void setOriginalNetwork(){
  132. HolegIndividual originIndividual = new HolegIndividual(model.getObjectsOnCanvas(),
  133. model.getEdgesOnCanvas());
  134. HolegGeneration originalGen = new HolegGeneration(HolegGeneration.ORIGINAL_GEN);
  135. hF.calculateFittness(originIndividual);
  136. ArrayList<HolegIndividual> population = new ArrayList<HolegIndividual>();
  137. population.add(originIndividual);
  138. originalGen.setGeneration(population);
  139. addGenToPopulationListeners(originalGen);
  140. }
  141. }