View Javadoc
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  }