freESAsymmetricMutation.txx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   F.R.E.E. - flexible registration evaluation engine
00004   Version:   v.1.0.0
00005   Date:      $Date: 2006/09/01 12:00:00 $
00006   Module:    $RCSfile: freESAsymmetricMutation.h,v $
00007   Language:  C++
00008 
00009 
00010 
00011   Copyright (c) 2007 Ralf o Floca (Department of Medical Informatics,
00012   Institute for Medical Biometry and Informatics, University of Heidelberg,
00013   Germany). All rights reserved.
00014   See FREECopyright.txt or http://www.mi.med.uni-hd.de/free/copyright.htm
00015   for details.
00016 
00017      This software is distributed WITHOUT ANY WARRANTY; without even 
00018      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00019      PURPOSE.  See the above copyright notices for more information.
00020 
00021 =========================================================================*/
00022 #ifndef _freESAsymmetricMutation_txx
00023 #define _freESAsymmetricMutation_txx
00024 
00025 #include "freESAsymmetricMutation.h"
00026 
00027 #include "vnl/vnl_sample.h"
00028 
00029 namespace FREE
00030 {
00031 namespace ES
00032 {
00033 
00034 template <class TIndividual>
00035 AsymmetricMutation<TIndividual>
00036 ::AsymmetricMutation()
00037 {
00038   m_Gamma = 2.0;
00039 
00040   m_TauGlobal = 1/sqrt(2.0);
00041   m_Tau = 1/sqrt(2.0);
00042   m_TauGlobal_Skewness = 1/sqrt(2.0);
00043   m_Tau_Skewness = 1/sqrt(2.0);
00044 
00045   m_MutateValueVariance = 1.0;
00046   m_MutateValueSkewness = 0.0;
00047 
00048   m_RandomGenerator = VariateGeneratorType::New();
00049 }
00050 
00051 template <class TIndividual>
00052 void
00053 AsymmetricMutation<TIndividual>
00054 ::RegisterStrategicIndividualParameters(IndividualType& individual) const
00055 {
00056   for (unsigned long index = 0; index<individual.ObjectiveParameters().size(); index++)
00057   {
00058     typename IndividualType::StrategicParameterPointer parameter = IndividualType::StrategicParameterType::New();
00059     parameter->SetValue(1.0);
00060     parameter->SetHandling(IndividualType::StrategicParameterType::HDynamic);
00061     parameter->SetOrigin(this->GetNameOfClass());
00062     individual.StrategicParameters().push_back(parameter);
00063 
00064     parameter = IndividualType::StrategicParameterType::New();
00065     parameter->SetValue(0.0);
00066     parameter->SetHandling(IndividualType::StrategicParameterType::HDynamic);
00067     parameter->SetOrigin(this->GetNameOfClass());
00068     individual.StrategicParameters().push_back(parameter);
00069   }
00070 };
00071 
00072 template <class TIndividual>
00073 void
00074 AsymmetricMutation<TIndividual>
00075 ::RegisterStrategicPopulationParameters(PopulationType& population) const
00076 {
00077   //ID of the generation tauGlobal and tauGlobal_skewness are belonging too
00078   typename IndividualType::StrategicParameterPointer parameter = IndividualType::StrategicParameterType::New();
00079   parameter->SetValue(-1.0);
00080   parameter->SetHandling(IndividualType::StrategicParameterType::HStatic);
00081   parameter->SetOrigin(this->GetNameOfClass());
00082   population.StrategicParameters().push_back(parameter);
00083 
00084   //Last calculated population variate for variance mutation
00085   parameter = IndividualType::StrategicParameterType::New();
00086   parameter->SetValue(0.0);
00087   parameter->SetHandling(IndividualType::StrategicParameterType::HStatic);
00088   parameter->SetOrigin(this->GetNameOfClass());
00089   population.StrategicParameters().push_back(parameter);
00090 
00091   //Last calculated population variate for skewness mutation
00092   parameter = IndividualType::StrategicParameterType::New();
00093   parameter->SetValue(0.0);
00094   parameter->SetHandling(IndividualType::StrategicParameterType::HStatic);
00095   parameter->SetOrigin(this->GetNameOfClass());
00096   population.StrategicParameters().push_back(parameter);
00097 };
00098 
00099 template <class TIndividual>
00100 void
00101 AsymmetricMutation<TIndividual>
00102 ::MutateStrategicIndividualParameters(IndividualType& individual, PopulationType& population) const
00103 {
00104   typename PopulationType::StrategicParametersType::SelectedParametersType popParameters =
00105     population.StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00106 
00107   if (popParameters.size()<2) itkExceptionMacro(<<"Error. Invalid count of strategic population parameters belongig to "<<this->GetNameOfClass()<<". Ensure that parameters have been registered correctly.");
00108 
00109   //get population mutation parameters
00110   double z = popParameters[0]->GetValue(); 
00111   double z_skew = popParameters[1]->GetValue();
00112 
00113   //get all strategic individual parameters of the mutation
00114   typename IndividualType::StrategicParametersType::SelectedParametersType parameters =
00115     individual.StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00116 
00117   for (unsigned long index = 0; index<parameters.size(); index = index+2)
00118   {
00119     //calculate individual mutation parameters
00120     double z_i = exp(vnl_sample_normal(0,m_Tau));
00121     double z_i_skew = vnl_sample_normal(0,m_Tau_Skewness);
00122 
00123     typename IndividualType::StrategicParameterValueType variance = (parameters[index])->GetValue();
00124     //mutate variance
00125     variance = variance * z * z_i;
00126     //set new value;
00127     (parameters[index])->SetValue(variance);
00128 
00129     typename IndividualType::StrategicParameterValueType skewness = (parameters[index+1])->GetValue();
00130     //mutate skewness
00131     skewness = skewness + z_skew + z_i_skew;
00132     //set new value;
00133     (parameters[index+1])->SetValue(skewness);
00134   }
00135 };
00136 
00137 template <class TIndividual>
00138 void
00139 AsymmetricMutation<TIndividual>
00140 ::MutateStrategicPopulationParameters(PopulationType& population) const
00141 {
00142   typename PopulationType::StrategicParametersType::SelectedParametersType popParameters =
00143     population.StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00144 
00145   if (popParameters.size()<2) itkExceptionMacro(<<"Error. Invalid count of strategic population parameters belongig to "<<this->GetNameOfClass()<<". Ensure that parameters have been registered correctly.");
00146 
00147   //the variates are outdated, so get some new
00148   double z = exp(vnl_sample_normal(0,m_TauGlobal));
00149   double z_skew = vnl_sample_normal(0,m_TauGlobal_Skewness);
00150 
00151   popParameters[0]->SetValue(z);
00152   popParameters[1]->SetValue(z_skew);
00153 };
00154 
00155 template <class TIndividual>
00156 double
00157 AsymmetricMutation<TIndividual>
00158 ::MutateValue(const double& value)
00159 {
00160     double mutatedValue = value;
00161     m_RandomGenerator->SetGamma(m_Gamma);
00162     m_RandomGenerator->SetVariance(m_MutateValueVariance);
00163     m_RandomGenerator->SetSkewness(m_MutateValueSkewness);
00164 
00165     mutatedValue += m_RandomGenerator->GetVariate()/this->m_MutateValueScale;
00166     return mutatedValue;
00167 };
00168 
00169 template <class TIndividual>
00170 void
00171 AsymmetricMutation<TIndividual>
00172 ::MutateObjectivParameters(IndividualType* pIndividual, PopulationType* pPopulation) const
00173 {
00174   if (!pIndividual) itkExceptionMacro(<<"Error. Passed individual is Null.");
00175   if (!pPopulation) itkExceptionMacro(<<"Error. Passed population is Null.");
00176 
00177   //get the strategic parameters
00178   typename IndividualType::StrategicParametersType::SelectedParametersType parameters =
00179     pIndividual->StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00180 
00181   if (parameters.size()!=(pIndividual->ObjectiveParameters().size())*2) throwExceptionMacro("Error. Invalid number of strategic parameters (two strategic parameters needed per objective parameter). Ensure that strategic parameters are properly registered. Objective count:" << pIndividual->ObjectiveParameters().size() <<"; strategic count: "<< parameters.size());
00182   if (pIndividual->ObjectiveParameters().size()!=this->m_GeneralObjectiveScales.size()) throwExceptionMacro("Error. Number of objective parameters and global scales are not equal. Ensure that scales have been set properly. Objective count:" << pIndividual->ObjectiveParameters().size() <<"; objective scales count: "<< this->m_GeneralObjectiveScales.size());
00183 
00184   for (unsigned long index = 0; index<pIndividual->ObjectiveParameters().size(); index++)
00185   {
00186     typename IndividualType::StrategicParameterValueType variance = (parameters[index*2])->GetValue();
00187     typename IndividualType::StrategicParameterValueType skewness = (parameters[(index*2)+1])->GetValue();
00188     typename IndividualType::ObjectiveParameterType mutatedParameter = (pIndividual->ObjectiveParameters())[index];
00189 
00190     //mutate parameter
00191     m_RandomGenerator->SetGamma(m_Gamma);
00192     m_RandomGenerator->SetVariance(m_MutateValueVariance);
00193     m_RandomGenerator->SetSkewness(m_MutateValueSkewness);
00194 
00195     mutatedParameter += m_RandomGenerator->GetVariate()/this->m_GeneralObjectiveScales[index];
00196     
00197     //set new value;
00198     (pIndividual->ObjectiveParameters())[index] = mutatedParameter;
00199   }
00200 };
00201 
00202 
00203 } // end of namespace ES
00204 } // end of namespace FREE
00205 
00206 #endif

Generated at Sat Oct 13 15:53:26 2007 for f.r.e.e. - Flexible Registration and Evaluation Engine by doxygen 1.5.3 written by Dimitri van Heesch, © 1997-2000