Hauptinhalt

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Auswirkungen genetischer Algorithmusoptionen

Dieses Beispiel zeigt die Auswirkungen einiger Optionen für die genetische Algorithmusfunktion ga. Sie erstellen und ändern Optionen mithilfe der Funktion optimoptions.

Richten Sie ein Problem für ga ein

ga sucht mithilfe des genetischen Algorithmus nach einem Minimum einer Funktion. Verwenden Sie für dieses Beispiel ga, um die Fitnessfunktion shufcn zu minimieren, eine reellwertige Funktion mit zwei Variablen.

Zeichnen Sie shufcn über den Bereich = [-2 2;-2 2], indem Sie plotobjective aufrufen, das beim Ausführen dieses Beispiels einbezogen wird.

plotobjective(@shufcn,[-2 2; -2 2]);

Um den ga-Solver zu verwenden, geben Sie mindestens zwei Eingabeargumente an: eine Fitnessfunktion und die Anzahl der Variablen im Problem. Die ersten beiden von ga zurückgegebenen Ausgabeargumente sind x, der beste gefundene Punkt, und Fval, der Funktionswert am besten Punkt. Ein drittes Ausgabeargument, exitFlag, gibt an, warum ga angehalten hat. ga kann auch ein viertes Argument, Output, zurückgeben, das Informationen zur Leistung des Solvers enthält.

FitnessFunction = @shufcn;
numberOfVariables = 2;

Führen Sie den ga-Solver aus.

rng default % For reproducibility
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 124
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 5881
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.199

Wenn Sie dieses Beispiel ohne den Befehl rng default ausführen, können Ihre Ergebnisse abweichen, da ga ein stochastischer Algorithmus ist.

So funktioniert der genetische Algorithmus

Der genetische Algorithmus arbeitet auf einer Population mithilfe einer Reihe von Operatoren, die auf die Population angewendet werden. Eine Population ist eine Menge von Punkten im Entwurfsraum. Die Anfangspopulation wird standardmäßig nach dem Zufallsprinzip generiert. Der Algorithmus berechnet die nächste Generation der Population anhand der Fitness der Individuen der aktuellen Generation. Einzelheiten finden Sie unter So funktioniert der genetische Algorithmus.

Visualisierung hinzufügen

Um die Leistung des Solvers während der Ausführung zu visualisieren, legen Sie mit optimoptions eine 'PlotFcn'-Option fest. Wählen Sie in diesem Fall zwei Plotfunktionen in einem Zellenarray aus. Setze gaplotbestf ein, das die beste und durchschnittliche Punktzahl der Population in jeder Generation aufzeichnet. Legen Sie außerdem gaplotstopping fest, das den Prozentsatz der erfüllten Abbruchkriterien darstellt.

opts = optimoptions(@ga,'PlotFcn',{@gaplotbestf,@gaplotstopping});

Führen Sie den ga-Solver aus, einschließlich des opts-Arguments.

[x,Fval,exitFlag,Output] = ...
    ga(FitnessFunction,numberOfVariables,[],[],[],[],[],[],[],opts);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

Festlegen von Populationsoptionen

Populationsoptionen können einen großen Einfluss auf die Leistung des Solvers haben. Die Geschwindigkeit jeder Iteration hängt von der Populationsgröße ab: Eine größere Population führt zu langsameren Iterationen. Umgekehrt führt eine größere Population dazu, dass ga gründlicher untersucht, was zu einer besseren Lösung führen kann. Ebenso kann ein größerer anfänglicher Bereich zu einer gründlicheren Erkundung führen, kann aber eine größere Population erfordern, um den größeren Bereich mit ähnlicher Gründlichkeit zu erkunden.

Populationsgröße angeben

ga erstellt eine standardmäßige Anfangspopulation mithilfe eines einheitlichen Zufallszahlengenerators. Die von ga verwendete Standardpopulationsgröße beträgt 50, wenn die Anzahl der Entscheidungsvariablen kleiner als 5 ist, und andernfalls 200. Für manche Probleme ist die Standardgröße möglicherweise nicht optimal geeignet. Für kleinere Probleme reicht beispielsweise eine geringere Populationsgröße aus. Da das aktuelle Problem nur zwei Variablen hat, geben Sie eine Populationsgröße von 10 an. Setzen Sie den Wert der Option PopulationSize in den vorhandenen Optionen opts auf 10.

opts.PopulationSize = 10;

Anfänglichen Populationbereich angeben

Die Standardmethode zum Generieren einer Anfangspopulation verwendet einen gleichmäßigen Zufallszahlengenerator. Bei Problemen ohne ganzzahlige Einschränkungen erstellt ga eine Anfangspopulation, bei der alle Punkte im Bereich von –10 bis 10 liegen. Sie können beispielsweise mit diesem Befehl eine Population der Größe drei im Standardbereich generieren:

Population = [-10,-10] + 20*rand(3,2);

