freESAdaptiveNormalMutation.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: freESAdaptiveNormalMutation.txx,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 _freESAdaptiveNormalMutation_txx
00023 #define _freESAdaptiveNormalMutation_txx
00024 
00025 #include "freESAdaptiveNormalMutation.h"
00026 
00027 namespace FREE
00028 {
00029 namespace ES
00030 {
00031 
00032 template <class TIndividual>
00033 AdaptiveNormalMutation<TIndividual>
00034 ::AdaptiveNormalMutation()
00035 {
00036   m_StrategicMutationVariance = 1.0;
00037   m_MutateValueVariance = 1.0;
00038   m_RandomGenerator = VariateGeneratorType::New();
00039 }
00040 
00041 template <class TIndividual>
00042 void
00043 AdaptiveNormalMutation<TIndividual>
00044 ::RegisterStrategicIndividualParameters(IndividualType& individual) const
00045 {
00046   for (unsigned long index = 0; index<individual.ObjectiveParameters().size(); index++)
00047   {
00048     typename IndividualType::StrategicParameterPointer parameter = IndividualType::StrategicParameterType::New();
00049 
00050     parameter->SetValue(1.0);
00051     parameter->SetHandling(IndividualType::StrategicParameterType::HDynamic);
00052     parameter->SetOrigin(this->GetNameOfClass());
00053 
00054     individual.StrategicParameters().push_back(parameter);
00055   }
00056 };
00057 
00058 template <class TIndividual>
00059 void
00060 AdaptiveNormalMutation<TIndividual>
00061 ::MutateStrategicIndividualParameters(IndividualType& individual, PopulationType& population) const
00062 {
00063   if (m_StrategicMutationVariance<=0) throwExceptionMacro("Error. Strategic mutation variance should not be Zero or less. Actual value: "<<m_StrategicMutationVariance);
00064 
00065   //get all strategic values of the mutation
00066   typename IndividualType::StrategicParametersType::SelectedParametersType parameters =
00067     individual.StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00068 
00069   for (unsigned long index = 0; index<parameters.size(); index++)
00070   {
00071     typename IndividualType::StrategicParameterValueType variance = (parameters[index])->GetValue();
00072 
00073     //mutate parameter
00074     variance = variance * (exp(m_RandomGenerator->GetVariate()*m_StrategicMutationVariance));
00075     
00076     //set new value;
00077     (parameters[index])->SetValue(variance);
00078   }
00079 };
00080 
00081 template <class TIndividual>
00082 double
00083 AdaptiveNormalMutation<TIndividual>
00084 ::MutateValue(const double& value)
00085 {
00086     double mutatedValue = value;
00087     mutatedValue += (m_RandomGenerator->GetVariate()*m_MutateValueVariance)/this->m_MutateValueScale;
00088     return mutatedValue;
00089 };
00090 
00091 template <class TIndividual>
00092 void
00093 AdaptiveNormalMutation<TIndividual>
00094 ::MutateObjectivParameters(IndividualType* pIndividual, PopulationType* pPopulation) const
00095 {
00096   if (!pIndividual) throwExceptionMacro("Error. Passed individual is Null.");
00097 
00098   //get the strategic parameters
00099   typename IndividualType::StrategicParametersType::SelectedParametersType parameters =
00100     pIndividual->StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00101 
00102   if (parameters.size()!=pIndividual->ObjectiveParameters().size()) throwExceptionMacro("Error. Number of objective parameters and related strategic parameters are not equal. Ensure that strategic parameters are properly registered. Objective count:" << pIndividual->ObjectiveParameters().size() <<"; strategic count: "<< parameters.size());
00103   if (parameters.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());
00104 
00105   for (unsigned long index = 0; index<pIndividual->ObjectiveParameters().size(); index++)
00106   {
00107     typename IndividualType::StrategicParameterValueType variance = (parameters[index])->GetValue();
00108     typename IndividualType::ObjectiveParameterType mutatedParameter = (pIndividual->ObjectiveParameters())[index];
00109 
00110     //mutate parameter
00111     mutatedParameter += (m_RandomGenerator->GetVariate()*variance)/this->m_GeneralObjectiveScales[index];
00112     
00113     //set new value;
00114     (pIndividual->ObjectiveParameters())[index] = mutatedParameter;
00115   }
00116 };
00117 
00118 
00119 } // end of namespace ES
00120 } // end of namespace FREE
00121 
00122 #endif

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