// WFG.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.problems.WFG;
import jmetal.core.Problem;
import jmetal.encodings.solutionType.BinaryRealSolutionType;
import jmetal.encodings.solutionType.RealSolutionType;
import java.util.Random;
/**
* Implements a reference abstract class for all WFG test problems
* Reference: Simon Huband, Luigi Barone, Lyndon While, Phil Hingston
* A Scalable Multi-objective Test Problem Toolkit.
* Evolutionary Multi-Criterion Optimization:
* Third International Conference, EMO 2005.
* Proceedings, volume 3410 of Lecture Notes in Computer Science
*/
public abstract class WFG extends Problem{
/**
* stores a epsilon default value
*/
private final float epsilon = (float)1e-7;
protected int k_; //Var for walking fish group
protected int M_;
protected int l_;
protected int [] A_;
protected int [] S_;
protected int D_ = 1;
protected Random random = new Random();
/**
* Constructor
* Creates a WFG problem
* @param k position-related parameters
* @param l distance-related parameters
* @param M Number of objectives
* @param solutionType The solution type must "Real" or "BinaryReal".
*/
public WFG (String solutionType, Integer k, Integer l, Integer M) {
this.k_ = k;
this.l_ = l;
this.M_ = M;
numberOfVariables_ = this.k_ + this.l_;
numberOfObjectives_ = this.M_;
numberOfConstraints_ = 0;
lowerLimit_ = new double[numberOfVariables_];
upperLimit_ = new double[numberOfVariables_];
for (int var = 0; var < numberOfVariables_; var++) {
lowerLimit_[var] = 0;
upperLimit_[var] = 2 * (var + 1);
}
if (solutionType.compareTo("BinaryReal") == 0)
solutionType_ = new BinaryRealSolutionType(this) ;
else if (solutionType.compareTo("Real") == 0)
solutionType_ = new RealSolutionType(this) ;
else {
System.out.println("Error: solution type " + solutionType + " invalid") ;
System.exit(-1) ;
}
} // WFG
/**
* Gets the x vector (consulte WFG tooltik reference)
*/
public float [] calculate_x(float [] t){
float [] x = new float[M_];
for (int i = 0; i < M_-1; i++){
x[i] = Math.max(t[M_-1],A_[i]) * (t[i] - (float)0.5) + (float)0.5;
}
x[M_-1] = t[M_-1];
return x;
} // calculate_x
/**
* Normalizes a vector (consulte WFG toolkit reference)
*/
public float [] normalise(float [] z){
float [] result = new float[z.length];
for (int i = 0; i < z.length; i++){
float bound = (float)2.0 * (i + 1);
result[i] = z[i] / bound;
result[i] = correct_to_01(result[i]);
}
return result;
} // normalize
/**
*/
public float correct_to_01(float a){
float min = (float)0.0;
float max = (float)1.0;
float min_epsilon = min - epsilon;
float max_epsilon = max + epsilon;
if (( a <= min && a >= min_epsilon ) || (a >= min && a <= min_epsilon)) {
return min;
} else if (( a >= max && a <= max_epsilon ) || (a <= max && a >= max_epsilon)) {
return max;
} else {
return a;
}
} // correct_to_01
/**
* Gets a subvector of a given vector
* (Head inclusive and tail inclusive)
* @param z the vector
* @return the subvector
*/
public float [] subVector(float [] z, int head, int tail){
int size = tail - head + 1;
float [] result = new float[size];
System.arraycopy(z, head, result, head - head, tail + 1 - head);
return result;
} // subVector
/**
* Evaluates a solution
* @param variables The solution to evaluate
* @return a double [] with the evaluation results
*/
abstract public float[] evaluate(float[] variables);
// evaluate
}