//=============================================================================
// Copyright 2006-2010 Daniel W. Dyer
//
// Licensed 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.uncommons.watchmaker.framework.factories;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import org.uncommons.watchmaker.framework.CandidateFactory;
/**
* Convenient base class for implementations of
* {@link org.uncommons.watchmaker.framework.CandidateFactory}.
* @param <T> The type of entity evolved by this engine.
* @author Daniel Dyer
*/
public abstract class AbstractCandidateFactory<T> implements CandidateFactory<T>
{
/**
* Randomly, create an initial population of candidates. If some
* control is required over the composition of the initial population,
* consider the overloaded {@link #generateInitialPopulation(int,Collection,Random)}
* method.
* @param populationSize The number of candidates to randomly create.
* @param rng The random number generator to use when creating the random
* candidates.
* @return A randomly generated initial population of candidate solutions.
*/
public List<T> generateInitialPopulation(int populationSize, Random rng)
{
List<T> population = new ArrayList<T>(populationSize);
for (int i = 0; i < populationSize; i++)
{
population.add(generateRandomCandidate(rng));
}
return Collections.unmodifiableList(population);
}
/**
* {@inheritDoc}
* If the number of seed candidates is less than the required population
* size, the remainder of the population will be generated randomly via
* the {@link #generateRandomCandidate(Random)} method.
*/
public List<T> generateInitialPopulation(int populationSize,
Collection<T> seedCandidates,
Random rng)
{
if (seedCandidates.size() > populationSize)
{
throw new IllegalArgumentException("Too many seed candidates for specified population size.");
}
List<T> population = new ArrayList<T>(populationSize);
population.addAll(seedCandidates);
for (int i = seedCandidates.size(); i < populationSize; i++)
{
population.add(generateRandomCandidate(rng));
}
return Collections.unmodifiableList(population);
}
}