SimpleSelectionStrategy.java 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package algorithms.geneticAlgorithm.Components.Selections;
  2. import java.util.ArrayList;
  3. import java.util.Random;
  4. import algorithms.geneticAlgorithm.Components.GAIndividual;
  5. import algorithms.geneticAlgorithm.Components.GASelectionStrategy;
  6. public class SimpleSelectionStrategy<I extends GAIndividual> implements GASelectionStrategy<I>{
  7. public class Range{
  8. public double min;
  9. public double max;
  10. public Range(double min, double max){
  11. this.min = min;
  12. this.max = max;
  13. }
  14. }
  15. ArrayList<Range> rouletteWheel;
  16. ArrayList<I> currentPop;
  17. Random random;
  18. double maxRange;
  19. double minRange;
  20. public SimpleSelectionStrategy(){
  21. rouletteWheel = new ArrayList<Range>();
  22. random = new Random();
  23. currentPop = new ArrayList<I>();
  24. }
  25. @Override
  26. public void setCurrentPopulation(ArrayList<I> currentPopulation) {
  27. currentPop = currentPopulation;
  28. rouletteWheel.clear();
  29. double offSet = 0;
  30. double min = 0;
  31. double max = 0;
  32. for(I individual : currentPop){
  33. min = offSet;
  34. max = min + individual.getFittness();
  35. offSet = max;
  36. Range range = new Range(min, max);
  37. rouletteWheel.add(range);
  38. }
  39. maxRange = max;
  40. }
  41. @Override
  42. public ArrayList<I> selectIndividuals(){
  43. ArrayList<I> parents = new ArrayList<I>();
  44. parents.add(selectIndividual());
  45. parents.add(selectIndividual());
  46. return parents;
  47. }
  48. public I selectIndividual() {
  49. double randomValue = random.nextDouble() * maxRange;
  50. for(int i = 0; i < rouletteWheel.size(); i++){
  51. Range current = rouletteWheel.get(i);
  52. if(current.min <= randomValue && randomValue < current.max){
  53. return currentPop.get(i);
  54. }
  55. }
  56. return currentPop.get(random.nextInt(currentPop.size() - 1));
  57. }
  58. }