00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
00110 double z = popParameters[0]->GetValue();
00111 double z_skew = popParameters[1]->GetValue();
00112
00113
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
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
00125 variance = variance * z * z_i;
00126
00127 (parameters[index])->SetValue(variance);
00128
00129 typename IndividualType::StrategicParameterValueType skewness = (parameters[index+1])->GetValue();
00130
00131 skewness = skewness + z_skew + z_i_skew;
00132
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
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
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
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
00198 (pIndividual->ObjectiveParameters())[index] = mutatedParameter;
00199 }
00200 };
00201
00202
00203 }
00204 }
00205
00206 #endif