Sie können den anfänglichen Bereich festlegen, indem Sie die Option InitialPopulationRange ändern. Der Bereich muss eine Matrix mit zwei Zeilen sein. Wenn der Bereich nur eine Spalte hat, also 2 x 1 ist, dann ist der Bereich jeder Variablen der angegebene Bereich. Wenn Sie den Bereich beispielsweise auf [-1; 1] festlegen, beträgt der Anfangsbereich für beide Variablen –1 bis 1. Um für jede Variable einen anderen Anfangsbereich anzugeben, müssen Sie den Bereich als Matrix mit zwei Zeilen und numberOfVariables Spalten angeben. Wenn Sie den Bereich beispielsweise auf [-1 0; 1 2] festlegen, hat die erste Variable den Bereich von –1 bis 1 und die zweite Variable den Bereich von 0 bis 2 (jede Spalte entspricht einer Variable).

Ändern Sie den Wert der Option InitialPopulationRange in den vorhandenen Optionen opts.

opts.InitialPopulationRange = [-1 0; 1 2];

Führen Sie den ga-Solver aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 67
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 614
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -179.987

Ergebnisse reproduzieren

Standardmäßig startet ga mit einer zufälligen Anfangspopulation, die mit MATLAB ®-Zufallszahlengeneratoren erstellt wird. Der Solver erzeugt die nächste Generation mithilfe von ga-Operatoren, die ebenfalls diese gleichen Zufallszahlengeneratoren verwenden. Bei jeder Generierung einer Zufallszahl ändert sich der Zustand des Zufallszahlengenerators. Auch wenn Sie keine Optionen ändern, können Sie beim erneuten Ausführen des Solvers andere Ergebnisse erhalten.

Führen Sie den Solver zweimal aus, um dieses Phänomen zu zeigen.

Führen Sie den ga-Solver aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.484

Führen Sie ga erneut aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -185.867

ga liefert in den beiden Durchläufen unterschiedliche Ergebnisse, da sich der Zustand des Zufallszahlengenerators von einem Durchlauf zum anderen ändert.

Wenn Sie Ihre Ergebnisse reproduzieren möchten, bevor Sie ga ausführen, können Sie den Status des Zufallszahlenstroms speichern.

thestate = rng;

Führen Sie ga aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.467

Setzen Sie den Stream zurück und führen Sie ga erneut aus. Die Ergebnisse sind identisch mit denen des vorherigen Durchlaufs.

rng(thestate);
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.467

Wenn Sie ga ausführen, bevor Sie angeben, dass die Ergebnisse reproduziert werden sollen, können Sie den Zufallszahlengenerator zurücksetzen, solange Sie über die output-Struktur verfügen.

strm = RandStream.getGlobalStream;
strm.State = Output.rngstate.State;

Führen Sie ga erneut aus. Auch hier sind die Ergebnisse identisch.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.467

Abbruchkriterien ändern

ga verwendet vier verschiedene Kriterien, um zu bestimmen, wann der Löser gestoppt werden soll. ga stoppt, wenn die maximale Anzahl an Generationen erreicht ist; standardmäßig entspricht diese Zahl dem 100-fachen der Anzahl an Variablen. ga erkennt außerdem, ob sich der beste Fitnesswert für eine bestimmte Zeit (Zeitlimit für Stillstand) oder für eine bestimmte Anzahl an Generationen (maximale Stillstandsgenerationen) nicht ändert. Ein weiteres Kriterium ist die maximale Zeitbegrenzung in Sekunden. Ändern Sie die Abbruchkriterien, um die maximale Anzahl der Generationen auf 300 und die maximale Anzahl der Stillstandsgenerationen auf 100 zu erhöhen.

opts = optimoptions(opts,'MaxGenerations',300,'MaxStallGenerations', 100);

Führen Sie den ga-Solver erneut aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 299
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 2702
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.729

Geben Sie ga-Operatoren an

ga beginnt mit einer zufälligen Menge von Punkten in der Population und verwendet Operatoren, um die nächste Generation der Population zu erzeugen. Die verschiedenen Operatoren sind Skalierung, Auswahl, Crossover und Mutation. Die Toolbox bietet mehrere Funktionen, die für jeden Operator angegeben werden können. Geben Sie fitscalingprop für FitnessScalingFcn und selectiontournament für SelectionFcn an.

opts = optimoptions(@ga,'SelectionFcn',@selectiontournament, ...
                        'FitnessScalingFcn',@fitscalingprop);

Führen Sie ga erneut aus.

[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
    [],[],[],[],opts);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The number of generations is: %d\n', Output.generations);
The number of generations is: 52
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 2497
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: -186.417

Der beste Funktionswert kann sich aufgrund der angegebenen Operatoren verbessern oder verschlechtern. Um herauszufinden, welcher Operatorsatz für Ihr Problem am besten geeignet ist, ist es häufig am besten, mit unterschiedlichen Operatoren zu experimentieren.

Siehe auch

Themen