001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math.genetics;
018    
019    import java.util.ArrayList;
020    import java.util.Iterator;
021    import java.util.List;
022    
023    import org.apache.commons.math.exception.util.LocalizedFormats;
024    import org.apache.commons.math.exception.NotPositiveException;
025    import org.apache.commons.math.exception.NumberIsTooLargeException;
026    
027    /**
028     * Population of chromosomes represented by a {@link List}.
029     *
030     * @since 2.0
031     * @version $Revision: 983921 $ $Date: 2010-08-10 12:46:06 +0200 (mar. 10 ao??t 2010) $
032     */
033    public abstract class ListPopulation implements Population {
034    
035        /** List of chromosomes */
036        private List<Chromosome> chromosomes;
037    
038        /** maximial size of the population */
039        private int populationLimit;
040    
041    
042        /**
043         * Creates a new ListPopulation instance.
044         *
045         * @param chromosomes list of chromosomes in the population
046         * @param populationLimit maximal size of the population
047         */
048        public ListPopulation (List<Chromosome> chromosomes, int populationLimit) {
049            if (chromosomes.size() > populationLimit) {
050                throw new NumberIsTooLargeException(LocalizedFormats.LIST_OF_CHROMOSOMES_BIGGER_THAN_POPULATION_SIZE,
051                                                    chromosomes.size(), populationLimit, false);
052            }
053            if (populationLimit < 0) {
054                throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit);
055            }
056    
057            this.chromosomes = chromosomes;
058            this.populationLimit = populationLimit;
059        }
060    
061        /**
062         * Creates a new ListPopulation instance and initializes its inner
063         * chromosome list.
064         *
065         * @param populationLimit maximal size of the population
066         */
067        public ListPopulation (int populationLimit) {
068            if (populationLimit < 0) {
069                throw new NotPositiveException(LocalizedFormats.POPULATION_LIMIT_NOT_POSITIVE, populationLimit);
070            }
071            this.populationLimit = populationLimit;
072            this.chromosomes = new ArrayList<Chromosome>(populationLimit);
073        }
074    
075        /**
076         * Sets the list of chromosomes.
077         * @param chromosomes the list of chromosomes
078         */
079        public void setChromosomes(List<Chromosome> chromosomes) {
080            this.chromosomes = chromosomes;
081        }
082    
083        /**
084         * Access the list of chromosomes.
085         * @return the list of chromosomes
086         */
087        public List<Chromosome> getChromosomes() {
088            return chromosomes;
089        }
090    
091        /**
092         * Add the given chromosome to the population.
093         * @param chromosome the chromosome to add.
094         */
095        public void addChromosome(Chromosome chromosome) {
096            this.chromosomes.add(chromosome);
097        }
098    
099        /**
100         * Access the fittest chromosome in this population.
101         * @return the fittest chromosome.
102         */
103        public Chromosome getFittestChromosome() {
104            // best so far
105            Chromosome bestChromosome = this.chromosomes.get(0);
106            for (Chromosome chromosome : this.chromosomes) {
107                if (chromosome.compareTo(bestChromosome) > 0) {
108                    // better chromosome found
109                    bestChromosome = chromosome;
110                }
111            }
112            return bestChromosome;
113        }
114    
115        /**
116         * Access the maximum population size.
117         * @return the maximum population size.
118         */
119        public int getPopulationLimit() {
120            return this.populationLimit;
121        }
122    
123        /**
124         * Sets the maximal population size.
125         * @param populationLimit maximal population size.
126         */
127        public void setPopulationLimit(int populationLimit) {
128            this.populationLimit = populationLimit;
129        }
130    
131        /**
132         * Access the current population size.
133         * @return the current population size.
134         */
135        public int getPopulationSize() {
136            return this.chromosomes.size();
137        }
138    
139        /**
140         * {@inheritDoc}
141         */
142        @Override
143        public String toString() {
144            return this.chromosomes.toString();
145        }
146    
147        /**
148         * Chromosome list iterator
149         *
150         * @return chromosome iterator
151         */
152        public Iterator<Chromosome> iterator() {
153            return chromosomes.iterator();
154        }
155    }