00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _freESDiscriminativeRecombinator_txx
00023 #define _freESDiscriminativeRecombinator_txx
00024
00025 #include "freESDiscriminativeRecombinator.h"
00026
00027 namespace FREE
00028 {
00029 namespace ES
00030 {
00031
00032
00033 template <class TIndividual>
00034 DiscriminativeRecombinator<TIndividual>
00035 ::DiscriminativeRecombinator()
00036 {
00037 }
00038
00039 template <class TIndividual>
00040 void
00041 DiscriminativeRecombinator<TIndividual>::
00042 SetObjectiveRecombinator( SubRecombinatorType * pObjectiveRecombinator )
00043 {
00044 if ( this->m_ObjectiveRecombinator != pObjectiveRecombinator )
00045 {
00046 this->m_ObjectiveRecombinator = pObjectiveRecombinator ;
00047 this->Modified() ;
00048 }
00049 };
00050
00051 template <class TIndividual>
00052 void
00053 DiscriminativeRecombinator<TIndividual>::
00054 SetStrategicRecombinator( SubRecombinatorType * pStrategicRecombinator )
00055 {
00056 if ( this->m_StrategicRecombinator != pStrategicRecombinator )
00057 {
00058 this->m_StrategicRecombinator = pStrategicRecombinator ;
00059 this->Modified() ;
00060 }
00061 };
00062
00063 template <class TIndividual>
00064 typename DiscriminativeRecombinator<TIndividual>::IndividualPointer
00065 DiscriminativeRecombinator<TIndividual>
00066 ::Recombine(const ParentSelectionType& parents) const
00067 {
00068 if (this->m_ObjectiveRecombinator.IsNull()) throwExceptionMacro("Error. No recombinator set for objective parameters.");
00069 if (this->m_StrategicRecombinator.IsNull()) throwExceptionMacro("Error. No recombinator set for strategic parameters.");
00070
00071 IndividualPointer newIndividual = this->m_ObjectiveRecombinator->Recombine(parents);
00072 IndividualPointer newStrategic = this->m_StrategicRecombinator->Recombine(parents);
00073
00074
00075
00076 for (unsigned int index = 0; index<newIndividual->StrategicParameters().size(); index++)
00077 {
00078 try
00079 {
00080 typename IndividualType::StrategicParameterType::ParameterValueType newValue;
00081 newValue = ((newStrategic->StrategicParameters())[index])->GetValue();
00082 ((newIndividual->StrategicParameters())[index])->SetValue(newValue);
00083 }
00084 catchAllNPassMacro("Error while copying strategic parameter #"+Convert::ToStr(index)+".");
00085 }
00086
00087 return newIndividual;
00088 }
00089
00090 template <class TIndividual>
00091 typename DiscriminativeRecombinator<TIndividual>::WeightVectorType
00092 DiscriminativeRecombinator<TIndividual>
00093 ::GetWeights(const unsigned long lParentCount) const
00094 {
00095 if (this->m_ObjectiveRecombinator.IsNull()) throwExceptionMacro("Error. No recombinator set for objective parameters. Cannot return weights");
00096 return this->m_ObjectiveRecombinator->GetWeights(lParentCount);
00097 };
00098
00099 }
00100 }
00101
00102 #endif