TournamentProportionalSelection.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package algorithms.geneticAlgorithm.Components.Selections;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Random;
  5. import algorithms.geneticAlgorithm.Components.GAIndividual;
  6. import algorithms.geneticAlgorithm.Components.GASelectionStrategy;
  7. public class TournamentProportionalSelection<I extends GAIndividual> implements GASelectionStrategy<I>{
  8. public class Range{
  9. public double min;
  10. public double max;
  11. public Range(double min, double max){
  12. this.min = min;
  13. this.max = max;
  14. }
  15. }
  16. private ArrayList<I> currentPop;
  17. public int tournamentSize;
  18. private Random rng;
  19. private ArrayList<Range> tournamentWheel;
  20. public ArrayList<I> competitors;
  21. //public double selectProb;
  22. private double maxRange;
  23. public TournamentProportionalSelection(){
  24. currentPop = new ArrayList<I>();
  25. tournamentSize = 1;
  26. rng = new Random();
  27. }
  28. public TournamentProportionalSelection(int tSize){
  29. currentPop = new ArrayList<I>();
  30. rng = new Random();
  31. tournamentSize = tSize;
  32. }
  33. @Override
  34. public void setCurrentPopulation(ArrayList<I> population) {
  35. currentPop.clear();
  36. currentPop.addAll(population);
  37. }
  38. public void setTournamentSize(int size){
  39. if(size <= 0){
  40. tournamentSize = 1;
  41. }else{
  42. tournamentSize = size;
  43. }
  44. }
  45. @Override
  46. public ArrayList<I> selectIndividuals() {
  47. ArrayList<I> parents = new ArrayList<I>();
  48. parents.add(selectSingleIndividual());
  49. parents.add(selectSingleIndividual());
  50. return parents;
  51. }
  52. public I selectSingleIndividual(){
  53. tournamentSelection();
  54. if(competitors.get(competitors.size()-1).getFittness() <= 0){
  55. normalizedWheelInit();
  56. }else{
  57. proportionalWheelInit();
  58. }
  59. //initWheel();
  60. double index = rng.nextDouble() * maxRange;
  61. for(int i = 0; i < tournamentWheel.size(); i++){
  62. if(index >= tournamentWheel.get(i).min && index <= tournamentWheel.get(i).max){
  63. return competitors.get(i);
  64. }
  65. }
  66. return competitors.get(rng.nextInt(competitors.size()));
  67. }
  68. public void tournamentSelection(){
  69. competitors = new ArrayList<I>();
  70. Collections.shuffle(currentPop);
  71. for(int i = 0; i < tournamentSize; i++){
  72. I candidate = currentPop.get(i);
  73. int size = competitors.size();
  74. for(int j = 0; j <= size; j++){
  75. if(j != size){
  76. if(competitors.get(j).getFittness() < candidate.getFittness()){
  77. competitors.add(j, candidate);
  78. break;
  79. }
  80. }else{
  81. competitors.add(candidate);
  82. }
  83. }
  84. }
  85. }
  86. public I chooseCandidate(){
  87. int index = rng.nextInt(currentPop.size());
  88. I candidate = currentPop.get(index);
  89. return candidate;
  90. }
  91. public void initWheel(){
  92. tournamentWheel = new ArrayList<Range>();
  93. maxRange = 0;
  94. double smallestFittness = competitors.get(competitors.size()).getFittness();
  95. double biggestFittness = competitors.get(0).getFittness();
  96. double distance = biggestFittness - smallestFittness;
  97. double fittnessSum = 0;
  98. for(GAIndividual i : competitors){
  99. fittnessSum += i.getFittness();
  100. }
  101. if(smallestFittness <= 0){
  102. smallestFittness = 0 - smallestFittness;
  103. }
  104. fittnessSum += competitors.size() * smallestFittness;
  105. double avgFittness = fittnessSum / competitors.size();
  106. double relativeSizeFactor = 1;
  107. if(distance != 0){
  108. relativeSizeFactor = distance/avgFittness;
  109. }
  110. double addedValue = (fittnessSum / relativeSizeFactor) * (1/competitors.size());
  111. fittnessSum += competitors.size() * addedValue;
  112. for(GAIndividual i : competitors){
  113. Range range = new Range(maxRange, maxRange + i.getFittness() + smallestFittness + addedValue);
  114. tournamentWheel.add(range);
  115. maxRange += maxRange + i.getFittness() + smallestFittness + addedValue;
  116. i.addLogEntry("Selection Prob: " +
  117. (fittnessSum/(i.getFittness()+smallestFittness+addedValue))*100 + "%");
  118. }
  119. }
  120. public void normalizedWheelInit(){
  121. tournamentWheel = new ArrayList<Range>();
  122. maxRange = 0;
  123. double smallestFittness = competitors.get(competitors.size()-1).getFittness();
  124. double biggestFittness = competitors.get(0).getFittness();
  125. //System.out.println("smallest: " + smallestFittness);
  126. //System.out.println("biggest: " + biggestFittness);
  127. double distance = biggestFittness - smallestFittness;
  128. //System.out.println("distance: " + distance);
  129. smallestFittness = Math.abs(smallestFittness);
  130. biggestFittness = Math.abs(smallestFittness);
  131. double fittnessSum = 0;
  132. for(GAIndividual i : competitors){
  133. fittnessSum += i.getFittness();
  134. }
  135. fittnessSum += (smallestFittness)*competitors.size();
  136. double relativeMaxSizeFactor = 1;
  137. double relativeMinSizeFactor = 1;
  138. if(distance > 0){
  139. relativeMaxSizeFactor = distance/biggestFittness;
  140. if(smallestFittness > 0){
  141. relativeMinSizeFactor = distance/smallestFittness;
  142. }
  143. }
  144. double avgRelativeSizeFactor = relativeMaxSizeFactor + relativeMinSizeFactor;
  145. avgRelativeSizeFactor = avgRelativeSizeFactor/2;
  146. double addedValue = fittnessSum / avgRelativeSizeFactor;
  147. fittnessSum += addedValue;
  148. addedValue = addedValue/competitors.size();
  149. maxRange = 0;
  150. for(GAIndividual i : competitors){
  151. double rangeEnd = maxRange + i.getFittness() + smallestFittness + addedValue;
  152. Range range = new Range(maxRange, rangeEnd);
  153. i.addLogEntry("Selection Prob : " + ((rangeEnd - maxRange)/fittnessSum)*100
  154. + "%");
  155. maxRange = rangeEnd;
  156. }
  157. }
  158. public void proportionalWheelInit(){
  159. tournamentWheel = new ArrayList<Range>();
  160. maxRange = 0;
  161. for(GAIndividual i : competitors){
  162. Range range = new Range(maxRange, maxRange + i.getFittness());
  163. maxRange += maxRange + i.getFittness();
  164. i.addLogEntry("proportional Selection");
  165. }
  166. }
  167. }