00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _freESAdaptiveCovarianceMutation_txx
00018 #define _freESAdaptiveCovarianceMutation_txx
00019
00020 #include "freESAdaptiveCovarianceMutation.h"
00021
00022 namespace FREE
00023 {
00024 namespace ES
00025 {
00026
00027 template <class TIndividual>
00028 AdaptiveCovarianceMutation<TIndividual>
00029 ::AdaptiveCovarianceMutation()
00030 {
00031 m_StrategicMutationVariance = 1.0;
00032 m_MutateValueVariance = 1.0;
00033 m_RandomGenerator = VariateGeneratorType::New();
00034 }
00035
00036 template <class TIndividual>
00037 void
00038 AdaptiveCovarianceMutation<TIndividual>
00039 ::RegisterStrategicIndividualParameters(IndividualType& individual) const
00040 {
00041 for (unsigned long index = 0; index<individual.ObjectiveParameters().size(); index++)
00042 {
00043 IndividualType::StrategicParameterPointer parameter = IndividualType::StrategicParameterType::New();
00044
00045 parameter->SetValue(1.0);
00046 parameter->SetHandling(IndividualType::StrategicParameterType::HDynamic);
00047 parameter->SetOrigin(this->GetNameOfClass());
00048
00049 individual.StrategicParameters().push_back(parameter);
00050 }
00051 };
00052
00053 template <class TIndividual>
00054 void
00055 AdaptiveCovarianceMutation<TIndividual>
00056 ::MutateStrategicIndividualParameters(IndividualType& individual, PopulationType& population) const
00057 {
00058 if (m_StrategicMutationVariance<=0) throwExceptionMacro("Error. Strategic mutation variance should not be Zero or less. Actual value: "<<m_StrategicMutationVariance);
00059
00060
00061 IndividualType::StrategicParametersType::SelectedParametersType parameters =
00062 individual.StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00063
00064 for (unsigned long index = 0; index<parameters.size(); index++)
00065 {
00066 IndividualType::StrategicParameterValueType variance = (parameters[index])->GetValue();
00067
00068
00069 variance = variance * (exp(m_RandomGenerator->GetVariate()*m_StrategicMutationVariance));
00070
00071
00072 (parameters[index])->SetValue(variance);
00073 }
00074 };
00075
00076 template <class TIndividual>
00077 double
00078 AdaptiveCovarianceMutation<TIndividual>
00079 ::MutateValue(const double& value)
00080 {
00081 double mutatedValue = value;
00082 mutatedValue += (m_RandomGenerator->GetVariate()*m_MutateValueVariance)/m_MutateValueScale;
00083 return mutatedValue;
00084 };
00085
00086 template <class TIndividual>
00087 void
00088 AdaptiveCovarianceMutation<TIndividual>
00089 ::MutateObjectivParameters(IndividualType* pIndividual, PopulationType* pPopulation) const
00090 {
00091 if (!pIndividual) throwExceptionMacro("Error. Passed individual is Null.");
00092
00093
00094 IndividualType::StrategicParametersType::SelectedParametersType parameters =
00095 pIndividual->StrategicParameters().GetStrategicParameters(this->GetNameOfClass());
00096
00097 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());
00098 if (parameters.size()!=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: "<< m_GeneralObjectiveScales.size());
00099
00100 for (unsigned long index = 0; index<pIndividual->ObjectiveParameters().size(); index++)
00101 {
00102 IndividualType::StrategicParameterValueType variance = (parameters[index])->GetValue();
00103 IndividualType::ObjectiveParameterType mutatedParameter = (pIndividual->ObjectiveParameters())[index];
00104
00105
00106 mutatedParameter += (m_RandomGenerator->GetVariate()*variance)/m_GeneralObjectiveScales[index];
00107
00108
00109 (pIndividual->ObjectiveParameters())[index] = mutatedParameter;
00110 }
00111 };
00112
00113
00114 }
00115 }
00116
00117 #endif