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 }