https://github.com/jMetal/jMetalDocumentation/blob/master/running.md
Je viens de traduire cette page en gros.
** La seule façon de définir l'algorithme est d'écrire une classe appelée runner **. (Il semble que nous souhaitons pouvoir lire les paramètres à partir d'un fichier externe dans les versions suivantes et suivantes)
Au moins une classe runner est fournie pour les algorithmes inclus dans jMetal.
Ils sont dans le module jmetal-exec
ce dossier C'est dedans.
Les cinq classes de coureurs NSGA-II suivantes sont données à titre d'exemple. Ceux-ci sont destinés à être utilisés à des fins différentes.
NSGAIIRnner
: paramètres NSGA-II standard pour résoudre les problèmes de valeur continue.NSGAIIInteger
: Paramètres de résolution des problèmes de valeur entière.NSGAIIBinary
: Paramètres de résolution des problèmes binaires.NSGAIIMeasures
: Similaire à NSGAIIRunner
, mais inclut un exemple d'utilisation des mesures.ParallelNSGAII
: Similaire à NSGAIIRunner
, mais traite en parallèle en utilisant des threads lors de l'évaluation des populations.Les détails de la classe NSGAIIRunner
sont indiqués ci-dessous.
Comme indiqué dans Javadoc, le premier argument est le nom de classe du problème à résoudre.
Le deuxième argument est un paramètre optionnel qui donne le chemin du fichier contenant l'approximation optimale du front de parate.
Étant donné un front de parate, il est utilisé pour calculer tous les indicateurs de qualité disponibles.
public class NSGAIIRunner extends AbstractAlgorithmRunner {
/**
* @param args Command line arguments.
* @throws JMetalException
* @throws FileNotFoundException
* Invoking command: java org.uma.jmetal.runner.multiobjetive.NSGAIIRunner problemName [referenceFront]
*/
public static void main(String[] args) throws JMetalException, FileNotFoundException {
La méthode main
déclare d'abord le type de problème à résoudre et l'opérateur à utiliser.
(Dans cet exemple, nous déclarons un problème qui traite DoubleSolution
comme un individu.)
referenceParetoFront
indique le chemin d'accès optimal du fichier Pareto Front donné.
Problem<DoubleSolution> problem;
Algorithm<List<DoubleSolution>> algorithm;
CrossoverOperator<DoubleSolution> crossover;
MutationOperator<DoubleSolution> mutation;
SelectionOperator<List<DoubleSolution>, DoubleSolution> selection;
String referenceParetoFront = "" ;
Ensuite, il analyse les arguments donnés au programme. Si aucun argument n'est donné, le problème de référence est résolu par défaut. (Dans cet exemple, résolvez ZDT1.)
String problemName ;
if (args.length == 1) {
problemName = args[0];
} else if (args.length == 2) {
problemName = args[0] ;
referenceParetoFront = args[1] ;
} else {
problemName = "org.uma.jmetal.problem.multiobjective.zdt.ZDT1";
referenceParetoFront = "jmetal-problem/src/test/resources/pareto_fronts/ZDT1.pf" ;
}
Ensuite, chargez problem
à partir du nom de la classe.
problem = ProblemUtils.<DoubleSolution> loadProblem(problemName);
Ensuite, définissez l'opérateur et l'algorithme.
double crossoverProbability = 0.9 ;
double crossoverDistributionIndex = 20.0 ;
crossover = new SBXCrossover(crossoverProbability, crossoverDistributionIndex) ;
double mutationProbability = 1.0 / problem.getNumberOfVariables() ;
double mutationDistributionIndex = 20.0 ;
mutation = new PolynomialMutation(mutationProbability, mutationDistributionIndex) ;
selection = new BinaryTournamentSelection<DoubleSolution>(new RankingAndCrowdingDistanceComparator<DoubleSolution>());
algorithm = new NSGAIIBuilder<DoubleSolution>(problem, crossover, mutation)
.setSelectionOperator(selection)
.setMaxEvaluations(25000)
.setPopulationSize(100)
.build() ;
Enfin, l'algorithme est exécuté et la solution obtenue est écrite dans deux fichiers. Écrivez la valeur de la variable dans l'un et la valeur de la fonction objectif dans l'autre. De plus, si le front de parate est donné comme argument, imprimez les résultats du calcul de tous les indicateurs de qualité disponibles.
AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor(algorithm)
.execute() ;
List<DoubleSolution> population = algorithm.getResult() ;
long computingTime = algorithmRunner.getComputingTime() ;
JMetalLogger.logger.info("Total execution time: " + computingTime + "ms");
printFinalSolutionSet(population);
if (!referenceParetoFront.equals("")) {
printQualityIndicators(population, referenceParetoFront) ;
}
}