https://github.com/jMetal/jMetalDocumentation/blob/master/running.md
Ich habe diese Seite gerade grob übersetzt.
** Die einzige Möglichkeit, den Algorithmus festzulegen, besteht darin, eine Klasse namens Runner ** zu schreiben. (Es scheint, dass wir in der nächsten und den folgenden Versionen die Einstellungen aus einer externen Datei lesen möchten.)
Für die in jMetal enthaltenen Algorithmen wird mindestens eine Runner-Klasse bereitgestellt. Sie befinden sich im Modul "jmetal-exec" dieser Ordner. Es ist in.
Die folgenden fünf NSGA-II-Läuferklassen werden als Beispiele angegeben. Diese sollen für verschiedene Zwecke verwendet werden.
NSGAIIRnner
: Standardeinstellungen für NSGA-II zur Lösung von Problemen mit kontinuierlichen Werten.NSGAIIInteger
: Einstellungen zum Lösen von Integer-Wert-Problemen.NSGAIIBinary
: Einstellungen zur Lösung von Binärproblemen.NSGAIIMeasures
: Ähnlich wie NSGAIIRunner
, enthält jedoch ein Beispiel für die Verwendung von Maßnahmen.ParallelNSGAII
: Ähnlich wie NSGAIIRunner
, wird jedoch bei der Bewertung von Populationen parallel mithilfe von Threads verarbeitet.Die Details der NSGAIIRunner-Klasse sind unten aufgeführt. Wie in Javadoc gezeigt, ist das erste Argument der Klassenname des zu lösenden Problems. Das zweite Argument ist ein optionaler Parameter, der den Pfad der Datei angibt, die die optimale Parate-Front-Approximation enthält. Bei gegebener Parate-Front werden alle verfügbaren Qualitätsindikatoren berechnet.
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 {
Die Hauptmethode deklariert zunächst die Art des zu lösenden Problems und den zu verwendenden Operator.
(In diesem Beispiel wird das Problem der Behandlung von "DoubleSolution" als Einzelperson erläutert.)
referenceParetoFront
gibt den optimalen angegebenen Pareto Front-Dateipfad an.
Problem<DoubleSolution> problem;
Algorithm<List<DoubleSolution>> algorithm;
CrossoverOperator<DoubleSolution> crossover;
MutationOperator<DoubleSolution> mutation;
SelectionOperator<List<DoubleSolution>, DoubleSolution> selection;
String referenceParetoFront = "" ;
Als nächstes werden die dem Programm gegebenen Argumente analysiert. Wenn kein Argument angegeben wird, ist das Benchmark-Problem standardmäßig gelöst. (Lösen Sie in diesem Beispiel 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" ;
}
Laden Sie als nächstes problem
aus dem Klassennamen.
problem = ProblemUtils.<DoubleSolution> loadProblem(problemName);
Stellen Sie dann den Operator und den Algorithmus ein.
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() ;
Schließlich wird der Algorithmus ausgeführt und die erhaltene Lösung in zwei Dateien geschrieben. Schreiben Sie den Wert der Variablen in die eine und den Wert der Zielfunktion in die andere. Wenn die Paratfront als Argument angegeben wird, drucken Sie auch die Berechnungsergebnisse aller verfügbaren Qualitätsindikatoren aus.
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) ;
}
}