2 Copyright (C) 2008-2024 EDF R&D
4 This file is part of SALOME ADAO module.
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 .. index:: single: ParticleSwarmOptimization
25 .. index:: single: Essaim particulaire (Optimisation par)
26 .. _section_ref_algorithm_ParticleSwarmOptimization:
28 Algorithme de calcul "*ParticleSwarmOptimization*"
29 --------------------------------------------------
31 .. ------------------------------------ ..
32 .. include:: snippets/Header2Algo01.rst
34 Cet algorithme réalise une estimation de l'état d'un système par minimisation
35 sans gradient d'une fonctionnelle d'écart :math:`J`, en utilisant une méthode
36 évolutionnaire d'essaim particulaire. C'est une méthode qui n'utilise pas les
37 dérivées de la fonctionnelle d'écart. Elle entre dans la même catégorie que les
38 :ref:`section_ref_algorithm_DerivativeFreeOptimization`,
39 :ref:`section_ref_algorithm_DifferentialEvolution` ou
40 :ref:`section_ref_algorithm_TabuSearch`.
42 C'est une méthode d'optimisation mono-objectif, permettant la recherche du
43 minimum global d'une fonctionnelle d'erreur :math:`J` quelconque de type
44 :math:`L^1`, :math:`L^2` ou :math:`L^{\infty}`, avec ou sans pondérations,
45 comme décrit dans la section pour :ref:`section_theory_optimization`. La
46 fonctionnelle d'erreur par défaut est celle de moindres carrés pondérés
47 augmentés, classiquement utilisée en assimilation de données.
49 Elle est basée sur l'évolution d'une population (appelée "essaim") d'états
50 (chaque individu étant appelé une "particule" ou un "insecte"). Il existe
51 diverses variantes de cet algorithme. On propose ici les formulations stables
52 et robustes suivantes :
55 pair: Variant ; CanonicalPSO
57 pair: Variant ; SPSO-2011
58 pair: Variant ; AIS PSO
59 pair: Variant ; SIS PSO
60 pair: Variant ; PSIS PSO
62 pair: Variant ; SPSO-2011-SIS
63 pair: Variant ; SPSO-2011-PSIS
65 - "CanonicalPSO" (Canonical Particule Swarm Optimisation, voir
66 [ZambranoBigiarini13]_), algorithme classique dit "canonique" d'essaim
67 particulaire, robuste et définissant une référence des algorithmes d'essaims
69 - "OGCR" (Simple Particule Swarm Optimisation), algorithme simplifié d'essaim
70 particulaire sans bornes sur les insectes ou les vitesses, déconseillé car
71 peu robuste, mais parfois beaucoup plus rapide,
72 - "SPSO-2011" ou "SPSO-2011-AIS" (Standard Particle Swarm Optimisation 2011,
73 voir [ZambranoBigiarini13]_), algorithme de référence 2011 d'essaim
74 particulaire, robuste, performant et défini comme une référence des
75 algorithmes d'essaims particulaires. Cet algorithme est parfois appelé
76 ":math:`\omega`-PSO" ou "Inertia PSO" car il intègre une contribution dite
77 d'inertie, ou encore appelé "AIS" (pour "Asynchronous Iteration Strategy") ou
78 "APSO" (pour "Advanced Particle Swarm Optimisation") car il intègre la mise à
79 jour évolutive des meilleurs éléments, conduisant à une convergence
80 intrinsèquement améliorée de l'algorithme,
81 - "SPSO-2011-SIS" (Standard Particle Swarm Optimisation 2011 with Synchronous
82 Iteration Strategy), très similaire à l'algorithme de référence 2011 et avec
83 une mise à jour synchrone, appelée "SIS", des particules,
84 - "SPSO-2011-PSIS" (Standard Particle Swarm Optimisation 2011 with Parallel
85 Synchronous Iteration Strategy), similaire à l'algorithme "SPSO-2011-SIS"
86 avec mise à jour synchrone et parallélisation, appelée "PSIS", des
89 Voici quelques suggestions pratiques pour une utilisation efficace de ces
92 - La variante recommandée de cet algorithme est le "SPSO-2011" même si
93 l'algorithme "CanonicalPSO" reste par défaut le plus robuste. Dans le cas où
94 l'évaluation de l'état peut être réalisé en parallèle, on peut utiliser
95 l'algorithme "SPSO-2011-PSIS" même si sa convergence est parfois un peu moins
97 - Le nombre de particules ou d'insectes usuellement recommandé varie entre 40
98 et 100 selon l'algorithme, à peu près indépendamment de la dimension de
99 l'espace des états. En général, les meilleurs performances sont obtenues pour
100 des populations de 70 à 500 particules. Même si la valeur par défaut de ce
101 paramètre de base provient d'une expérience étendue sur ces algorithmes, il
102 est recommandé de l'adapter à la difficulté des problèmes traités.
103 - Le nombre recommandé de générations, lors de l'évolution de la population,
104 est souvent de l'ordre de 50, mais il peut facilement varier entre 25 et 500.
105 - Le nombre maximal d'évaluation de la fonction de simulation doit usuellement
106 être limité entre quelques milliers et quelques dizaines de milliers de fois
107 la dimension de l'espace des états.
108 - La fonctionnelle d'erreur décroît usuellement par pallier (donc avec une
109 progression nulle de la valeur de fonctionnelle à chaque génération lorsque
110 l'on reste dans le palier), rendant *non recommandé* un arrêt sur critère de
111 décroissance de la fonction-coût. Il est normalement plus judicieux d'adapter
112 le nombre d'itérations ou de générations pour accélérer la convergence des
114 - Si le problème est contraint, il faut définir les bornes des variables (par
115 la variable "*Bounds*"). Si le problème est totalement non contraint, il est
116 indispensable de définir des bornes d'incrément (par la variable
117 "*BoxBounds*") pour circonscrire la recherche optimale de manière utile. De
118 manière similaire, si le problème est partiellement contraint, il est
119 recommandé (mais pas indispensable) de définir des bornes d'incrément. Dans
120 le cas où ces bornes d'incréments ne sont pas définies, ce sont les bornes
121 des variables qui seront utilisées comme bornes d'incréments.
123 Ces conseils sont à utiliser comme des indications expérimentales, et pas comme
124 des prescriptions, car ils sont à apprécier ou à adapter selon la physique de
125 chaque problème que l'on traite.
127 Le décompte du nombre d'évaluations de la fonction à simuler lors de cet
128 algorithme est déterministe, à savoir le "*nombre d'itérations ou de
129 générations*" multiplié par le "*nombre d'individus de la population*". Avec
130 les valeurs par défaut, il faut entre `40x50=2000` et `100*50=5000` évaluations
131 par défaut. C'est pour cette raison que cet algorithme est usuellement
132 intéressant lorsque la dimension de l'espace des états est grande, ou que les
133 non-linéarités de la simulation rendent compliqué, ou invalide, l'évaluation du
134 gradient de la fonctionnelle par approximation numérique. Mais il est aussi
135 nécessaire que le calcul de la fonction à simuler ne soit pas trop coûteux
136 pour éviter une durée d'optimisation rédhibitoire.
138 .. ------------------------------------ ..
139 .. include:: snippets/Header2Algo12.rst
141 .. include:: snippets/FeaturePropNonLocalOptimization.rst
143 .. include:: snippets/FeaturePropDerivativeFree.rst
145 .. include:: snippets/FeaturePropParallelAlgorithm.rst
147 .. ------------------------------------ ..
148 .. include:: snippets/Header2Algo02.rst
150 .. include:: snippets/Background.rst
152 .. include:: snippets/BackgroundError.rst
154 .. include:: snippets/Observation.rst
156 .. include:: snippets/ObservationError.rst
158 .. include:: snippets/ObservationOperator.rst
160 .. ------------------------------------ ..
161 .. include:: snippets/Header2Algo03AdOp.rst
163 .. include:: snippets/BoundsWithNone.rst
165 .. include:: snippets/BoxBounds.rst
167 .. include:: snippets/CognitiveAcceleration.rst
169 .. include:: snippets/InertiaWeight.rst
171 .. include:: snippets/InitializationPoint.rst
173 .. include:: snippets/MaximumNumberOfFunctionEvaluations.rst
175 .. include:: snippets/MaximumNumberOfIterations_50.rst
177 .. include:: snippets/NumberOfInsects.rst
179 .. include:: snippets/QualityCriterion.rst
181 .. include:: snippets/SetSeed.rst
183 .. include:: snippets/SocialAcceleration.rst
185 StoreSupplementaryCalculations
186 .. index:: single: StoreSupplementaryCalculations
188 *Liste de noms*. Cette liste indique les noms des variables supplémentaires,
189 qui peuvent être disponibles au cours du déroulement ou à la fin de
190 l'algorithme, si elles sont initialement demandées par l'utilisateur. Leur
191 disponibilité implique, potentiellement, des calculs ou du stockage coûteux.
192 La valeur par défaut est donc une liste vide, aucune de ces variables n'étant
193 calculée et stockée par défaut (sauf les variables inconditionnelles). Les
194 noms possibles pour les variables supplémentaires sont dans la liste suivante
195 (la description détaillée de chaque variable nommée est donnée dans la suite
196 de cette documentation par algorithme spécifique, dans la sous-partie
197 "*Informations et variables disponibles à la fin de l'algorithme*") : [
203 "CurrentIterationNumber",
206 "InternalCostFunctionJ",
207 "InternalCostFunctionJb",
208 "InternalCostFunctionJo",
212 "SimulatedObservationAtBackground",
213 "SimulatedObservationAtCurrentState",
214 "SimulatedObservationAtOptimum",
218 ``{"StoreSupplementaryCalculations":["CurrentState", "Residu"]}``
220 .. include:: snippets/SwarmTopology.rst
222 .. include:: snippets/Variant_PSO.rst
224 .. include:: snippets/VelocityClampingFactor.rst
226 .. ------------------------------------ ..
227 .. include:: snippets/Header2Algo04.rst
229 .. include:: snippets/Analysis.rst
231 .. include:: snippets/CostFunctionJ.rst
233 .. include:: snippets/CostFunctionJb.rst
235 .. include:: snippets/CostFunctionJo.rst
237 .. ------------------------------------ ..
238 .. include:: snippets/Header2Algo05.rst
240 .. include:: snippets/Analysis.rst
242 .. include:: snippets/BMA.rst
244 .. include:: snippets/CostFunctionJ.rst
246 .. include:: snippets/CostFunctionJb.rst
248 .. include:: snippets/CostFunctionJo.rst
250 .. include:: snippets/CurrentIterationNumber.rst
252 .. include:: snippets/CurrentState.rst
254 .. include:: snippets/Innovation.rst
256 .. include:: snippets/InternalCostFunctionJ.rst
258 .. include:: snippets/InternalCostFunctionJb.rst
260 .. include:: snippets/InternalCostFunctionJo.rst
262 .. include:: snippets/InternalStates.rst
264 .. include:: snippets/OMA.rst
266 .. include:: snippets/OMB.rst
268 .. include:: snippets/SimulatedObservationAtBackground.rst
270 .. include:: snippets/SimulatedObservationAtCurrentState.rst
272 .. include:: snippets/SimulatedObservationAtOptimum.rst
274 .. ------------------------------------ ..
275 .. _section_ref_algorithm_ParticleSwarmOptimization_examples:
277 .. include:: snippets/Header2Algo09.rst
279 .. include:: scripts/simple_ParticleSwarmOptimization1.rst
281 .. literalinclude:: scripts/simple_ParticleSwarmOptimization1.py
283 .. include:: snippets/Header2Algo10.rst
285 .. literalinclude:: scripts/simple_ParticleSwarmOptimization1.res
288 .. include:: snippets/Header2Algo11.rst
290 .. _simple_ParticleSwarmOptimization1:
291 .. image:: scripts/simple_ParticleSwarmOptimization1.png
295 .. ------------------------------------ ..
296 .. include:: snippets/Header2Algo06.rst
298 - :ref:`section_ref_algorithm_DerivativeFreeOptimization`
299 - :ref:`section_ref_algorithm_DifferentialEvolution`
300 - :ref:`section_ref_algorithm_TabuSearch`
302 .. ------------------------------------ ..
303 .. include:: snippets/Header2Algo07.rst
306 - [ZambranoBigiarini13]_