Tournament.java
/**
* @(#)Tournament.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.LinkedList;
import java.util.Random;
//import java.util.logging.Logger;
/**
* Klasa <code>Tournament</code>: Metoda turniejowa.
* @version 1.0 2010-01-10
* @author <a href="mailto:wojciech.wolszczak@delhezi.com">
* Wojciech Wolszczak</a>
*/
public class Tournament implements ISelect {
/** Logger object. */
//private static final Logger LOGGER =
// Logger.getLogger(Tournament.class.getName());
/** Delhezi Error Code. */
//private static final String DERC = "1-8-5-";
/** */
private static Random random = new Random();
/** Liczba chromosomów biorących udział w turnieju. */
private int arity = 2;
/**
* Funkcja select.
* @param chromosomes Lista chromosomów.
* @return Wynikowa list chromosomów.
* @throws GeneticAlgorithmException (chromosomes == null)
* or (fitnessFunction == null)
* @since 1.0
*/
public final LinkedList<Chromosome> select(final LinkedList<Chromosome> chromosomes)
throws GeneticAlgorithmException {
if (chromosomes == null) {
throw new IllegalArgumentException("chromosomes is null.");
}
if (chromosomes.size() < this.arity)
throw new IllegalArgumentException("Tournament arity cannot be bigger than population size.");
//Jest tylko jeden chromosom.
if (chromosomes.size() < 2) {
return chromosomes;
}
// Tworzymy kopię listy chromosomów.
LinkedList<Chromosome> newChromosomes = new LinkedList<Chromosome>();
//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++) {
Chromosome bestTournamentChromosome = null;
for (int j = 0; j < this.arity; j++) {
Chromosome chTmp =
chromosomes.get(random.nextInt(chromosomes.size()));
if (bestTournamentChromosome == null) {
bestTournamentChromosome = chTmp;
} else {
if (bestTournamentChromosome.isFitnessMaximisation() ==
true) {
if (bestTournamentChromosome.getFitness() <
chTmp.getFitness()) {
bestTournamentChromosome = chTmp;
}
} else{
if (bestTournamentChromosome.getFitness() >
chTmp.getFitness()) {
bestTournamentChromosome = chTmp;
}
}
}
}
newChromosomes.add(bestTournamentChromosome.clone());
}
return newChromosomes;
}
/**
* Pobierz liczbę chromosomów biorących udział w turnieju.
* @return Liczba chromosomów biorących udział w turnieju.
*/
public int getArity() {
return arity;
}
/**
* Ustaw liczbę chromosomów biorących udział w turnieju.
* @param arity Liczba chromosomów biorących udział w turnieju.
*/
public void setArity(int arity) {
this.arity = arity;
}
}