/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.ml.ea.species;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.encog.ml.ea.genome.Genome;
import org.encog.ml.ea.population.Population;
import org.encog.util.Format;
/**
* Provides basic functionality for a species.
*/
public class BasicSpecies implements Serializable, Species {
/**
* Serial id.
*/
private static final long serialVersionUID = 1L;
/**
* The age of this species.
*/
private int age;
/**
* The best score.
*/
private double bestScore;
/**
* The number of generations with no improvement.
*/
private int gensNoImprovement;
/**
* The leader.
*/
private Genome leader;
/**
* The list of genomes.
*/
private final List<Genome> members = new ArrayList<Genome>();
/**
* The owner class.
*/
private Population population;
/**
* The offspring count.
*/
private transient int offspringCount;
/**
* The offpsring share (percent).
*/
private transient double offspringShare;
/**
* Default constructor, used mainly for persistence.
*/
public BasicSpecies() {
}
/**
* Construct a species.
*
* @param thePopulation
* The population the species belongs to.
* @param theFirst
* The first genome in the species.
*/
public BasicSpecies(final Population thePopulation, final Genome theFirst) {
this.population = thePopulation;
this.bestScore = theFirst.getScore();
this.gensNoImprovement = 0;
this.age = 0;
this.leader = theFirst;
this.members.add(theFirst);
}
/**
* {@inheritDoc}
*/
@Override
public void add(final Genome genome) {
genome.setPopulation(this.population);
this.members.add(genome);
}
/**
* {@inheritDoc}
*/
@Override
public double calculateShare(final boolean shouldMinimize,
final double maxScore) {
double total = 0;
int count = 0;
for (final Genome genome : this.members) {
if (!Double.isNaN(genome.getAdjustedScore())
&& !Double.isInfinite(genome.getAdjustedScore())) {
double s;
if (shouldMinimize) {
s = maxScore - genome.getAdjustedScore();
} else {
s = genome.getAdjustedScore();
}
total += s;
count++;
}
}
if (count == 0) {
this.offspringShare = 0;
} else {
this.offspringShare = total / count;
}
return this.offspringShare;
}
/**
* {@inheritDoc}
*/
@Override
public int getAge() {
return this.age;
}
/**
* {@inheritDoc}
*/
@Override
public double getBestScore() {
return this.bestScore;
}
/**
* {@inheritDoc}
*/
@Override
public int getGensNoImprovement() {
return this.gensNoImprovement;
}
/**
* {@inheritDoc}
*/
@Override
public Genome getLeader() {
return this.leader;
}
/**
* {@inheritDoc}
*/
@Override
public List<Genome> getMembers() {
return this.members;
}
/**
* {@inheritDoc}
*/
@Override
public int getOffspringCount() {
return this.offspringCount;
}
/**
* {@inheritDoc}
*/
@Override
public double getOffspringShare() {
return this.offspringShare;
}
/**
* {@inheritDoc}
*/
@Override
public Population getPopulation() {
return this.population;
}
/**
* Purge all members, increase age by one and count the number of
* generations with no improvement.
*/
public void purge() {
this.members.clear();
if (this.leader != null) {
this.members.add(this.leader);
}
this.age++;
this.gensNoImprovement++;
this.offspringCount = 0;
this.offspringShare = 0;
}
/**
* {@inheritDoc}
*/
@Override
public void setAge(final int theAge) {
this.age = theAge;
}
/**
* {@inheritDoc}
*/
@Override
public void setBestScore(final double theBestScore) {
this.bestScore = theBestScore;
}
/**
* {@inheritDoc}
*/
@Override
public void setGensNoImprovement(final int theGensNoImprovement) {
this.gensNoImprovement = theGensNoImprovement;
}
/**
* {@inheritDoc}
*/
@Override
public void setLeader(final Genome theLeader) {
this.leader = theLeader;
}
/**
* {@inheritDoc}
*/
@Override
public void setOffspringCount(final int offspringCount) {
this.offspringCount = offspringCount;
}
/**
* {@inheritDoc}
*/
@Override
public void setPopulation(final Population thePopulation) {
this.population = thePopulation;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
final StringBuilder result = new StringBuilder();
result.append("[BasicSpecies: score=");
result.append(Format.formatDouble(getBestScore(), 2));
result.append(", members=");
result.append(this.members.size());
result.append(", age=");
result.append(this.age);
result.append(", no_improv=");
result.append(this.gensNoImprovement);
result.append(", share=");
result.append(this.offspringShare);
result.append(", offspring count=");
result.append(this.offspringShare);
result.append("]");
return result.toString();
}
}