GeneticAlgo.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package algorithms.geneticAlgorithm.Components;
  2. import java.util.ArrayList;
  3. import java.util.Random;
  4. import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
  5. public class GeneticAlgo<I extends HolegIndividual> {
  6. public int popSize;
  7. public ArrayList<I> population;
  8. public GAIndividualFactory<I> randomFactory;
  9. public GASelectionStrategy<I> selector;
  10. public GACrossoverStrategy<I> reproducer;
  11. public GAMutationStrategy<I> mutator;
  12. public GAFittnessFunctionStrategy<I> fittnessFunction;
  13. public double topPercent;
  14. public double buttomPercent;
  15. public GeneticAlgo(GASelectionStrategy<I> selection, GACrossoverStrategy<I> crossover, GAMutationStrategy<I> mutator,
  16. GAFittnessFunctionStrategy<I> fittnessFkt, GAIndividualFactory<I> factory, int popSize){
  17. this.selector = selection;
  18. this.reproducer = crossover;
  19. this.mutator = mutator;
  20. this.fittnessFunction = fittnessFkt;
  21. randomFactory = factory;
  22. this.popSize = popSize;
  23. population = new ArrayList<I>();
  24. topPercent = 0.0;
  25. //generateRandomPopulation();
  26. }
  27. public void generateRandomPopulation() {
  28. population = new ArrayList<I>();
  29. for(int i = 0; i < popSize; i++){
  30. population.add(randomFactory.createRandomIndividual());
  31. fittnessFunction.calculateFittness(population.get(i));
  32. }
  33. }
  34. public void createNextGeneration(){
  35. ArrayList<I> nextGen = new ArrayList<I>();
  36. int topBound = (int) Math.ceil(topPercent * popSize);
  37. //int topBound = 1;
  38. population = getSortedPopulation();
  39. for(I individual : population.subList(0, topBound)){
  40. ArrayList<I> childs = new ArrayList<I>();
  41. childs.add(individual);
  42. childs.add(individual);
  43. childs = reproducer.crossOver(childs);
  44. for(I i : childs){
  45. i.addLogEntry("Top % from previous gen");
  46. fittnessFunction.calculateFittness(i);
  47. nextGen.add(i);
  48. }
  49. }
  50. selector.setCurrentPopulation(population);
  51. while(nextGen.size() < popSize){
  52. ArrayList<I> freshInds = new ArrayList<I>();
  53. freshInds = reproducer.crossOver(selector.selectIndividuals());
  54. for(I i : freshInds){
  55. i = mutator.mutateIndividual(i);
  56. fittnessFunction.calculateFittness(i);
  57. }
  58. nextGen.addAll(freshInds);
  59. }
  60. if(popSize % 2 == 1){
  61. Random rnd = new Random();
  62. nextGen.remove(rnd.nextInt(popSize));
  63. }
  64. population = nextGen;
  65. }
  66. public ArrayList<I> getPopulation(){
  67. return population;
  68. }
  69. public ArrayList<I> getSortedPopulation(){
  70. return sortPopulation(population);
  71. }
  72. public ArrayList<I> sortPopulation(ArrayList<I> individuals){
  73. ArrayList<I> sortedList = new ArrayList<I>();
  74. for(I hI : individuals){
  75. for(int i = 0; i <= sortedList.size(); i++){
  76. if(i == sortedList.size()){
  77. sortedList.add(hI);
  78. break;
  79. }else if(sortedList.get(i).getFittness() < hI.getFittness()){
  80. sortedList.add(i, hI);
  81. break;
  82. }
  83. }
  84. }
  85. return sortedList;
  86. }
  87. }