Durchführen einer Mehrzieloptimierung mit dem genetischen Algorithmus
Dieses Beispiel zeigt, wie eine multiobjektive Optimierung mit der multiobjektiven genetischen Algorithmusfunktion gamultiobj in Global Optimization Toolbox durchgeführt wird.
Einfaches multiobjektives Optimierungsproblem
gamultiobj kann verwendet werden, um Probleme der mehrzieligen Optimierung mit mehreren Variablen zu lösen. Hier möchten wir zwei Ziele mit jeweils einer Entscheidungsvariable minimieren.
min F(x) = [objective1(x); objective2(x)]
x where, objective1(x) = (x+2)^2 - 10, and
objective2(x) = (x-2)^2 + 20% Plot two objective functions on the same axis x = -10:0.5:10; f1 = (x+2).^2 - 10; f2 = (x-2).^2 + 20; plot(x,f1); hold on; plot(x,f2,'r'); grid on; title('Plot of objectives ''(x+2)^2 - 10'' and ''(x-2)^2 + 20''');

Die beiden Ziele haben ihre Minima bei x = -2 bzw. x = +2. Bei einem Problem mit mehreren Zielen sind jedoch x = -2, x = 2 und jede Lösung im Bereich -2 <= x <= 2 gleichermaßen optimal. Für dieses Problem mit mehreren Zielen gibt es keine einheitliche Lösung. Das Ziel des multiobjektiven genetischen Algorithmus besteht darin, eine Reihe von Lösungen in diesem Bereich zu finden (idealerweise mit einer guten Streuung). Die Menge der Lösungen wird auch als Pareto-Front bezeichnet. Alle Lösungen an der Pareto-Front sind optimal.
Kodierung der Fitnessfunktion
Wir erstellen eine MATLAB ® Datei mit dem Namen simple_multiobjective.m:
function y = simple_multiobjective(x) y(1) = (x+2)^2 - 10; y(2) = (x-2)^2 + 20;
Der Löser des genetischen Algorithmus geht davon aus, dass die Fitnessfunktion einen Input x akzeptiert, wobei x ein Zeilenvektor mit so vielen Elementen ist wie die Anzahl der Variablen im Problem. Die Fitnessfunktion berechnet den Wert jeder Zielfunktion und gibt diese Werte in einer einzigen Vektorausgabe y zurück.
Minimieren mit gamultiobj
Um die Funktion gamultiobj zu verwenden, müssen wir mindestens zwei Eingabeargumente, eine Fitnessfunktion und die Anzahl der Variablen im Problem angeben. Die ersten beiden von gamultiobj zurückgegebenen Ausgabeargumente sind X, die Punkte auf der Pareto-Front, und FVAL, die Zielfunktionswerte bei den Werten X. Ein drittes Ausgabeargument, exitFlag, gibt den Grund an, warum gamultiobj angehalten hat. Ein viertes Argument, OUTPUT, enthält Informationen zur Leistung des Solvers. gamultiobj kann außerdem ein fünftes Argument, POPULATION, zurückgeben, das die Population enthält, als gamultiobj beendet wurde, und ein sechstes Argument, SCORE, das die Funktionswerte aller Ziele für POPULATION enthält, als gamultiobj beendet wurde.
FitnessFunction = @simple_multiobjective; numberOfVariables = 1; [x,fval] = gamultiobj(FitnessFunction,numberOfVariables);
gamultiobj stopped because it exceeded options.MaxGenerations.
Das vom Solver zurückgegebene X ist eine Matrix, in der jede Zeile der Punkt auf der Pareto-Front für die Zielfunktionen ist. FVAL ist eine Matrix, in der jede Zeile den Wert der Zielfunktionen enthält, die am entsprechenden Punkt in X ausgewertet werden.
size(x) size(fval)
ans =
18 1
ans =
18 2
Problem der eingeschränkten Mehrzieloptimierung
gamultiobj kann Optimierungsprobleme mit linearer Ungleichheit, Gleichheit und einfachen gebundenen Einschränkungen verarbeiten. Hier möchten wir gebundene Einschränkungen zu einem zuvor gelösten einfachen Problem mit mehreren Zielen hinzufügen.
min F(x) = [objective1(x); objective2(x)]
xsubject to -1.5 <= x <= 0 (bound constraints)
where, objective1(x) = (x+2)^2 - 10, and
objective2(x) = (x-2)^2 + 20 gamultiobj akzeptiert lineare Ungleichheitsbeschränkungen in der Form A*x <= b und lineare Gleichheitsbeschränkungen in der Form Aeq*x = beq und gebundene Beschränkungen in der Form lb <= x <= ub. Wir übergeben A und Aeq als Matrizen und b, beq, lb und ub als Vektoren. Da wir in diesem Beispiel keine linearen Einschränkungen haben, übergeben wir für diese Eingaben [].
A = []; b = []; Aeq = []; beq = []; lb = -1.5; ub = 0; x = gamultiobj(FitnessFunction,numberOfVariables,A,b,Aeq,beq,lb,ub);
gamultiobj stopped because it exceeded options.MaxGenerations.
Alle Lösungen in X (jede Zeile) erfüllen alle linearen und gebundenen Einschränkungen innerhalb der in options.ConstraintTolerance angegebenen Toleranz. Wenn Sie jedoch eine eigene Crossover- oder Mutationsfunktion verwenden, stellen Sie sicher, dass die neuen Individuen hinsichtlich linearer und einfacher Begrenzungsbeschränkungen durchführbar sind.
Visualisierung hinzufügen
gamultiobj kann über das Optionsargument eine oder mehrere Plotfunktionen akzeptieren. Diese Funktion ist nützlich, um die Leistung des Solvers zur Laufzeit zu visualisieren. Plotfunktionen können mit optimoptions ausgewählt werden.
Hier verwenden wir optimoptions, um zwei Plotfunktionen auszuwählen. Die erste Plot-Funktion ist gaplotpareto, die die Pareto-Front (beschränkt auf drei beliebige Ziele) in jeder Generation darstellt. Die zweite Plot-Funktion ist gaplotscorediversity, die die Punktevielfalt für jedes Ziel darstellt. Die Optionen werden als letztes Argument an den Solver übergeben.
options = optimoptions(@gamultiobj,'PlotFcn',{@gaplotpareto,@gaplotscorediversity});
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because it exceeded options.MaxGenerations.

