Minimisation à l'aide d'un algorithme de recuit simulé
Cet exemple montre comment créer et minimiser une fonction objectif à l'aide de l'algorithme de recuit simulé (fonction simulannealbnd) dans Global Optimization Toolbox. Pour les détails algorithmiques, voir How Simulated Annealing Works.
Fonction objectif simple
La fonction objectif à minimiser est une fonction simple de deux variables :
min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2;
x
Cette fonction est connue sous le nom de « cam », comme décrit dans L.C.W. Dixon et G.P. Szego [1].
Pour implémenter le calcul de la fonction objectif, le fichier MATLAB ® simple_objective.m contient le code suivant :
type simple_objectivefunction y = simple_objective(x) %SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;
Tous les solveurs Global Optimization Toolbox supposent que l'objectif a une entrée x, où x a autant d'éléments que le nombre de variables dans le problème. La fonction objectif calcule la valeur scalaire de la fonction objectif et la renvoie dans son argument de sortie unique y.
Réduire à l'aide de simulannealbnd
Pour minimiser la fonction objectif en utilisant simulannealbnd, transmettez un handle de fonction à la fonction objectif et un point de départ x0 comme deuxième argument. Pour la reproductibilité, définissez le flux de nombres aléatoires.
ObjectiveFunction = @simple_objective; x0 = [0.5 0.5]; % Starting point rng default % For reproducibility [x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
-0.0896 0.7130
fval = -1.0316
exitFlag = 1
output = struct with fields:
iterations: 2948
funccount: 2971
message: 'simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.'
rngstate: [1x1 struct]
problemtype: 'unconstrained'
temperature: [2x1 double]
totaltime: 1.0241
simulannealbnd renvoie quatre arguments de sortie :
x— Meilleur point trouvéfval— Valeur de la fonction au meilleur pointexitFlag— Entier correspondant à la raison pour laquelle la fonction s'est arrêtéeoutput— Informations sur les étapes d'optimisation
Minimisation contrainte et bornée
Vous pouvez utiliser simulannealbnd pour résoudre des problèmes avec des contraintes bornées. Transmettez les limites inférieures et supérieures sous forme de vecteurs. Pour chaque coordonnée i, le solveur garantit que lb(i) <= x(i) <= ub(i). Imposez les limites –64 <= x(i) <= 64.
lb = [-64 -64]; ub = [64 64];
Exécutez le solveur avec les arguments de limite inférieure et supérieure.
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,lb,ub);
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);The number of iterations was : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);The best function value found was : -1.03163
Le solveur trouve essentiellement la même solution que précédemment.
Minimiser une fonction en utilisant des arguments supplémentaires
Parfois, vous souhaitez qu'une fonction objectif soit paramétrée par des arguments supplémentaires qui agissent comme des constantes pendant l'optimisation. Par exemple, dans la fonction objectif précédente, vous souhaiterez peut-être remplacer les constantes 4, 2.1 et 4 par des paramètres que vous pouvez modifier pour créer une famille de fonctions objectif. Pour plus d'informations, voir Passing Extra Parameters.
Réécrivez la fonction objectif pour prendre trois paramètres supplémentaires dans un nouveau problème de minimisation.
min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2;
x
a, b et c sont des paramètres de la fonction objectif qui agissent comme des constantes pendant l'optimisation (ils ne sont pas modifiés dans le cadre de la minimisation). Pour implémenter le calcul de la fonction objectif, le fichier MATLAB parameterized_objective.m contient le code suivant :
type parameterized_objectivefunction y = parameterized_objective(x,p1,p2,p3) %PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;
Encore une fois, vous devez transmettre un handle de fonction à la fonction objectif ainsi qu'un point de départ comme deuxième argument.
simulannealbnd appelle la fonction objectif avec un seul argument x, mais la fonction objectif a quatre arguments : x, a, b et c. Pour indiquer quelle variable est l'argument, utilisez une fonction anonyme pour capturer les valeurs des arguments supplémentaires (les constantes a, b et c). Créez un handle de fonction ObjectiveFunction vers une fonction anonyme qui prend une entrée x, mais appelle parameterized_objective avec x, a, b et c. Lorsque vous créez le handle de fonction de ObjectiveFunction, les variables a, b et c ont des valeurs qui sont stockées dans la fonction anonyme.
a = 4; b = 2.1; c = 4; % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
0.0898 -0.7127
fval = -1.0316
Le solveur trouve essentiellement la même solution que précédemment.
Références
[1] Dixon, L. C. W., et G .P. Szego (éd.). Towards Global Optimisation 2. North-Holland : Elsevier Science Ltd., Amsterdam, 1978.