org.uncommons.watchmaker.framework.EvaluatedCandidate Maven / Gradle / Ivy
The newest version!
//=============================================================================
// 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;
/**
* Immutable wrapper class for associating a candidate solution with its
* fitness score.
* @author Daniel Dyer.
* @param The candidate type.
*/
public final class EvaluatedCandidate implements Comparable>
{
private final T candidate;
private final double fitness;
/**
* @param candidate The evolved candidate.
* @param fitness The candidates fitness score.
*/
public EvaluatedCandidate(T candidate, double fitness)
{
if (fitness < 0)
{
throw new IllegalArgumentException("Fitness score must be greater than or equal to zero.");
}
this.candidate = candidate;
this.fitness = fitness;
}
/**
* @return The evolved candidate solution.
*/
public T getCandidate()
{
return candidate;
}
/**
* @return The fitness score for the associated candidate.
*/
public double getFitness()
{
return fitness;
}
/**
* Compares this candidate's fitness score with that of the specified
* candidate.
* @param evaluatedCandidate The candidate to compare scores with.
* @return -1, 0 or 1 if this candidate's score is less than, equal to,
* or greater than that of the specified candidate. The comparison applies
* to the raw numerical score and does not consider whether that score is
* a natural fitness score or not.
*/
public int compareTo(EvaluatedCandidate evaluatedCandidate)
{
return Double.compare(fitness, evaluatedCandidate.getFitness());
}
/**
* Over-ridden to be consistent with {@link #compareTo(EvaluatedCandidate)}.
* @param o The object to check for equality.
* @return true If this object is logically equivalent to {code o}.
*/
@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (o == null || getClass() != o.getClass())
{
return false;
}
final EvaluatedCandidate> that = (EvaluatedCandidate>) o;
return Double.compare(that.getFitness(), fitness) == 0;
}
/**
* Over-ridden to be consistent with {@link #equals(Object)}.
* @return This object's hash code.
*/
@Override
public int hashCode()
{
final long temp = fitness == 0.0d ? 0L : Double.doubleToLongBits(fitness);
return (int) (temp ^ (temp >>> 32));
}
}