⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crossovertwopointsopt.hpp

📁 非常好的进化算法EC 实现平台 可以实现多种算法 GA GP
💻 HPP
字号:
/* *  Open BEAGLE *  Copyright (C) 2001-2005 by Christian Gagne and Marc Parizeau * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Lesser General Public *  License as published by the Free Software Foundation; either *  version 2.1 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Lesser General Public License for more details. * *  You should have received a copy of the GNU Lesser General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *  Contact: *  Laboratoire de Vision et Systemes Numeriques *  Departement de genie electrique et de genie informatique *  Universite Laval, Quebec, Canada, G1K 7P4 *  http://vision.gel.ulaval.ca * *//*! *  \file   beagle/GA/CrossoverTwoPointsOpT.hpp *  \brief  Definition of the class GA::CrossoverTwoPointsOpT. *  \author Christian Gagne *  \author Marc Parizeau *  $Revision: 1.6 $ *  $Date: 2005/09/30 15:04:53 $ */#ifndef Beagle_GA_CrossoverTwoPointsOpT_hpp#define Beagle_GA_CrossoverTwoPointsOpT_hpp#include <string>#include "beagle/config.hpp"#include "beagle/macros.hpp"#include "beagle/Object.hpp"#include "beagle/CrossoverOp.hpp"namespace Beagle {namespace GA {/*! *  \class CrossoverTwoPointsOpT beagle/GA/CrossoverTwoPointsOpT.hpp *    "beagle/GA/CrossoverTwoPointsOpT.hpp" *  \brief GA two points crossover operator class. *  \param T GA representation type used in crossover. *  \ingroup GAF * *  The GA genotype type T must fullfil the std::vector template interface. */template <class T>class CrossoverTwoPointsOpT : public CrossoverOp {public:  //! GA::CrossoverTwoPointsOpT allocator type.  typedef AllocatorT<CrossoverTwoPointsOpT<T>,CrossoverOp::Alloc>          Alloc;  //! GA::CrossoverTwoPointsOpT handle type.  typedef PointerT<CrossoverTwoPointsOpT<T>,CrossoverOp::Handle>          Handle;  //! GA::CrossoverTwoPointsOpT bag type.  typedef ContainerT<CrossoverTwoPointsOpT<T>,CrossoverOp::Bag>          Bag;  explicit CrossoverTwoPointsOpT(string inMatingPbName="ga.cx2p.prob",                                 string inName="GA-CrossoverTwoPointsOpT");  virtual ~CrossoverTwoPointsOpT() { }  virtual void initialize(System& ioSystem);  virtual bool mate(Individual& ioIndiv1, Context& ioContext1,                    Individual& ioIndiv2, Context& ioContext2);};}}/*! *  \brief Construct a GA two points crossover operator. *  \param inMatingPbName Mating probability parameter name. *  \param inName Name of the operator. */template <class T>Beagle::GA::CrossoverTwoPointsOpT<T>::CrossoverTwoPointsOpT(string inMatingPbName,                                                            string inName) :  Beagle::CrossoverOp(inMatingPbName, inName){ }/*! *  \brief Initialize the GA two points crossover operator. *  \param ioSystem System of the evolution. */template <class T>void Beagle::GA::CrossoverTwoPointsOpT<T>::initialize(Beagle::System& ioSystem){  Beagle_StackTraceBeginM();  CrossoverOp::initialize(ioSystem);  if(ioSystem.getRegister().isRegistered(mMatingProbaName)) {    ioSystem.getRegister().deleteEntry(mMatingProbaName);  }  if(ioSystem.getRegister().isRegistered(mMatingProbaName)) {    mMatingProba = castHandleT<Float>(ioSystem.getRegister()[mMatingProbaName]);  } else {    mMatingProba = new Float(float(0.3));    Register::Description lProbaDescription(      "Individual 2-points crossover pb.",      "Float",      "0.3",      "GA two-points crossover probability of a single individual."    );    ioSystem.getRegister().addEntry(mMatingProbaName, mMatingProba, lProbaDescription);  }  Beagle_StackTraceEndM("void GA::CrossoverTwoPointsOpT<T>::initialize(System& ioSystem)");}/*! *  \brief Mate two GA individuals for two points crossover. *  \param ioIndiv1   First individual to mate. *  \param ioContext1 Evolutionary context of the first individual. *  \param ioIndiv2   Second individual to mate. *  \param ioContext2 Evolutionary context of the second individual. *  \return True if the individuals are effectively mated, false if not. */template <class T>bool Beagle::GA::CrossoverTwoPointsOpT<T>::mate(Beagle::Individual& ioIndiv1,                                                Beagle::Context&    ioContext1,                                                Beagle::Individual& ioIndiv2,                                                Beagle::Context&    ioContext2){  Beagle_StackTraceBeginM();  unsigned int lNbGenotypes = minOf<unsigned int>(ioIndiv1.size(), ioIndiv2.size());  if(lNbGenotypes == 0) return false;  if(lNbGenotypes == 1) {    typename T::Handle lGenotype1 = castHandleT<T>(ioIndiv1[0]);    typename T::Handle lGenotype2 = castHandleT<T>(ioIndiv2[0]);    unsigned int lSize = minOf<unsigned int>(lGenotype1->size(), lGenotype2->size());    if(lSize < 2) return false;    unsigned int lMatingPoint1 = ioContext1.getSystem().getRandomizer().rollInteger(1, lSize);    unsigned int lMatingPoint2 = ioContext1.getSystem().getRandomizer().rollInteger(1, (lSize-1));    if(lMatingPoint2 >= lMatingPoint1) ++lMatingPoint2;    else {      unsigned int lTemp = lMatingPoint1;      lMatingPoint1 = lMatingPoint2;      lMatingPoint2 = lTemp;    }    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The first genotype mated is (before GA two points crossover): ")+      lGenotype1->serialize()    );    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The second genotype mated is (before GA two points crossover): ")+      lGenotype2->serialize()    );    Beagle_LogVerboseM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("Mating individuals after the ")+      uint2ordinal(lMatingPoint1+1)+string(" element and before the")+      uint2ordinal(lMatingPoint2+1)+string(" element")    );    for(unsigned int i=lMatingPoint1; i<lMatingPoint2; ++i) {      typename T::value_type lTemp = (*lGenotype1)[i];      (*lGenotype1)[i] = (*lGenotype2)[i];      (*lGenotype2)[i] = lTemp;    }    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The first genotype mated is (after GA two points crossover): ")+      lGenotype1->serialize()    );    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The second genotype mated is (after GA two points crossover): ")+      lGenotype2->serialize()    );  }  else {    unsigned int lTotalSize = 0;    std::vector< unsigned int,BEAGLE_STLALLOCATOR<unsigned int> > lSizes;    for(unsigned int i=0; i<lNbGenotypes; i++) {      typename T::Handle lGenotype1 = castHandleT<T>(ioIndiv1[i]);      typename T::Handle lGenotype2 = castHandleT<T>(ioIndiv2[i]);      unsigned int lSizeI = minOf<unsigned int>(lGenotype1->size(), lGenotype2->size());      lSizes.push_back(lSizeI);      lTotalSize += lSizeI;    }    if(lTotalSize < 2) return false;    unsigned int lMatingPoint1 =      ioContext1.getSystem().getRandomizer().rollInteger(1, lTotalSize);    unsigned int lMatingGenotype = 0;    for(; (lMatingGenotype+1)<lNbGenotypes; lMatingGenotype++) {      if(lMatingPoint1 <= lSizes[lMatingGenotype]) break;      else lMatingPoint1 -= lSizes[lMatingGenotype];    }    typename T::Handle lGenotype1 = castHandleT<T>(ioIndiv1[lMatingGenotype]);    typename T::Handle lGenotype2 = castHandleT<T>(ioIndiv2[lMatingGenotype]);    unsigned int lSize = minOf<unsigned int>(lGenotype1->size(), lGenotype2->size());    if(lSize < 2) return false;    unsigned int lMatingPoint2 = ioContext1.getSystem().getRandomizer().rollInteger(1, (lSize-1));    if(lMatingPoint2 >= lMatingPoint1) ++lMatingPoint2;    else {      unsigned int lTemp = lMatingPoint1;      lMatingPoint1 = lMatingPoint2;      lMatingPoint2 = lTemp;    }    Beagle_LogVerboseM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("Mating the ")+uint2ordinal(lMatingGenotype+1)+      string(" genotypes after the ")+uint2ordinal(lMatingPoint1+1)+      string(" element and before the ")+uint2ordinal(lMatingPoint2+1)+      string(" element")    );    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The first genotype mated is (before GA two points crossover): ")+      lGenotype1->serialize()    );    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The second genotype mated is (before GA two points crossover): ")+      lGenotype2->serialize()    );    for(unsigned int i=lMatingPoint1; i<lMatingPoint2; ++i) {      typename T::value_type lTemp = (*lGenotype1)[i];      (*lGenotype1)[i] = (*lGenotype2)[i];      (*lGenotype2)[i] = lTemp;    }    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The first genotype mated is (after GA two points crossover): ")+      lGenotype1->serialize()    );    Beagle_LogDebugM(      ioContext1.getSystem().getLogger(),      "crossover", "Beagle::GA::CrossoverTwoPointsOpT",      string("The second genotype mated is (after GA two points crossover): ")+      lGenotype2->serialize()    );  }  return true;  Beagle_StackTraceEndM("bool GA::CrossoverTwoPointsOpT<T>::mate(Individual& ioIndiv1,Context& ioContext1, Individual& ioIndiv2, Context& ioContext2)");}#endif // Beagle_GA_CrossoverTwoPointsOpT_hpp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -