blob: e880b2c4cdd3e20a00bfc6bd2dea58d97448da07 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.math.genetics;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.math.exception.util.LocalizedFormats;
import org.apache.commons.math.exception.NotPositiveException;
import org.apache.commons.math.exception.NumberIsTooLargeException;
/**
* Population of chromosomes represented by a {@link List}.
*
* @since 2.0
* @version $Revision: 983921 $ $Date: 2010-08-10 12:46:06 +0200 (mar. 10 août 2010) $
*/
public abstract class ListPopulation implements Population {
/** List of chromosomes */
private List<Chromosome> chromosomes;
/** maximial size of the population */
private int populationLimit;
/**
* Creates a new ListPopulation instance.
*
* @param chromosomes list of chromosomes in the population
* @param populationLimit maximal size of the population
*/
public ListPopulation (List<Chromosome> chromosomes, int populationLimit) {
if (chromosomes.size() > populationLimit) {
throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE,
chromosomes.size(), populationLimit, false);
}
if (populationLimit < 0) {
throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit);
}
this.chromosomes = chromosomes;
this.populationLimit = populationLimit;
}
/**
* Creates a new ListPopulation instance and initializes its inner
* chromosome list.
*
* @param populationLimit maximal size of the population
*/
public ListPopulation (int populationLimit) {
if (populationLimit < 0) {
throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit);
}
this.populationLimit = populationLimit;
this.chromosomes = new ArrayList<Chromosome>(populationLimit);
}
/**
* Sets the list of chromosomes.
* @param chromosomes the list of chromosomes
*/
public void setChromosomes(List<Chromosome> chromosomes) {
this.chromosomes = chromosomes;
}
/**
* Access the list of chromosomes.
* @return the list of chromosomes
*/
public List<Chromosome> getChromosomes() {
return chromosomes;
}
/**
* Add the given chromosome to the population.
* @param chromosome the chromosome to add.
*/
public void addChromosome(Chromosome chromosome) {
this.chromosomes.add(chromosome);
}
/**
* Access the fittest chromosome in this population.
* @return the fittest chromosome.
*/
public Chromosome getFittestChromosome() {
// best so far
Chromosome bestChromosome = this.chromosomes.get(0);
for (Chromosome chromosome : this.chromosomes) {
if (chromosome.compareTo(bestChromosome) > 0) {
// better chromosome found
bestChromosome = chromosome;
}
}
return bestChromosome;
}
/**
* Access the maximum population size.
* @return the maximum population size.
*/
public int getPopulationLimit() {
return this.populationLimit;
}
/**
* Sets the maximal population size.
* @param populationLimit maximal population size.
*/
public void setPopulationLimit(int populationLimit) {
this.populationLimit = populationLimit;
}
/**
* Access the current population size.
* @return the current population size.
*/
public int getPopulationSize() {
return this.chromosomes.size();
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return this.chromosomes.toString();
}
/**
* Chromosome list iterator
*
* @return chromosome iterator
*/
public Iterator<Chromosome> iterator() {
return chromosomes.iterator();
}
}