1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2008-2024 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
24 from daCore import BasicObjects
25 from daAlgorithms.Atoms import ecwnpso, ecwopso, ecwapso, ecwspso, ecwpspso
27 # ==============================================================================
28 class ElementaryAlgorithm(BasicObjects.Algorithm):
30 BasicObjects.Algorithm.__init__(self, "PARTICLESWARMOPTIMIZATION")
31 self.defineRequiredParameter(
33 default = "CanonicalPSO",
35 message = "Variant ou formulation de la méthode",
48 self.defineRequiredParameter(
49 name = "MaximumNumberOfIterations",
52 message = "Nombre maximal de pas d'optimisation",
54 oldname = "MaximumNumberOfSteps",
56 self.defineRequiredParameter(
57 name = "MaximumNumberOfFunctionEvaluations",
60 message = "Nombre maximal d'évaluations de la fonction",
63 self.defineRequiredParameter(
65 typecast = numpy.random.seed,
66 message = "Graine fixée pour le générateur aléatoire",
68 self.defineRequiredParameter(
69 name = "NumberOfInsects",
72 message = "Nombre d'insectes dans l'essaim",
75 self.defineRequiredParameter(
76 name = "SwarmTopology",
77 default = "FullyConnectedNeighborhood",
79 message = "Mode de définition du voisinage de chaque particule",
81 "FullyConnectedNeighborhood", "FullyConnectedNeighbourhood", "gbest",
82 "RingNeighborhoodWithRadius1", "RingNeighbourhoodWithRadius1", "lbest",
83 "RingNeighborhoodWithRadius2", "RingNeighbourhoodWithRadius2",
84 "AdaptativeRandomWith3Neighbors", "AdaptativeRandomWith3Neighbours", "abest",
85 "AdaptativeRandomWith5Neighbors", "AdaptativeRandomWith5Neighbours",
88 "VonNeumannNeighborhood", "VonNeumannNeighbourhood",
91 self.defineRequiredParameter(
92 name = "InertiaWeight",
93 default = 0.72135, # 1/(2*ln(2))
95 message = "Part de la vitesse de l'essaim qui est imposée à l'insecte, ou poids de l'inertie (entre 0 et 1)", # noqa: E501
98 oldname = "SwarmVelocity",
100 self.defineRequiredParameter(
101 name = "CognitiveAcceleration",
102 default = 1.19315, # 1/2+ln(2)
104 message = "Taux de rappel à la meilleure position de l'insecte précédemment connue (positif)",
107 self.defineRequiredParameter(
108 name = "SocialAcceleration",
109 default = 1.19315, # 1/2+ln(2)
111 message = "Taux de rappel au meilleur insecte du groupe local (positif)",
113 oldname = "GroupRecallRate",
115 self.defineRequiredParameter(
116 name = "VelocityClampingFactor",
119 message = "Facteur de réduction de l'amplitude de variation des vitesses (entre 0 et 1)",
123 self.defineRequiredParameter(
124 name = "QualityCriterion",
125 default = "AugmentedWeightedLeastSquares",
127 message = "Critère de qualité utilisé",
129 "AugmentedWeightedLeastSquares", "AWLS", "DA",
130 "WeightedLeastSquares", "WLS",
131 "LeastSquares", "LS", "L2",
132 "AbsoluteValue", "L1",
133 "MaximumError", "ME", "Linf",
136 self.defineRequiredParameter(
137 name = "StoreInternalVariables",
140 message = "Stockage des variables internes ou intermédiaires du calcul",
142 self.defineRequiredParameter(
143 name = "StoreSupplementaryCalculations",
146 message = "Liste de calculs supplémentaires à stocker et/ou effectuer",
153 "CurrentIterationNumber",
156 "InternalCostFunctionJ",
157 "InternalCostFunctionJb",
158 "InternalCostFunctionJo",
162 "SimulatedObservationAtBackground",
163 "SimulatedObservationAtCurrentState",
164 "SimulatedObservationAtOptimum",
167 self.defineRequiredParameter( # Pas de type
169 message = "Liste des paires de bornes",
171 self.defineRequiredParameter( # Pas de type
173 message = "Liste des paires de bornes d'incréments",
175 self.defineRequiredParameter(
176 name = "InitializationPoint",
177 typecast = numpy.ravel,
178 message = "État initial imposé (par défaut, c'est l'ébauche si None)",
180 self.requireInputArguments(
181 mandatory= ("Xb", "Y", "HO", "R", "B"),
191 "NonLocalOptimization",
197 def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
198 self._pre_run(Parameters, Xb, Y, U, HO, EM, CM, R, B, Q)
200 # --------------------------
201 if self._parameters["Variant"] in ["CanonicalPSO", "PSO"]:
202 ecwnpso.ecwnpso(self, Xb, Y, HO, R, B)
204 elif self._parameters["Variant"] in ["OGCR"]:
205 ecwopso.ecwopso(self, Xb, Y, HO, R, B)
207 # Default SPSO-2011 = SPSO-2011-AIS
208 elif self._parameters["Variant"] in ["SPSO-2011", "SPSO-2011-AIS"]:
209 ecwapso.ecwapso(self, Xb, Y, HO, R, B)
211 elif self._parameters["Variant"] in ["SPSO-2011-SIS"]:
212 ecwspso.ecwspso(self, Xb, Y, HO, R, B)
214 elif self._parameters["Variant"] in ["SPSO-2011-PSIS"]:
215 ecwpspso.ecwpspso(self, Xb, Y, HO, R, B)
217 # --------------------------
219 raise ValueError("Error in Variant name: %s"%self._parameters["Variant"])
221 self._post_run(HO, EM)
224 # ==============================================================================
225 if __name__ == "__main__":
226 print("\n AUTODIAGNOSTIC\n")