// FPGAFitness.java
//
// Author:
// Antonio J. Nebro <antonio@lcc.uma.es>
// Juan J. Durillo <durillo@lcc.uma.es>
//
// Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package jmetal.util;
import jmetal.core.Problem;
import jmetal.core.SolutionSet;
import jmetal.util.comparators.DominanceComparator;
import java.util.Comparator;
/**
* This class implements facilities for calculating the fitness for the
* FPGA algorithm
*/
public class FPGAFitness {
/**
* Need the population to assign the fitness, this population may contain
* solutions in the population and the archive
*/
private SolutionSet solutionSet_ = null;
/**
* problem to solve
*/
private Problem problem_ = null;
/**
* stores a <code>Comparator</code> for dominance checking
*/
private static final Comparator dominance_ = new DominanceComparator();
/**
* Constructor.
* Create a new instance of Spea2Fitness
* @param solutionSet The solutionSet to assign the fitness
* @param problem The problem to solve
*/
public FPGAFitness(SolutionSet solutionSet, Problem problem) {
solutionSet_ = solutionSet;
problem_ = problem;
for (int i = 0; i < solutionSet_.size(); i++) {
solutionSet_.get(i).setLocation(i);
} // for
} // FPGAFitness
/**
* Assign FPGA fitness to the solutions. Similar to the SPEA2 fitness.
*/
public void fitnessAssign() {
double [] strength = new double[solutionSet_.size()];
double [] rawFitness = new double[solutionSet_.size()];
//Ranking ranking = new Ranking(solutionSet_);
//Distance distance = new Distance();
//distance.crowdingDistanceAsignament(ranking.getSubfront(0),
// problem_.getNumberOfObjectives());
for (int i = 0; i < solutionSet_.size(); i++) {
if (solutionSet_.get(i).getRank()==0) {
solutionSet_.get(i).setFitness(solutionSet_.get(i).getCrowdingDistance());
//System.out.println(solutionSet_.get(i).getCrowdingDistance());
}
}
//Calculate the strength value
// strength(i) = |{j | j <- SolutionSet and i dominate j}|
for (int i = 0; i < solutionSet_.size(); i++) {
for (int j = 0; j < solutionSet_.size();j++) {
if (dominance_.compare(solutionSet_.get(i),solutionSet_.get(j))==-1) {
strength[i] += 1.0;
} // if
} // for
} // for
//Calculate the fitness
//F(i) = sum(strength(j) | i dominate j) - sum(strenth(j) | j dominate i)
for (int i = 0;i < solutionSet_.size(); i++) {
double fitness = 0.0;
for (int j = 0; j < solutionSet_.size();j++) {
int flag = dominance_.compare(solutionSet_.get(i),solutionSet_.get(j));
if (flag == -1) { //i domiante j
fitness += strength[j];
}else if (flag==1) {
fitness -= strength[j];
} // if
} // for
} // for
} // fitnessAsign
} // FPGAFitness