00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __itkCMAEvolutionStrategyOptimizer_h
00017 #define __itkCMAEvolutionStrategyOptimizer_h
00018
00019 #include "itkScaledSingleValuedNonLinearOptimizer.h"
00020 #include <vector>
00021 #include <utility>
00022 #include <deque>
00023
00024 #include "itkArray.h"
00025 #include "itkArray2D.h"
00026 #include "itkMersenneTwisterRandomVariateGenerator.h"
00027 #include "vnl/vnl_diag_matrix.h"
00028
00029
00030 namespace itk
00031 {
00047 class CMAEvolutionStrategyOptimizer :
00048 public ScaledSingleValuedNonLinearOptimizer
00049 {
00050 public:
00051
00052 typedef CMAEvolutionStrategyOptimizer Self;
00053 typedef ScaledSingleValuedNonLinearOptimizer Superclass;
00054 typedef SmartPointer<Self> Pointer;
00055 typedef SmartPointer<const Self> ConstPointer;
00056
00057 itkNewMacro(Self);
00058 itkTypeMacro(CMAEvolutionStrategyOptimizer,
00059 ScaledSingleValuedNonLinearOptimizer);
00060
00061 typedef Superclass::ParametersType ParametersType;
00062 typedef Superclass::DerivativeType DerivativeType;
00063 typedef Superclass::CostFunctionType CostFunctionType;
00064 typedef Superclass::ScaledCostFunctionType ScaledCostFunctionType;
00065 typedef Superclass::MeasureType MeasureType;
00066 typedef Superclass::ScalesType ScalesType;
00067
00068 typedef enum {
00069 MetricError,
00070 MaximumNumberOfIterations,
00071 PositionToleranceMin,
00072 PositionToleranceMax,
00073 ValueTolerance,
00074 ZeroStepLength,
00075 Unknown } StopConditionType;
00076
00077 virtual void StartOptimization(void);
00078 virtual void ResumeOptimization(void);
00079 virtual void StopOptimization(void);
00080
00082 itkGetConstMacro(CurrentIteration, unsigned long);
00083
00085 itkGetConstMacro(CurrentValue, MeasureType);
00086
00088 itkGetConstReferenceMacro(StopCondition, StopConditionType);
00089
00091 itkGetConstMacro(CurrentSigma, double);
00092
00094 itkGetConstMacro(CurrentMinimumD, double);
00095
00097 itkGetConstMacro(CurrentMaximumD, double);
00098
00101 virtual double GetCurrentStepLength( void ) const
00102 { return this->GetCurrentSigma() * this->GetCurrentMaximumD(); }
00103
00109 itkGetConstReferenceMacro( CurrentScaledStep, ParametersType );
00110
00112 itkGetConstMacro(MaximumNumberOfIterations, unsigned long);
00113 itkSetClampMacro(MaximumNumberOfIterations, unsigned long,
00114 1, NumericTraits<unsigned long>::max());
00115
00120 itkSetMacro( PopulationSize, unsigned int );
00121 itkGetConstMacro( PopulationSize, unsigned int );
00122
00127 itkSetMacro( NumberOfParents, unsigned int );
00128 itkGetConstMacro( NumberOfParents, unsigned int );
00129
00133 itkSetClampMacro( InitialSigma, double, NumericTraits<double>::min(), NumericTraits<double>::max() );
00134 itkGetConstMacro( InitialSigma, double );
00135
00139 itkSetClampMacro( MaximumDeviation, double, 0.0, NumericTraits<double>::max() );
00140 itkGetConstMacro( MaximumDeviation, double );
00141
00145 itkSetClampMacro( MinimumDeviation, double, 0.0, NumericTraits<double>::max() );
00146 itkGetConstMacro( MinimumDeviation, double );
00147
00157 itkSetMacro(UseDecayingSigma, bool);
00158 itkGetConstMacro( UseDecayingSigma, bool );
00159
00162 itkSetClampMacro( SigmaDecayA, double, 0.0, NumericTraits<double>::max() );
00163 itkGetConstMacro( SigmaDecayA, double );
00164
00167 itkSetClampMacro( SigmaDecayAlpha, double, 0.0, 1.0 );
00168 itkGetConstMacro( SigmaDecayAlpha, double );
00169
00175 itkSetMacro( UseCovarianceMatrixAdaptation, bool );
00176 itkGetConstMacro( UseCovarianceMatrixAdaptation, bool );
00177
00184 itkSetStringMacro( RecombinationWeightsPreset );
00185 itkGetStringMacro( RecombinationWeightsPreset );
00186
00190 itkSetMacro(UpdateBDPeriod, unsigned int);
00191 itkGetConstMacro(UpdateBDPeriod, unsigned int);
00192
00198 itkSetMacro( PositionToleranceMin, double );
00199 itkGetConstMacro( PositionToleranceMin, double );
00200
00205 itkSetMacro( PositionToleranceMax, double );
00206 itkGetConstMacro( PositionToleranceMax, double );
00207
00214 itkSetMacro( ValueTolerance, double );
00215 itkGetConstMacro( ValueTolerance, double );
00216
00217 protected:
00218
00219 typedef Array<double> RecombinationWeightsType;
00220 typedef vnl_diag_matrix<double> EigenValueMatrixType;
00221 typedef Array2D<double> CovarianceMatrixType;
00222 typedef std::vector< ParametersType > ParameterContainerType;
00223 typedef std::deque< MeasureType > MeasureHistoryType;
00224
00225 typedef
00226 std::pair< MeasureType, unsigned int > MeasureIndexPairType;
00227 typedef std::vector<MeasureIndexPairType> MeasureContainerType;
00228
00229 typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType;
00230
00232 RandomGeneratorType::Pointer m_RandomGenerator;
00233
00235 MeasureType m_CurrentValue;
00236
00238 unsigned long m_CurrentIteration;
00239
00241 StopConditionType m_StopCondition;
00242
00244 bool m_Stop;
00245
00247 bool m_UseCovarianceMatrixAdaptation;
00248 unsigned int m_PopulationSize;
00249 unsigned int m_NumberOfParents;
00250 unsigned int m_UpdateBDPeriod;
00251
00256 double m_EffectiveMu;
00258 double m_ConjugateEvolutionPathConstant;
00260 double m_SigmaDampingConstant;
00262 double m_CovarianceMatrixAdaptationConstant;
00264 double m_EvolutionPathConstant;
00266 double m_CovarianceMatrixAdaptationWeight;
00268 double m_ExpectationNormNormalDistribution;
00270 RecombinationWeightsType m_RecombinationWeights;
00272 unsigned long m_HistoryLength;
00273
00275 double m_CurrentSigma;
00276
00278 double m_CurrentMinimumD;
00280 double m_CurrentMaximumD;
00281
00283 bool m_Heaviside;
00284
00286 ParameterContainerType m_SearchDirs;
00288 ParameterContainerType m_NormalizedSearchDirs;
00290 MeasureContainerType m_CostFunctionValues;
00292 ParametersType m_CurrentScaledStep;
00294 ParametersType m_CurrentNormalizedStep;
00296 ParametersType m_EvolutionPath;
00298 ParametersType m_ConjugateEvolutionPath;
00299
00301 MeasureHistoryType m_MeasureHistory;
00302
00304 CovarianceMatrixType m_C;
00306 CovarianceMatrixType m_B;
00308 EigenValueMatrixType m_D;
00309
00311 CMAEvolutionStrategyOptimizer();
00312
00314 virtual ~CMAEvolutionStrategyOptimizer(){};
00315
00317 void PrintSelf(std::ostream& os, Indent indent) const;
00318
00333 virtual void InitializeConstants(void);
00334
00347 virtual void InitializeProgressVariables(void);
00348
00350 virtual void InitializeBCD(void);
00351
00354 virtual void GenerateOffspring(void);
00355
00357 virtual void SortCostFunctionValues(void);
00358
00360 virtual void AdvanceOneStep(void);
00361
00363 virtual void UpdateConjugateEvolutionPath(void);
00364
00366 virtual void UpdateHeaviside( void );
00367
00369 virtual void UpdateEvolutionPath(void);
00370
00372 virtual void UpdateC(void);
00373
00375 virtual void UpdateSigma(void);
00376
00378 virtual void UpdateBD(void);
00379
00389 virtual void FixNumericalErrors(void);
00390
00401 virtual bool TestConvergence( bool firstCheck );
00402
00403 private:
00404 CMAEvolutionStrategyOptimizer(const Self&);
00405 void operator=(const Self&);
00406
00408 unsigned long m_MaximumNumberOfIterations;
00409 bool m_UseDecayingSigma;
00410 double m_InitialSigma;
00411 double m_SigmaDecayA;
00412 double m_SigmaDecayAlpha;
00413 std::string m_RecombinationWeightsPreset;
00414 double m_MaximumDeviation;
00415 double m_MinimumDeviation;
00416 double m_PositionToleranceMax;
00417 double m_PositionToleranceMin;
00418 double m_ValueTolerance;
00419
00420 };
00421
00422
00423 }
00424
00425
00426 #endif //#ifndef __itkCMAEvolutionStrategyOptimizer_h
00427