/* Copyright 2009-2015 David Hadka * * This file is part of the MOEA Framework. * * The MOEA Framework 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. * * The MOEA Framework 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 the MOEA Framework. If not, see <http://www.gnu.org/licenses/>. */ package org.moeaframework.analysis.sensitivity; import org.moeaframework.core.EpsilonBoxDominanceArchive; import org.moeaframework.core.Population; import org.moeaframework.core.Problem; import org.moeaframework.core.comparator.EpsilonBoxDominanceComparator; /** * Provides ε values for algorithms using ε-dominance archives * on the standard test problems. */ public class EpsilonHelper { /** * Private constructor to prevent instantiation. */ private EpsilonHelper() { super(); } /** * Returns the ε value used for the standard problems in sensitivity * analysis. If the problem is not recognized, the default ε value * of {@code 0.01} is returned. * * @param problem the problem * @return the ε value used for the standard problems in sensitivity * analysis */ public static double getEpsilon(Problem problem) { String name = problem.getName(); int numberOfObjectives = problem.getNumberOfObjectives(); if (name.startsWith("DTLZ")) { return numberOfObjectives == 2 ? 0.01 : numberOfObjectives == 3 ? 0.05 : 0.1 + 0.05*(numberOfObjectives-3); } else if (name.startsWith("UF")) { if (name.equals("UF1")) { return 0.001; } else if (name.equals("UF2")) { return 0.005; } else if (name.equals("UF3")) { return 0.0008; } else if (name.equals("UF4")) { return 0.005; } else if (name.equals("UF5")) { return 0.000001; } else if (name.equals("UF6")) { return 0.000001; } else if (name.equals("UF7")) { return 0.005; } else if (name.equals("UF8")) { return 0.0045; } else if (name.equals("UF9")) { return 0.008; } else if (name.equals("UF10")) { return 0.001; } else { if (numberOfObjectives == 2) { return 0.005; } else if (numberOfObjectives == 3) { return 0.07; } else if (numberOfObjectives == 5) { return 0.2; } else { throw new IllegalArgumentException( "number of objectives not supported"); } } } else if (name.equalsIgnoreCase("Belegundu")) { return 0.1; } else if (name.equalsIgnoreCase("Binh")) { return 0.25; } else if (name.equalsIgnoreCase("Binh2")) { return 0.35; } else if (name.equalsIgnoreCase("Binh3")) { return 0.01; } else if (name.equalsIgnoreCase("Binh4")) { return 0.01; } else if (name.equalsIgnoreCase("Fonseca")) { return 0.0025; } else if (name.equalsIgnoreCase("Fonseca2")) { return 0.007; } else if (name.equalsIgnoreCase("Jimenez")) { return 0.05; } else if (name.equalsIgnoreCase("Kita")) { return 0.01; } else if (name.equalsIgnoreCase("Kursawe")) { return 0.035; } else if (name.equalsIgnoreCase("Laumanns")) { return 0.02; } else if (name.equalsIgnoreCase("Lis")) { return 0.004; } else if (name.equalsIgnoreCase("Murata")) { return 0.02; } else if (name.equalsIgnoreCase("Obayashi")) { return 0.006; } else if (name.equalsIgnoreCase("OKA1")) { return 0.0145; } else if (name.equalsIgnoreCase("OKA2")) { return 0.000001; } else if (name.equalsIgnoreCase("Osyczka")) { return 0.0012; } else if (name.equalsIgnoreCase("Osyczka2")) { return 0.5; } else if (name.equalsIgnoreCase("Poloni")) { return 0.04; } else if (name.equalsIgnoreCase("Quagliarella")) { return 0.03; } else if (name.equalsIgnoreCase("Rendon")) { return 0.01; } else if (name.equalsIgnoreCase("Rendon2")) { return 0.027; } else if (name.equalsIgnoreCase("Schaffer")) { return 0.02; } else if (name.equalsIgnoreCase("Schaffer2")) { return 0.017; } else if (name.equalsIgnoreCase("Srinivas")) { return 1.5; } else if (name.equalsIgnoreCase("Tamaki")) { return 0.06; } else if (name.equalsIgnoreCase("Tanaka")) { return 0.0045; } else if (name.equalsIgnoreCase("Viennet")) { return 0.1; } else if (name.equalsIgnoreCase("Viennet2")) { return 0.0062; } else if (name.equalsIgnoreCase("Viennet3")) { return 0.011; } else if (name.equalsIgnoreCase("Viennet4")) { return 0.085; } else { return 0.01; } } /** * Converts the population to an {@link EpsilonBoxDominanceArchive} with * the given ε values. To prevent unnecessary computations, this * conversion only occurs if the original population is not an * {@code EpsilonBoxDominanceArchive} and does not have matching ε * values. * * @param population the population to convert * @param epsilon the ε values * @return the population converted to an {@code EpsilonBoxDominanceArchive} * with the given ε values */ public static EpsilonBoxDominanceArchive convert(Population population, double[] epsilon) { boolean isSameEpsilon = false; //check if population already has the correct epsilons if (population instanceof EpsilonBoxDominanceArchive) { EpsilonBoxDominanceArchive result = (EpsilonBoxDominanceArchive)population; EpsilonBoxDominanceComparator comparator = result.getComparator(); isSameEpsilon = true; for (int i=0; i<epsilon.length; i++) { if (epsilon[i] != comparator.getEpsilon(i)) { isSameEpsilon = false; break; } } } //apply epsilons only if necessary if (isSameEpsilon) { return (EpsilonBoxDominanceArchive)population; } else { return new EpsilonBoxDominanceArchive(epsilon, population); } } }