RouletteWheelElementaryImplementation.java
/**
* @(#)RouletteWheelElementaryImplementation.java
* Copyright (C) 2008-2011 delhezi.com
*
* This class is released under the:
* GNU Lesser General Public License (LGPL) version 3 or later.
* http://www.gnu.org/copyleft/lesser.html
*/
package com.delhezi.ga.selection;
import com.delhezi.ga.Chromosome;
import com.delhezi.ga.exception.GeneticAlgorithmException;
import java.util.ListIterator;
import java.util.LinkedList;
import java.util.Random;
//import java.util.logging.Logger;
/**
* Klasa <code>RouletteWheelElementaryImplementation</code>: Metoda ruletki
* implementacja elementarna;
* Liniowy koszt wykonania zależny od wielkości populacji;
*
* Metoda ruletki - (odmiana reprodukcji proporcjonalnej. W reprodukcji
* proporcjonalnej prawdopodobieństwo wyboru osobnika do puli rodzicielskiej
* zależne jest od wartości funkcji przystosowania danego osobnika;)
* @version 1.0 2010-01-10
* @author <a href="mailto:wojciech.wolszczak@delhezi.com">
* Wojciech Wolszczak</a>
*/
public class RouletteWheelElementaryImplementation
extends AbstractRouletteWheel implements ISelect {
/** Logger object. */
//private static final Logger LOGGER =
// Logger.getLogger(RouletteWheelElementaryImplementation.class.getName());
/** Delhezi Error Code. */
//private static final String DERC = "1-8-4-";
/** */
private static Random random = new Random();
/**
* Elementarna implementacja funkcji ruletki.
* @param chromosomes Lista chromosomów.
* @param normals Tablica z określonym prawdopodobieństwem wyboru dla
* każdego z chromosomów.
* @return Wynikowa list chromosomów.
* @since 1.0
*/
@Override
protected final LinkedList<Chromosome> rouletteWheelImpl(
final LinkedList<Chromosome> chromosomes,
final double [] normals) {
LinkedList<Chromosome> newChromosomes = new LinkedList<Chromosome>();
ListIterator<Chromosome> itr = chromosomes.listIterator(0);
int j = 0;
double roll;
boolean wylosowany;
Chromosome chTmp;
//Tworzymy uwzględniając przystosowanie NOWĄ listę chromosomów
//newChromosomes o wielkości równej chromosomes.size().
for (int i = 0; i < chromosomes.size(); i++) {
wylosowany = false;
while (wylosowany == false) { //Losujemy i-ty chromosom.
roll = random.nextDouble() / chromosomes.size();
chTmp = itr.next();
if (normals[j] >= roll) {
newChromosomes.add(chTmp.clone());
wylosowany = true;
}
//System.out.println("--j=" + j + ", random=" + roll +
//", prawd=" + normals[j] + ", wybr=" + wylosowany);
if (j == chromosomes.size() - 1) {
itr = chromosomes.listIterator(0);
j = 0;
} else {
j++;
}
}
}
return newChromosomes;
}
}