1 /**
2 * @(#)RouletteWheelElementaryImplementation.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.selection;
10
11 import com.delhezi.ga.Chromosome;
12 import com.delhezi.ga.exception.GeneticAlgorithmException;
13
14 import java.util.ListIterator;
15 import java.util.LinkedList;
16 import java.util.Random;
17 //import java.util.logging.Logger;
18
19 /**
20 * Klasa <code>RouletteWheelElementaryImplementation</code>: Metoda ruletki
21 * implementacja elementarna;
22 * Liniowy koszt wykonania zależny od wielkości populacji;
23 *
24 * Metoda ruletki - (odmiana reprodukcji proporcjonalnej. W reprodukcji
25 * proporcjonalnej prawdopodobieństwo wyboru osobnika do puli rodzicielskiej
26 * zależne jest od wartości funkcji przystosowania danego osobnika;)
27 * @version 1.0 2010-01-10
28 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
29 * Wojciech Wolszczak</a>
30 */
31 public class RouletteWheelElementaryImplementation
32 extends AbstractRouletteWheel implements ISelect {
33
34 /** Logger object. */
35 //private static final Logger LOGGER =
36 // Logger.getLogger(RouletteWheelElementaryImplementation.class.getName());
37
38 /** Delhezi Error Code. */
39 //private static final String DERC = "1-8-4-";
40
41 /** */
42 private static Random random = new Random();
43
44 /**
45 * Elementarna implementacja funkcji ruletki.
46 * @param chromosomes Lista chromosomów.
47 * @param normals Tablica z określonym prawdopodobieństwem wyboru dla
48 * każdego z chromosomów.
49 * @return Wynikowa list chromosomów.
50 * @since 1.0
51 */
52 @Override
53 protected final LinkedList<Chromosome> rouletteWheelImpl(
54 final LinkedList<Chromosome> chromosomes,
55 final double [] normals) {
56 LinkedList<Chromosome> newChromosomes = new LinkedList<Chromosome>();
57 ListIterator<Chromosome> itr = chromosomes.listIterator(0);
58
59 int j = 0;
60 double roll;
61 boolean wylosowany;
62 Chromosome chTmp;
63 //Tworzymy uwzględniając przystosowanie NOWĄ listę chromosomów
64 //newChromosomes o wielkości równej chromosomes.size().
65 for (int i = 0; i < chromosomes.size(); i++) {
66 wylosowany = false;
67 while (wylosowany == false) { //Losujemy i-ty chromosom.
68 roll = random.nextDouble() / chromosomes.size();
69
70 chTmp = itr.next();
71 if (normals[j] >= roll) {
72 newChromosomes.add(chTmp.clone());
73 wylosowany = true;
74 }
75
76 //System.out.println("--j=" + j + ", random=" + roll +
77 //", prawd=" + normals[j] + ", wybr=" + wylosowany);
78
79 if (j == chromosomes.size() - 1) {
80 itr = chromosomes.listIterator(0);
81 j = 0;
82 } else {
83 j++;
84 }
85 }
86 }
87 return newChromosomes;
88 }
89 }