From d2deb6fa3507c77fa0523ebbf0cafd8c1f1b545b Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Wed, 11 Jan 2017 20:58:06 +0100 Subject: [PATCH] Documentation and algorithms evaluation minor improvements --- bin/module_version.py | 4 ++-- .../ref_algorithm_DerivativeFreeOptimization.rst | 8 ++++---- .../ref_algorithm_ParticleSwarmOptimization.rst | 10 ++++++++++ .../ref_algorithm_DerivativeFreeOptimization.rst | 9 +++++---- .../ref_algorithm_ParticleSwarmOptimization.rst | 11 +++++++++++ .../daAlgorithms/DerivativeFreeOptimization.py | 6 +++++- .../daAlgorithms/ParticleSwarmOptimization.py | 16 +++++++++++++++- 7 files changed, 52 insertions(+), 12 deletions(-) diff --git a/bin/module_version.py b/bin/module_version.py index 9a49616..f5cc3ff 100644 --- a/bin/module_version.py +++ b/bin/module_version.py @@ -23,6 +23,6 @@ # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D name = "ADAO" -version = "V8_2_0" # Version pour catalogue, avec des "_" entre les numeros +version = "V8_3_0" # Version pour catalogue, avec des "_" entre les numeros date = "" -year = "2016" # Annee de copyright +year = "2017" # Annee de copyright diff --git a/doc/en/ref_algorithm_DerivativeFreeOptimization.rst b/doc/en/ref_algorithm_DerivativeFreeOptimization.rst index c0b5ad1..3cf1021 100644 --- a/doc/en/ref_algorithm_DerivativeFreeOptimization.rst +++ b/doc/en/ref_algorithm_DerivativeFreeOptimization.rst @@ -133,10 +133,10 @@ The options of the algorithm are the following: MaximumNumberOfFunctionEvaluations This key indicates the maximum number of evaluation of the cost function to - be optimized. The default is 15000, which is very similar to no limit on - iterations. The calculation can be over this limit when an outer - optimization loop has to be finished. It is strongly recommended to adapt - this parameter to the needs on real problems. + be optimized. The default is 15000, which is an arbitrary limit. It is then + recommended to adapt this parameter to the needs on real problems. For some + optimizers, the effective number of function evaluations can be slightly + different of the limit due to algorithm internal control requirements. Example : ``{"MaximumNumberOfFunctionEvaluations":50}`` diff --git a/doc/en/ref_algorithm_ParticleSwarmOptimization.rst b/doc/en/ref_algorithm_ParticleSwarmOptimization.rst index 8c05404..2214157 100644 --- a/doc/en/ref_algorithm_ParticleSwarmOptimization.rst +++ b/doc/en/ref_algorithm_ParticleSwarmOptimization.rst @@ -50,6 +50,7 @@ Optional and required commands .. index:: single: ObservationError .. index:: single: ObservationOperator .. index:: single: MaximumNumberOfSteps +.. index:: single: MaximumNumberOfFunctionEvaluations .. index:: single: NumberOfInsects .. index:: single: SwarmVelocity .. index:: single: GroupRecallRate @@ -110,6 +111,15 @@ The options of the algorithm are the following: Example : ``{"MaximumNumberOfSteps":100}`` + MaximumNumberOfFunctionEvaluations + This key indicates the maximum number of evaluation of the cost function to + be optimized. The default is 15000, which is an arbitrary limit. It is then + recommended to adapt this parameter to the needs on real problems. For some + optimizers, the effective number of function evaluations can be slightly + different of the limit due to algorithm internal control requirements. + + Example : ``{"MaximumNumberOfFunctionEvaluations":50}`` + NumberOfInsects This key indicates the number of insects or particles in the swarm. The default is 100, which is a usual default for this algorithm. diff --git a/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst b/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst index a8068d6..96d186d 100644 --- a/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst +++ b/doc/fr/ref_algorithm_DerivativeFreeOptimization.rst @@ -137,10 +137,11 @@ Les options de l'algorithme sont les suivantes: MaximumNumberOfFunctionEvaluations Cette clé indique le nombre maximum d'évaluations possibles de la - fonctionnelle à optimiser. Le défaut est 15000, qui est une limite - arbitraire. Le calcul peut dépasser ce nombre lorsqu'il doit finir une - boucle externe d'optimisation. Il est fortement recommandé d'adapter ce - paramètre aux besoins pour des problèmes réels. + fonctionnelle à optimiser. Le défaut est de 15000, qui est une limite + arbitraire. Il est ainsi recommandé d'adapter ce paramètre aux besoins pour + des problèmes réels. Pour certains optimiseurs, le nombre effectif + d'évaluations à l'arrêt peut être légèrement différent de la limite à cause + d'exigences de déroulement interne de l'algorithme. Exemple : ``{"MaximumNumberOfFunctionEvaluations":50}`` diff --git a/doc/fr/ref_algorithm_ParticleSwarmOptimization.rst b/doc/fr/ref_algorithm_ParticleSwarmOptimization.rst index 572663c..4b279d1 100644 --- a/doc/fr/ref_algorithm_ParticleSwarmOptimization.rst +++ b/doc/fr/ref_algorithm_ParticleSwarmOptimization.rst @@ -52,6 +52,7 @@ Commandes requises et optionnelles .. index:: single: ObservationError .. index:: single: ObservationOperator .. index:: single: MaximumNumberOfSteps +.. index:: single: MaximumNumberOfFunctionEvaluations .. index:: single: NumberOfInsects .. index:: single: SwarmVelocity .. index:: single: GroupRecallRate @@ -113,6 +114,16 @@ Les options de l'algorithme sont les suivantes: Exemple : ``{"MaximumNumberOfSteps":100}`` + MaximumNumberOfFunctionEvaluations + Cette clé indique le nombre maximum d'évaluations possibles de la + fonctionnelle à optimiser. Le défaut est de 15000, qui est une limite + arbitraire. Il est ainsi recommandé d'adapter ce paramètre aux besoins pour + des problèmes réels. Pour certains optimiseurs, le nombre effectif + d'évaluations à l'arrêt peut être légèrement différent de la limite à cause + d'exigences de déroulement interne de l'algorithme. + + Exemple : ``{"MaximumNumberOfFunctionEvaluations":50}`` + NumberOfInsects Cette clé indique le nombre d'insectes ou de particules dans l'essaim. La valeur par défaut est 100, qui est une valeur par défaut usuelle pour cet diff --git a/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py b/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py index c9415c7..ccf94a9 100644 --- a/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py +++ b/src/daComposant/daAlgorithms/DerivativeFreeOptimization.py @@ -46,7 +46,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): name = "MaximumNumberOfFunctionEvaluations", default = 15000, typecast = int, - message = "Nombre maximal de d'évaluations de la fonction", + message = "Nombre maximal d'évaluations de la fonction", minval = -1, ) self.defineRequiredParameter( @@ -101,6 +101,8 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): # ---------------------- self.setParameters(Parameters) # + if not PlatformInfo.has_nlopt and not self._parameters["Minimizer"] in ["COBYLA", "POWELL", "SIMPLEX"]: + self._parameters["Minimizer"] = "SIMPLEX" if self._parameters.has_key("Bounds") and (type(self._parameters["Bounds"]) is type([]) or type(self._parameters["Bounds"]) is type(())) and (len(self._parameters["Bounds"]) > 0): Bounds = self._parameters["Bounds"] logging.debug("%s Prise en compte des bornes effectuee"%(self._name,)) @@ -175,6 +177,8 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): # Point de démarrage de l'optimisation : Xini = Xb # ------------------------------------ Xini = numpy.ravel(Xb) + if len(Xini) < 2 and self._parameters["Minimizer"] == "NEWUOA": + raise ValueError("The minimizer %s can not be used when the optimisation state dimension is 1. Please choose another minimizer."%self._parameters["Minimizer"]) # # Minimisation de la fonctionnelle # -------------------------------- diff --git a/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py b/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py index 50f1157..52e8e63 100644 --- a/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py +++ b/src/daComposant/daAlgorithms/ParticleSwarmOptimization.py @@ -33,7 +33,14 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): default = 50, typecast = int, message = "Nombre maximal de pas d'optimisation", - minval = 1, + minval = 0, + ) + self.defineRequiredParameter( + name = "MaximumNumberOfFunctionEvaluations", + default = 15000, + typecast = int, + message = "Nombre maximal d'évaluations de la fonction", + minval = -1, ) self.defineRequiredParameter( name = "SetSeed", @@ -168,6 +175,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): # # Initialisation de l'essaim # -------------------------- + NumberOfFunctionEvaluations = 0 LimitVelocity = numpy.abs(SpaceUp-SpaceLow) # PosInsect = [] @@ -182,10 +190,12 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): qBestPosInsect = [] Best = copy.copy(SpaceLow) qBest = CostFunction(Best,self._parameters["QualityCriterion"]) + NumberOfFunctionEvaluations += 1 # for i in range(self._parameters["NumberOfInsects"]): insect = numpy.ravel(PosInsect[:,i]) quality = CostFunction(insect,self._parameters["QualityCriterion"]) + NumberOfFunctionEvaluations += 1 qBestPosInsect.append(quality) if quality < qBest: Best = copy.copy( insect ) @@ -209,6 +219,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): VelocityInsect[j,i] = self._parameters["SwarmVelocity"]*VelocityInsect[j,i] + Phip*rp[j]*(BestPosInsect[j,i]-PosInsect[j,i]) + Phig*rg[j]*(Best[j]-PosInsect[j,i]) PosInsect[j,i] = PosInsect[j,i]+VelocityInsect[j,i] quality = CostFunction(insect,self._parameters["QualityCriterion"]) + NumberOfFunctionEvaluations += 1 if quality < qBestPosInsect[i]: BestPosInsect[:,i] = copy.copy( insect ) qBestPosInsect[i] = copy.copy( quality ) @@ -226,6 +237,9 @@ class ElementaryAlgorithm(BasicObjects.Algorithm): self.StoredVariables["CostFunctionJb"].store( 0. ) self.StoredVariables["CostFunctionJo"].store( 0. ) self.StoredVariables["CostFunctionJ" ].store( qBest ) + if NumberOfFunctionEvaluations > self._parameters["MaximumNumberOfFunctionEvaluations"]: + logging.debug("%s Stopping search because the number %i of function evaluations is exceeding the maximum %i."%(self._name, NumberOfFunctionEvaluations, self._parameters["MaximumNumberOfFunctionEvaluations"])) + break # # Obtention de l'analyse # ---------------------- -- 2.39.2