Minimizzazione vincolata utilizzando ga, basata sui problemi
Questo esempio mostra come minimizzare una funzione obiettivo, soggetta a vincoli e limiti di disuguaglianza non lineare, utilizzando ga nell'approccio basato sui problemi. Per una versione di questo problema basata sul risolutore, vedere Minimizzazione vincolata utilizzando l'algoritmo genetico .
Problema di minimizzazione vincolata
Per questo problema, la funzione di idoneità da minimizzare è una semplice funzione delle variabili 2-D X e Y.
camxy = @(X,Y)(4 - 2.1.*X.^2 + X.^4./3).*X.^2 + X.*Y + (-4 + 4.*Y.^2).*Y.^2;
Questa funzione è descritta in Dixon e Szego [1].
Inoltre, il problema presenta vincoli e limiti non lineari.
x*y + x - y + 1.5 <= 0 (nonlinear constraint) 10 - x*y <= 0 (nonlinear constraint) 0 <= x <= 1 (bound) 0 <= y <= 13 (bound)
Rappresentare graficamente la regione del vincolo non lineare su un grafico di superficie della funzione di idoneità. I vincoli limitano la soluzione alla piccola regione sopra entrambe le curve rosse.
x1 = linspace(0,1); y1 = (-x1 - 1.5)./(x1 - 1); y2 = 10./x1; [X,Y] = meshgrid(x1,linspace(0,13)); Z = camxy(X,Y); surf(X,Y,Z,"LineStyle","none") hold on z1 = camxy(x1,y1); z2 = camxy(x1,y2); plot3(x1,y1,z1,'r-',x1,y2,z2,'r-') xlim([0 1]) ylim([0 13]) zlim([0,max(Z,[],"all")]) hold off

Creare variabili di ottimizzazione, problemi e vincoli
Per impostare questo problema, creare le variabili di ottimizzazione x e y. Imposta i limiti quando crei le variabili.
x = optimvar("x","LowerBound",0,"UpperBound",1); y = optimvar("y","LowerBound",0,"UpperBound",13);
Creare l'obiettivo come espressione di ottimizzazione.
cam = camxy(x,y);
Creare un problema di ottimizzazione con questa funzione obiettivo.
prob = optimproblem("Objective",cam);Creare i due vincoli di disuguaglianza non lineare e includerli nel problema.
prob.Constraints.cons1 = x*y + x - y + 1.5 <= 0; prob.Constraints.cons2 = 10 - x*y <= 0;
Rivedi il problema.
show(prob)
OptimizationProblem :
Solve for:
x, y
minimize :
(((((4 - (2.1 .* x.^2)) + (x.^4 ./ 3)) .* x.^2) + (x .* y)) + (((-4) + (4 .* y.^2)) .* y.^2))
subject to cons1:
((((x .* y) + x) - y) + 1.5) <= 0
subject to cons2:
(10 - (x .* y)) <= 0
variable bounds:
0 <= x <= 1
0 <= y <= 13
Risolvi problema
Risolvi il problema specificando il risolutore ga.
[sol,fval] = solve(prob,"Solver","ga")
Solving problem using ga. Optimization finished: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
sol = struct with fields:
x: 0.8122
y: 12.3103
fval = 9.1268e+04
Aggiungi visualizzazione
Per osservare i progressi del risolutore, specificare le opzioni che selezionano due funzioni di grafico. La funzione di grafico gaplotbestf traccia il miglior valore della funzione obiettivo a ogni iterazione, mentre la funzione di grafico gaplotmaxconstr traccia la massima violazione del vincolo a ogni iterazione. Imposta queste due funzioni di grafico in una matrice di celle. Inoltre, è possibile visualizzare informazioni sullo stato di avanzamento del risolutore nella finestra di comando impostando l'opzione Display su 'iter'.
options = optimoptions(@ga,... 'PlotFcn',{@gaplotbestf,@gaplotmaxconstr},... 'Display','iter');
Eseguire il risolutore, incluso l'argomento options.
[sol,fval] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga.
Single objective optimization:
2 Variables
2 Nonlinear inequality constraints
Options:
CreationFcn: @gacreationuniform
CrossoverFcn: @crossoverscattered
SelectionFcn: @selectionstochunif
MutationFcn: @mutationadaptfeasible
Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2520 91357.8 0 0
2 4982 91324.1 4.55e-05 0 3 7914 97166.6 0 0
4 16145 91268.4 0.0009997 0Optimization finished: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.

sol = struct with fields:
x: 0.8123
y: 12.3103
fval = 9.1268e+04
I vincoli non lineari fanno sì che ga risolva molti sottoproblemi a ogni iterazione. Come mostrato sia nei grafici che nella visualizzazione iterativa, il processo di soluzione prevede poche iterazioni. Tuttavia, la colonna Func-count nella visualizzazione iterativa mostra molte valutazioni di funzioni per iterazione.
Funzioni non supportate
Se le funzioni di vincolo obiettivo o non lineare non sono supportate (vedere Supported Operations for Optimization Variables and Expressions), utilizzare fcn2optimexpr per convertirle in una forma adatta all'approccio basato sui problemi. Ad esempio, supponiamo che al posto del vincolo , si abbia il vincolo , dove è la funzione di Bessel modificata besseli(1,x). (Le funzioni di Bessel non sono funzioni supportate.) Crea questo vincolo usando fcn2optimexpr . Per prima cosa, crea un'espressione di ottimizzazione per .
bfun = fcn2optimexpr(@(t,u)besseli(1,t) + besseli(1,u),x,y);
Quindi, sostituisci il vincolo cons2 con il vincolo bfun >= 10 .
prob.Constraints.cons2 = bfun >= 10;
Risolvere il problema. La soluzione è diversa perché la regione di vincolo è diversa.
[sol2,fval2] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga.
Single objective optimization:
2 Variables
2 Nonlinear inequality constraints
Options:
CreationFcn: @gacreationuniform
CrossoverFcn: @crossoverscattered
SelectionFcn: @selectionstochunif
MutationFcn: @mutationadaptfeasible
Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2512 974.044 0 0
2 4974 960.998 0 0 3 7436 963.12 0 0
4 12001 960.83 0.0009335 0Optimization finished: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.

sol2 = struct with fields:
x: 0.4999
y: 3.9979
fval2 = 960.8300
Riferimenti
[1] Dixon, L. C. W., e G .P. Szego (a cura di). Verso l'ottimizzazione globale 2. Olanda Settentrionale: Elsevier Science Ltd., Amsterdam, 1978.
Vedi anche
ga | solve | fcn2optimexpr