1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2008-2023 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
23 import numpy, logging, copy
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)",
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"),
183 self.setAttributes(tags=(
190 def run(self, Xb=None, Y=None, U=None, HO=None, EM=None, CM=None, R=None, B=None, Q=None, Parameters=None):
191 self._pre_run(Parameters, Xb, Y, U, HO, EM, CM, R, B, Q)
193 #--------------------------
194 if self._parameters["Variant"] in ["CanonicalPSO", "PSO"]:
195 ecwnpso.ecwnpso(self, Xb, Y, HO, R, B)
197 elif self._parameters["Variant"] in ["OGCR"]:
198 ecwopso.ecwopso(self, Xb, Y, HO, R, B)
200 # Default SPSO-2011 = SPSO-2011-AIS
201 elif self._parameters["Variant"] in ["SPSO-2011", "SPSO-2011-AIS"]:
202 ecwapso.ecwapso(self, Xb, Y, HO, R, B)
204 elif self._parameters["Variant"] in ["SPSO-2011-SIS"]:
205 ecwspso.ecwspso(self, Xb, Y, HO, R, B)
207 elif self._parameters["Variant"] in ["SPSO-2011-PSIS"]:
208 ecwpspso.ecwpspso(self, Xb, Y, HO, R, B)
210 #--------------------------
212 raise ValueError("Error in Variant name: %s"%self._parameters["Variant"])
217 # ==============================================================================
218 if __name__ == "__main__":
219 print("\n AUTODIAGNOSTIC\n")