Vektorisieren Ihrer Fitnessfunktion
Betrachten Sie noch einmal die vorherigen Fitnessfunktionen:
objective1(x) = (x+2)^2 - 10, and objective2(x) = (x-2)^2 + 20
Standardmäßig übergibt der gamultiobj-Solver immer nur einen Punkt auf einmal an die Fitnessfunktion. Wenn die Fitnessfunktion jedoch so vektorisiert wird, dass sie eine Reihe von Punkten akzeptiert und eine Reihe von Funktionswerten zurückgibt, können Sie Ihre Lösung beschleunigen.
Wenn der Solver beispielsweise fünf Punkte in einem Aufruf dieser Fitnessfunktion auswerten muss, ruft er die Funktion mit einer Matrix der Größe 5 x 1 auf, d.h. 5 Zeilen und 1 Spalte (denken Sie daran, dass 1 die Anzahl der Variablen ist).
Erstellen Sie eine MATLAB-Datei mit dem Namen vectorized_multiobjective.m:
function scores = vectorized_multiobjective(pop)
popSize = size(pop,1); % Population size
numObj = 2; % Number of objectives
% initialize scores
scores = zeros(popSize, numObj);
% Compute first objective
scores(:,1) = (pop + 2).^2 - 10;
% Compute second objective
scores(:,2) = (pop - 2).^2 + 20;Diese vektorisierte Version der Fitnessfunktion nimmt eine Matrix pop mit einer beliebigen Anzahl von Punkten, den Zeilen von pop und gibt eine Matrix der Größe populationSize-mal- numberOfObjectives zurück.
Wir müssen angeben, dass die Fitnessfunktion mit den mit optimoptions erstellten Optionen vektorisiert wird. Die Optionen werden als neuntes Argument übergeben.
FitnessFunction = @(x) vectorized_multiobjective(x);
options = optimoptions(@gamultiobj,'UseVectorized',true);
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.