diff --git a/README.md b/README.md index 99d87c3..865eac5 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ algorithms, i.e., Evolver applies a meta-optimization approach. The basis of Evolver are: * A multi-objective metaheuristic algorithm in which, given one or several problems used as training set, a configuration of it is sought that solves the training set in an efficient way. This algorithm is referred as to the *Configurable Algorithm*. -* A design space associated to the internal algorithm which defines their parameters and components subject to be configured. -* A list of quality indicators used as objectives to minimize when using the internal algorithm to solve a problem of the training set. -* A *meta-optimizer* algorithm which is used to solve the optimization problem defined by minimizing the quality indicators of an internal algorithm given a particular training set. +* A design space associated to the configurable algorithm which defines their parameters and components subject to be configured. +* A list of quality indicators used as objectives to minimize when using the configurable algorithm to solve a problem of the training set. +* A *meta-optimizer* algorithm which is used to solve the optimization problem defined by minimizing the quality indicators of an configurable algorithm given a particular training set. The project is made of two parts: * [Evolver](src): A Java library built with maven that implements the meta-optimization approach. @@ -48,13 +48,13 @@ general_config: cpu_cores: 8 plotting_frequency: 100 -external_algorithm_arguments: +meta_optimizer_arguments: meta_optimizer_algorithm: NSGAII meta_optimizer_population_size: 50 meta_optimizer_max_evaluations: 3000 indicators_names: NHV,EP -internal_algorithm_arguments: +configurable_algorithm_arguments: configurable_algorithm: NSGAII internal_population_size: 100 independent_runs: 3 @@ -342,7 +342,6 @@ public class ConfigurableNSGAIIRunner { + "--mutationRepairStrategy round " + "--polynomialMutationDistributionIndex 20.465825376938277 " + "--linkedPolynomialMutationDistributionIndex 369.76116204526977 " - + "--uniformMutationPerturbation 0.9230041512352161 " + "--nonUniformMutationPerturbation 0.6160655898281514 " + "--selection tournament " + "--selectionTournamentSize 8 ") diff --git a/src/main/java/org/uma/evolver/configurablealgorithm/impl/ConfigurableNSGAIIWithDE.java b/src/main/java/org/uma/evolver/configurablealgorithm/impl/ConfigurableNSGAIIWithDE.java deleted file mode 100644 index 9fd457e..0000000 --- a/src/main/java/org/uma/evolver/configurablealgorithm/impl/ConfigurableNSGAIIWithDE.java +++ /dev/null @@ -1,322 +0,0 @@ -package org.uma.evolver.configurablealgorithm.impl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import org.uma.evolver.configurablealgorithm.ConfigurableAlgorithmBuilder; -import org.uma.evolver.parameter.Parameter; -import org.uma.evolver.parameter.catalogue.CreateInitialSolutionsParameter; -import org.uma.evolver.parameter.catalogue.CrossoverParameter; -import org.uma.evolver.parameter.catalogue.ExternalArchiveParameter; -import org.uma.evolver.parameter.catalogue.MutationParameter; -import org.uma.evolver.parameter.catalogue.ProbabilityParameter; -import org.uma.evolver.parameter.catalogue.RepairDoubleSolutionStrategyParameter; -import org.uma.evolver.parameter.catalogue.SelectionParameter; -import org.uma.evolver.parameter.catalogue.VariationParameter; -import org.uma.evolver.parameter.impl.CategoricalIntegerParameter; -import org.uma.evolver.parameter.impl.CategoricalParameter; -import org.uma.evolver.parameter.impl.IntegerParameter; -import org.uma.evolver.parameter.impl.RealParameter; -import org.uma.jmetal.component.algorithm.EvolutionaryAlgorithm; -import org.uma.jmetal.component.catalogue.common.evaluation.Evaluation; -import org.uma.jmetal.component.catalogue.common.evaluation.impl.SequentialEvaluation; -import org.uma.jmetal.component.catalogue.common.evaluation.impl.SequentialEvaluationWithArchive; -import org.uma.jmetal.component.catalogue.common.solutionscreation.SolutionsCreation; -import org.uma.jmetal.component.catalogue.common.termination.Termination; -import org.uma.jmetal.component.catalogue.common.termination.impl.TerminationByEvaluations; -import org.uma.jmetal.component.catalogue.ea.replacement.Replacement; -import org.uma.jmetal.component.catalogue.ea.replacement.impl.RankingAndDensityEstimatorReplacement; -import org.uma.jmetal.component.catalogue.ea.selection.Selection; -import org.uma.jmetal.component.catalogue.ea.variation.Variation; -import org.uma.jmetal.component.util.RankingAndDensityEstimatorPreference; -import org.uma.jmetal.problem.doubleproblem.DoubleProblem; -import org.uma.jmetal.solution.doublesolution.DoubleSolution; -import org.uma.jmetal.util.archive.Archive; -import org.uma.jmetal.util.comparator.MultiComparator; -import org.uma.jmetal.util.comparator.dominanceComparator.impl.DominanceWithConstraintsComparator; -import org.uma.jmetal.util.densityestimator.DensityEstimator; -import org.uma.jmetal.util.densityestimator.impl.CrowdingDistanceDensityEstimator; -import org.uma.jmetal.util.ranking.Ranking; -import org.uma.jmetal.util.ranking.impl.FastNonDominatedSortRanking; - -/** - * Class to configure NSGA-II with an argument string using class {@link EvolutionaryAlgorithm} - * - * @autor Antonio J. Nebro - */ -public class ConfigurableNSGAIIWithDE implements ConfigurableAlgorithmBuilder { - - private List> configurableParameterList = new ArrayList<>(); - private CategoricalParameter algorithmResultParameter; - private ExternalArchiveParameter externalArchiveParameter; - private IntegerParameter populationSizeWithArchiveParameter; - private CategoricalIntegerParameter offspringPopulationSizeParameter; - private CreateInitialSolutionsParameter createInitialSolutionsParameter; - private SelectionParameter selectionParameter; - private VariationParameter variationParameter; - private CategoricalParameter modelParameter ; - - @Override - public List> configurableParameterList() { - return configurableParameterList; - } - - private DoubleProblem problem; - private int populationSize; - private int maximumNumberOfEvaluations; - - public ConfigurableNSGAIIWithDE(DoubleProblem problem, int populationSize, - int maximumNumberOfEvaluations) { - this.problem = problem; - this.populationSize = populationSize; - this.maximumNumberOfEvaluations = maximumNumberOfEvaluations; - this.configure(); - } - - @Override - public ConfigurableAlgorithmBuilder createBuilderInstance() { - return new ConfigurableNSGAIIWithDE(problem, populationSize, maximumNumberOfEvaluations); - } - - public ConfigurableAlgorithmBuilder createBuilderInstance(DoubleProblem problem, - int maximumNumberOfEvaluations) { - return new ConfigurableNSGAIIWithDE(problem, populationSize, maximumNumberOfEvaluations); - } - - private void configure() { - offspringPopulationSizeParameter = new CategoricalIntegerParameter("offspringPopulationSize", - List.of(2, 5, 10, 20, 50, 100, 200, 400)); - - modelParameter = new CategoricalParameter("model", List.of("generational", "steadyState")) ; - modelParameter.addSpecificParameter("generational", offspringPopulationSizeParameter); - - algorithmResult(); - createInitialSolution(); - selection(); - variation(); - - configurableParameterList.add(algorithmResultParameter); - configurableParameterList.add(createInitialSolutionsParameter); - configurableParameterList.add(modelParameter); - configurableParameterList.add(variationParameter); - configurableParameterList.add(selectionParameter); - } - - private void variation() { - CrossoverParameter crossoverParameter = new CrossoverParameter( - List.of("SBX", "BLX_ALPHA", "wholeArithmetic")); - ProbabilityParameter crossoverProbability = - new ProbabilityParameter("crossoverProbability"); - crossoverParameter.addGlobalParameter(crossoverProbability); - RepairDoubleSolutionStrategyParameter crossoverRepairStrategy = - new RepairDoubleSolutionStrategyParameter( - "crossoverRepairStrategy", Arrays.asList("random", "round", "bounds")); - crossoverParameter.addGlobalParameter(crossoverRepairStrategy); - - RealParameter distributionIndex = new RealParameter("sbxDistributionIndex", 5.0, 400.0); - crossoverParameter.addSpecificParameter("SBX", distributionIndex); - - RealParameter alpha = new RealParameter("blxAlphaCrossoverAlphaValue", 0.0, 1.0); - crossoverParameter.addSpecificParameter("BLX_ALPHA", alpha); - - MutationParameter mutationParameter = - new MutationParameter( - Arrays.asList("uniform", "polynomial", "linkedPolynomial", "nonUniform")); - - RealParameter mutationProbabilityFactor = new RealParameter("mutationProbabilityFactor", - 0.0, 2.0); - mutationParameter.addGlobalParameter(mutationProbabilityFactor); - RepairDoubleSolutionStrategyParameter mutationRepairStrategy = - new RepairDoubleSolutionStrategyParameter( - "mutationRepairStrategy", Arrays.asList("random", "round", "bounds")); - mutationParameter.addGlobalParameter(mutationRepairStrategy); - - RealParameter distributionIndexForPolynomialMutation = - new RealParameter("polynomialMutationDistributionIndex", 5.0, 400.0); - mutationParameter.addSpecificParameter("polynomial", distributionIndexForPolynomialMutation); - - RealParameter distributionIndexForLinkedPolynomialMutation = - new RealParameter("linkedPolynomialMutationDistributionIndex", 5.0, 400.0); - mutationParameter.addSpecificParameter("linkedPolynomial", - distributionIndexForLinkedPolynomialMutation); - - RealParameter uniformMutationPerturbation = - new RealParameter("uniformMutationPerturbation", 0.0, 1.0); - mutationParameter.addSpecificParameter("uniform", uniformMutationPerturbation); - - RealParameter nonUniformMutationPerturbation = - new RealParameter("nonUniformMutationPerturbation", 0.0, 1.0); - mutationParameter.addSpecificParameter("nonUniform", nonUniformMutationPerturbation); - - variationParameter = - new VariationParameter(List.of("crossoverAndMutationVariation")); - variationParameter.addSpecificParameter("crossoverAndMutationVariation", crossoverParameter); - variationParameter.addSpecificParameter("crossoverAndMutationVariation", mutationParameter); - } - - private void selection() { - selectionParameter = new SelectionParameter<>(Arrays.asList("tournament", "random")); - IntegerParameter selectionTournamentSize = - new IntegerParameter("selectionTournamentSize", 2, 10); - selectionParameter.addSpecificParameter("tournament", selectionTournamentSize); - } - - private void createInitialSolution() { - createInitialSolutionsParameter = - new CreateInitialSolutionsParameter( - Arrays.asList("random", "latinHypercubeSampling", "scatterSearch")); - } - - private void algorithmResult() { - algorithmResultParameter = - new CategoricalParameter("algorithmResult", List.of("population", "externalArchive")); - - populationSizeWithArchiveParameter = new IntegerParameter("populationSizeWithArchive", 10, - 200); - externalArchiveParameter = new ExternalArchiveParameter<>( - List.of("crowdingDistanceArchive", "unboundedArchive")); - algorithmResultParameter.addSpecificParameter( - "externalArchive", populationSizeWithArchiveParameter); - - algorithmResultParameter.addSpecificParameter( - "externalArchive", externalArchiveParameter); - - } - - @Override - public ConfigurableAlgorithmBuilder parse(String[] arguments) { - for (Parameter parameter : configurableParameterList()) { - parameter.parse(arguments).check(); - } - - return this; - } - - /** - * Creates an instance of NSGA-II from the parsed parameters - * - * @return - */ - @Override - public EvolutionaryAlgorithm build() { - Archive archive = null; - - if (algorithmResultParameter.value().equals("externalArchive")) { - externalArchiveParameter.setSize(populationSize); - archive = externalArchiveParameter.getParameter(); - populationSize = populationSizeWithArchiveParameter.value(); - } - - Ranking ranking = new FastNonDominatedSortRanking<>( - new DominanceWithConstraintsComparator<>()); - DensityEstimator densityEstimator = new CrowdingDistanceDensityEstimator<>(); - MultiComparator rankingAndCrowdingComparator = - new MultiComparator<>( - Arrays.asList( - Comparator.comparing(ranking::getRank), - Comparator.comparing(densityEstimator::value).reversed())); - - var initialSolutionsCreation = - (SolutionsCreation) createInitialSolutionsParameter.getParameter( - problem, - populationSize); - - MutationParameter mutationParameter = (MutationParameter) variationParameter.findSpecificParameter( - "mutation"); - mutationParameter.addNonConfigurableParameter("numberOfProblemVariables", - problem.numberOfVariables()); - - if (mutationParameter.value().equals("nonUniform")) { - mutationParameter.addNonConfigurableParameter("maxIterations", - maximumNumberOfEvaluations / populationSize); - } - - int offspringPopulationSize ; - if (modelParameter.value().equals("steadyState")) { - offspringPopulationSize = 1 ; - } else { - offspringPopulationSize = offspringPopulationSizeParameter.value() ; - } - variationParameter.addNonConfigurableParameter("offspringPopulationSize", - offspringPopulationSize); - var variation = (Variation) variationParameter.getDoubleSolutionParameter(); - - Selection selection = - selectionParameter.getParameter( - variation.getMatingPoolSize(), rankingAndCrowdingComparator); - - Evaluation evaluation; - if (algorithmResultParameter.value().equals("externalArchive")) { - evaluation = new SequentialEvaluationWithArchive<>(problem, archive); - } else { - evaluation = new SequentialEvaluation<>(problem); - } - - RankingAndDensityEstimatorPreference preferenceForReplacement = new RankingAndDensityEstimatorPreference<>( - ranking, densityEstimator); - Replacement replacement = - new RankingAndDensityEstimatorReplacement<>(preferenceForReplacement, - Replacement.RemovalPolicy.ONE_SHOT); - - Termination termination = - new TerminationByEvaluations(maximumNumberOfEvaluations); - - class EvolutionaryAlgorithmWithArchive extends EvolutionaryAlgorithm { - - private Archive archive; - - /** - * Constructor - * - * @param name Algorithm name - * @param initialPopulationCreation - * @param evaluation - * @param termination - * @param selection - * @param variation - * @param replacement - */ - public EvolutionaryAlgorithmWithArchive(String name, - SolutionsCreation initialPopulationCreation, - Evaluation evaluation, Termination termination, - Selection selection, Variation variation, - Replacement replacement, - Archive archive) { - super(name, initialPopulationCreation, evaluation, termination, selection, variation, - replacement); - this.archive = archive; - } - - @Override - public List result() { - return archive.solutions(); - } - } - - if (algorithmResultParameter.value().equals("externalArchive")) { - return new EvolutionaryAlgorithmWithArchive( - "NSGA-II", - initialSolutionsCreation, - evaluation, - termination, - selection, - variation, - replacement, - archive); - } else { - return new EvolutionaryAlgorithm<>( - "NSGA-II", - initialSolutionsCreation, - evaluation, - termination, - selection, - variation, - replacement); - } - } - - public static void print(List> parameterList) { - parameterList.forEach(System.out::println); - } -} diff --git a/src/main/java/org/uma/evolver/factory/ConfigurableProblemFactory.java b/src/main/java/org/uma/evolver/factory/ConfigurableProblemFactory.java index 7b20975..df563c3 100644 --- a/src/main/java/org/uma/evolver/factory/ConfigurableProblemFactory.java +++ b/src/main/java/org/uma/evolver/factory/ConfigurableProblemFactory.java @@ -9,8 +9,6 @@ public static ConfigurableAlgorithmBuilder getProblem(String name, DoubleProblem ConfigurableAlgorithmBuilder configurableAlgorithmProblem = switch (name) { case "NSGAII" -> new ConfigurableNSGAII( problem, population, maxNumberOfEvaluations); - case "NSGAIIDE" -> new ConfigurableNSGAIIWithDE( - problem, population, maxNumberOfEvaluations); case "MOPSO" -> new ConfigurableMOPSO( problem, population, maxNumberOfEvaluations); case "MOEAD" -> new ConfigurableMOEAD(problem, population, maxNumberOfEvaluations, "resources/weightVectors") ; diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOEADParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOEADParameterDescriptionGenerator.java index 4020d80..57bce5b 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOEADParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOEADParameterDescriptionGenerator.java @@ -4,7 +4,7 @@ import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; /** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableMOEAD} * * @author Antonio J. Nebro (ajnebro@uma.es) */ diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOPSOParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOPSOParameterDescriptionGenerator.java index 07333b9..832b07e 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOPSOParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceMOPSOParameterDescriptionGenerator.java @@ -4,7 +4,7 @@ import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; /** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableMOPSO} * * @author Antonio J. Nebro (ajnebro@uma.es) */ diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIParameterDescriptionGenerator.java index e76bab5..80330c6 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIParameterDescriptionGenerator.java @@ -3,7 +3,7 @@ import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; /** - * Program to generate the irace configuration file for class {@link org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} * * @author Antonio J. Nebro (ajnebro@uma.es) */ diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIWithDEParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIWithDEParameterDescriptionGenerator.java deleted file mode 100644 index 64af7a2..0000000 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/irace/IraceNSGAIIWithDEParameterDescriptionGenerator.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.uma.evolver.parameterdescriptiongenerator.irace; - -import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; -import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAIIWithDE; -import org.uma.jmetal.problem.doubleproblem.impl.FakeDoubleProblem; - -/** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} - * - * @author Antonio J. Nebro (ajnebro@uma.es) - */ -public class IraceNSGAIIWithDEParameterDescriptionGenerator { - - public static void main(String[] args) { - var parameterFileGenerator = new IraceParameterDescriptionGenerator() ; - parameterFileGenerator.generateConfigurationFile(new ConfigurableNSGAIIWithDE(new FakeDoubleProblem(), 100, 20000)) ; - } -} diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOEADParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOEADParameterDescriptionGenerator.java index 3366f0c..4162162 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOEADParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOEADParameterDescriptionGenerator.java @@ -4,7 +4,7 @@ import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; /** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableMOEAD} * * @author Antonio J. Nebro (ajnebro@uma.es) */ diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOPSOParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOPSOParameterDescriptionGenerator.java index 5a84e69..02f16cb 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOPSOParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlMOPSOParameterDescriptionGenerator.java @@ -4,7 +4,7 @@ import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; /** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableMOPSO} * * @author Antonio J. Nebro (ajnebro@uma.es) */ diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlNSGAIIWithDEParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlNSGAIIWithDEParameterDescriptionGenerator.java deleted file mode 100644 index 58c85f9..0000000 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlNSGAIIWithDEParameterDescriptionGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.uma.evolver.parameterdescriptiongenerator.yaml; - -import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; -import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAIIWithDE; -import org.uma.jmetal.problem.doubleproblem.impl.FakeDoubleProblem; - -/** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} - * - * @author Antonio J. Nebro (ajnebro@uma.es) - */ -public class YamlNSGAIIWithDEParameterDescriptionGenerator { - public static void main(String[] args) { - var parameterFileGenerator = new YamlParameterDescriptionGenerator(); - String parameterString = parameterFileGenerator.generateConfiguration( - new ConfigurableNSGAIIWithDE(new FakeDoubleProblem(), 100, 20000)); - System.out.println(parameterString); - } -} diff --git a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlSMSEMOAParameterDescriptionGenerator.java b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlSMSEMOAParameterDescriptionGenerator.java index d44261f..ab96217 100644 --- a/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlSMSEMOAParameterDescriptionGenerator.java +++ b/src/main/java/org/uma/evolver/parameterdescriptiongenerator/yaml/YamlSMSEMOAParameterDescriptionGenerator.java @@ -1,9 +1,10 @@ package org.uma.evolver.parameterdescriptiongenerator.yaml; import org.uma.evolver.configurablealgorithm.impl.ConfigurableNSGAII; +import org.uma.evolver.configurablealgorithm.impl.ConfigurableSMSEMOA; /** - * Program to generate the irace configuration file for class {@link ConfigurableNSGAII} + * Program to generate the irace configuration file for class {@link ConfigurableSMSEMOA} * * @author Antonio J. Nebro (ajnebro@uma.es) */