View Javadoc
1   /**
2    * @(#)PopulationConstantSize.java
3    * Copyright (C) 2008-2011 delhezi.com
4    *
5    * This class is released under the:
6    * GNU Lesser General Public License (LGPL) version 3 or later.
7    * http://www.gnu.org/copyleft/lesser.html
8    */
9   package com.delhezi.ga;
10  
11  import com.delhezi.ga.crossover.ICrossover;
12  import com.delhezi.ga.crossover.factory.CrossoverFactory;
13  import com.delhezi.ga.crossover.factory.CrossoverOperatorType;
14  import com.delhezi.ga.exception.GeneticAlgorithmException;
15  import com.delhezi.ga.mutation.IMutation;
16  import com.delhezi.ga.mutation.factory.MutationFactory;
17  import com.delhezi.ga.mutation.factory.MutationOperatorType;
18  import com.delhezi.ga.selection.ISelect;
19  import com.delhezi.ga.selection.factory.SelectionFactory;
20  import com.delhezi.ga.selection.factory.SelectionMethodType;
21  import java.util.Collections;
22  import java.util.Iterator;
23  import java.util.LinkedList;
24  import java.util.Random;
25  import java.util.logging.Logger;
26  
27  /**
28   * <code>PopulationConstantSize</code>: Klasa populacji o stałej
29   * liczebności.
30   * @version 1.0 2009-06-10
31   * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
32   * Wojciech Wolszczak</a>
33   */
34  public final class PopulationConstantSize extends Population {
35  
36      /** Logger object. */
37      private static final Logger LOGGER =
38          Logger.getLogger(PopulationConstantSize.class.getName());
39  
40      /** Delhezi Error Code. */
41      private static final String DERC = "1-8-";
42  
43      /**
44       * Konstruktor.
45       * @param selectionMethod Funkcja celu.
46       * @param chromosomes Lista chromosomów.
47       * @param crossoverOperator Operator krzyżowania.
48       * @param crossoverProbability Prawdopdobiestwo krzyżowania.
49       * @param mutationOperator Operator mutacji.
50       * @param mutationProbability Prawdopodobiestwo mutacji.
51       * @param chromosomeProperties Referencja do obiektu przechowującego
52       * parametry wspólne dla wszystkich chromosomów w ramach jednej
53       * instancji populacji.
54       * @throws GeneticAlgorithmException xxx
55       * @since 1.0
56       */
57      private PopulationConstantSize(final SelectionMethodType selectionMethod,
58                           final LinkedList<Chromosome> chromosomes,
59                           final ICrossover crossoverOperator,
60                           final double crossoverProbability,
61                           final IMutation mutationOperator,
62                           final double mutationProbability,
63                           final ChromosomeProperties chromosomeProperties)
64      throws GeneticAlgorithmException {
65          super(chromosomes, crossoverOperator, crossoverProbability,
66                mutationOperator, mutationProbability, chromosomeProperties);
67          //W konstruktorze i metodzie clone inicjuj bezposrednio
68          //wartości zmiennych lub wywołuj tylko metody final.
69          this.select = SelectionFactory.getSelectionMethod(selectionMethod);
70      }
71  
72      /**
73       * Statyczna metoda factory.
74       * @param selectionMethod Funkcja celu.
75       * @param chromosomes Lista chromosomów.
76       * @param crossoverOperator Operator krzyżowania.
77       * @param crossProbability Prawdopdobiestwo krzyżowania.
78       * @param mutationOperator Operator mutacji.
79       * @param mutationProbability Prawdopodobiestwo mutacji.
80       * @param chromosomeProperties Referencja do obiektu przechowującego
81       * parametry wspólne dla wszystkich chromosomów w ramach jednej
82       * instancji populacji.
83       * @return Populacja o stałej liczebności.
84       * @throws GeneticAlgorithmException xxx
85       * @since 1.0
86       */
87      public static PopulationConstantSize newPopulationConstantSize(
88                          final SelectionMethodType selectionMethod,
89                          final LinkedList<Chromosome> chromosomes,
90                          final CrossoverOperatorType crossoverOperator,
91                          final double crossProbability,
92                          final MutationOperatorType mutationOperator,
93                          final double mutationProbability,
94                          final ChromosomeProperties chromosomeProperties)
95      throws GeneticAlgorithmException {
96          return new PopulationConstantSize(selectionMethod, chromosomes,
97                        CrossoverFactory.getCrossoverOperator(crossoverOperator),
98                        crossProbability,
99                        MutationFactory.getMutationOperator(mutationOperator),
100                       mutationProbability,
101                       chromosomeProperties);
102     }
103 
104   /**
105    * Statyczna metoda factory, pomocna przy przekształcaniu
106    * populacji o zmiennej liczebności na populację o stałej liczebności.
107    * @param selectionMethod Funkcja celu.
108    * @param chromosomes Lista chromosomów.
109    * @param crossoverOperator Operator krzyżowania.
110    * @param crossProbability Prawdopdobiestwo krzyżowania.
111    * @param mutationOperator Operator mutacji.
112    * @param mutationProbability Prawdopodobiestwo mutacji.
113    * @param chromosomeProperties Referencja do obiektu przechowującego
114    * parametry wspólne dla wszystkich chromosomów w ramach jednej
115    * instancji populacji.
116    * @return Populacja o stałej liczebności.
117    * @throws GeneticAlgorithmException xxx
118    * @since 1.0
119    */
120   public static PopulationConstantSize newPopulationConstantSize(
121                       final SelectionMethodType selectionMethod,
122                       final LinkedList<Chromosome> chromosomes,
123                       final ICrossover crossoverOperator,
124                       final double crossProbability,
125                       final IMutation mutationOperator,
126                       final double mutationProbability,
127                       final ChromosomeProperties chromosomeProperties)
128   throws GeneticAlgorithmException {
129       return new PopulationConstantSize(selectionMethod, chromosomes,
130                                         crossoverOperator,
131                                         crossProbability,
132                                         mutationOperator,
133                                         mutationProbability,
134                                         chromosomeProperties);
135       }
136 
137     /**
138      * Przekształca populację na populację o zmiennej liczebności.
139      * @param maxLT Maksymalny czas życia dopuszczalny dla chromosomu.
140      * @param minLT Minimalny czas życia dopuszczalny dla chromosomu.
141      * @return Populacja o zmiennej liczebności.
142      * @throws GeneticAlgorithmException xxx
143      * @since 1.0
144      */
145   public PopulationChangeableSize toPopulationChangeableSize(final int maxLT,
146                                          final int minLT)
147    throws GeneticAlgorithmException {
148     this.select = null; //czyszczenie
149     return PopulationChangeableSize.newPopulationChangeableSize(maxLT,
150                     minLT, getChromosomes(),
151                     getCrossover(), getCrossoverProbability(),
152                     getMutation(), getMutationProbability(),
153                     getChromosomeProperties());
154   }
155 
156     /**
157      * Tworzenie populacji: t+1 (wywołanie funkcji select,
158      * crossover i mutation).
159      * @throws GeneticAlgorithmException xxx
160      * @since 1.0
161      */
162     @Override
163     public void generation() throws GeneticAlgorithmException {
164 
165         super.incrementGeneration();
166 
167         Chromosome elitarChromosome = null;
168         if (super.getElitism()) {
169             elitarChromosome = super.getTopChromosome().clone();
170         }
171 
172         //System.out.println("++++++++++++++++++++++++++++" );
173         //for (Chromosome ch : super.getChromosomes()) {
174         //         System.out.println(ch);
175         //       }
176         // System.out.println("++++++++++++++++++++++++++++" );
177 
178         //Operacja selekcji.
179         super.setChromosomes(select.select(super.getChromosomes()));
180         // System.out.println("================================" );
181         // for (Chromosome ch : super.getChromosomes()) {
182         //         System.out.println(", chromosom = "
183         // + ch.getFitness(super.getFitnessFunction()));
184         //       }
185         // System.out.println("=================================" );
186 
187          //Ilość operacji krzyżowania (np. 100 * 0.7/2 = 35).
188          final int countCross =
189              (int) (this.getPopulationSize() * getCrossoverProbability() / 2);
190 
191          //KRZYŻOWANIE
192          //Mieszamy listę w celu losowego dobrania osobników do krzyżowania.
193          Collections.shuffle(super.getChromosomes(), random);
194          Iterator<Chromosome> itr1 =
195              super.getChromosomes().iterator(); //na początku listy
196          Iterator<Chromosome> itr2 =
197              super.getChromosomes().descendingIterator(); //na końcu listy
198          //Operacje krzyżowania.
199          for (int i = 0; i < countCross; i++) {
200              super.getCrossover().crossover(itr1.next(), itr2.next());
201              }
202          //Mutacja
203          //ZAMIAST W PETLI WSZYSTKIE TYLKO INDEXY TYCH CO MAJA
204          //BYC MUTOWANE WYBRAC!!!!
205          for (Chromosome ch : super.getChromosomes()) {
206              if (random.nextDouble() < super.getMutationProbability()) {
207                  ch.mutation(super.getMutation());
208                  }
209              }
210 
211 
212            //-------------------
213            Chromosome foundTopChromosome = super.findTopChromosome();
214 
215            //Jeśli w nowej populacji nie ma lepszego chromosomu niż ostatni
216            //elitarny mymieniamy ostatni chromosom populacji na
217            //chromosom elitarny.
218         if (super.getElitism() == true) {
219             if (elitarChromosome.compareTo(foundTopChromosome) == 1) {
220                 super.getChromosomes().removeLast();
221                 super.getChromosomes().add(elitarChromosome.clone());
222             } else if (elitarChromosome.compareTo(foundTopChromosome) == -1) {
223                 super.topChromosome = foundTopChromosome;
224                 super.topChromosomeGenerationFound = getGeneration();
225             }
226         } else {
227             super.topChromosome = foundTopChromosome;
228             //super.topChromosomeGenerationFound = getGeneration(); //bez sensu
229         }
230     }
231 
232     /**
233      * Ustawia referencję do obiektu implementującego funkcję selekcji.
234      * @param select Referencja do obiektu implementującego funkcję selekcji.
235      * @since 1.0
236      */
237     public void setSelect(final ISelect select) {
238         this.select = select;
239     }
240 
241     /**
242      * Ustawia referencję do obiektu implementującego funkcję selekcji.
243      * @param selectionMethod Funkcja celu.
244      * @throws GeneticAlgorithmException xxx
245      * @since 1.0
246      */
247     public void setSelect(final SelectionMethodType selectionMethod)
248     throws GeneticAlgorithmException {
249         this.select = SelectionFactory.getSelectionMethod(selectionMethod);
250     }
251 
252     /**
253      * Zwraca referencję do obiektu implementującego funkcję selekcji.
254      * @return Referencja do obiektu implementującego funkcję selekcji.
255      * @since 1.0
256      */
257     public ISelect getSelect() {
258         return this.select;
259     }
260 
261     /**
262      * Zmienia wielkość populacji.
263      * @param populationSize Wielkość populacji.
264      * @throws GeneticAlgorithmException xxx
265      * @since 1.0
266      */
267     public void changePopulationSize(final int populationSize)
268     throws GeneticAlgorithmException {
269         //Nie zaimplementowane jeszcze.
270     }
271 
272     /**
273      * String charakteryzujący populację.
274      * @return String charakteryzujący populację.
275      * @since 1.0
276      */
277     @Override
278     public String toString() {
279         String str = "[Population:]";
280         return str;
281         }
282 
283     /** Random. */
284     private static Random random = new Random();
285 
286     /** Referencja do obiektu implementującego funkcję selekcji. */
287     private ISelect select;
288 
289 }