// Epsilon.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.qualityIndicator ; /** * This class implements the unary epsilon additive indicator as proposed in * E. Zitzler, E. Thiele, L. Laummanns, M., Fonseca, C., and Grunert da Fonseca. * V (2003): Performance Assesment of Multiobjective Optimizers: An Analysis and * Review. The code is the a Java version of the original metric implementation * by Eckart Zitzler. * It can be used also as a command line program just by typing * $java jmetal.qualityIndicator.Epsilon <solutionFrontFile> <trueFrontFile> <getNumberOfObjectives> */ public class Epsilon { /* stores the number of objectives */ int dim_ ; /* obj_[i]=0 means objective i is to be minimized. This code always assume the minimization of all the objectives */ int [] obj_ ; /* obj_[i] = 0 means objective i is to be minimized */ /* method_ = 0 means apply additive epsilon and method_ = 1 means multiplicative * epsilon. This code always apply additive epsilon */ int method_; /* stores a reference to qualityIndicatorUtils */ public jmetal.qualityIndicator.util.MetricsUtil utils_ = new jmetal.qualityIndicator.util.MetricsUtil(); /** * Returns the epsilon indicator. * @param b True Pareto front * @param a Solution front * @return the value of the epsilon indicator */ public double epsilon(double [][] b, double [][] a, int dim) { int i, j, k; double eps, eps_j = 0.0, eps_k=0.0, eps_temp; dim_ = dim ; set_params() ; if (method_ == 0) eps = Double.MIN_VALUE; else eps= 0; for (i = 0; i < a.length; i++) { for (j = 0; j < b.length; j++) { for (k = 0; k < dim_; k++) { switch (method_) { case 0: if (obj_[k] == 0) eps_temp = b[j][k] - a[i][k]; //eps_temp = b[j * dim_ + k] - a[i * dim_ + k]; else eps_temp = a[i][k] - b[j][k]; //eps_temp = a[i * dim_ + k] - b[j * dim_ + k]; break; default: if ( (a[i][k] < 0 && b[j][k] > 0) || (a[i][k] > 0 && b[j][k] < 0) || (a[i][k] == 0 || b[j][k] == 0)) { //if ( (a[i * dim_ + k] < 0 && b[j * dim_ + k] > 0) || // (a[i * dim_ + k] > 0 && b[j * dim_ + k] < 0) || // (a[i * dim_ + k] == 0 || b[j * dim_ + k] == 0)) { System.err.println("error in data file"); System.exit(0); } if (obj_[k] == 0) eps_temp = b[j][k] / a[i][k]; //eps_temp = b[j * dim_ + k] / a[i * dim_ + k]; else eps_temp = a[i][k] / b[j][k]; //eps_temp = a[i * dim_ + k] / b[j * dim_ + k]; break; } if (k == 0) eps_k = eps_temp; else if (eps_k < eps_temp) eps_k = eps_temp; } if (j == 0) eps_j = eps_k; else if (eps_j > eps_k) eps_j = eps_k; } if (i == 0) eps = eps_j; else if (eps < eps_j) eps = eps_j; } return eps; } // epsilon /** * Established the params by default */ void set_params() { int i; obj_ = new int[dim_]; for (i = 0; i < dim_; i++) { obj_[i] = 0; } method_ = 0; } // set_params /** * Returns the additive-epsilon value of the paretoFront. This method call to the * calculate epsilon-indicator one */ public static void main(String [] args) { double ind_value; if (args.length < 2) { System.err.println("Error using Epsilon. Type: \n java AdditiveEpsilon " + "<FrontFile>" + "<TrueFrontFile> + <getNumberOfObjectives>"); System.exit(1); } Epsilon qualityIndicator = new Epsilon(); double [][] solutionFront = qualityIndicator.utils_.readFront(args[0]); double [][] trueFront = qualityIndicator.utils_.readFront(args[1]); //qualityIndicator.dim_ = trueParetoFront[0].length; //qualityIndicator.set_params(); ind_value = qualityIndicator.epsilon(trueFront, solutionFront, new Integer(args[2])); System.out.println(ind_value); } // main } // Epsilon