diff --git a/trunk/paradiseo-peo/src/peoData.h b/trunk/paradiseo-peo/src/peoData.h index 7d5c199c5..4234268e2 100644 --- a/trunk/paradiseo-peo/src/peoData.h +++ b/trunk/paradiseo-peo/src/peoData.h @@ -40,8 +40,9 @@ #include "core/eoVector_mesg.h" #include "core/messaging.h" - +/**************************************************************************************/ /************************** DEFINE A DATA ******************************************/ +/**************************************************************************************/ class peoData { public: @@ -51,6 +52,9 @@ public: }; + +// Specific implementation : migration of a population + template class peoPop: public eoPop, public peoData { @@ -75,7 +79,9 @@ public: }; -/************************** DEFINE A CONTINUATOR ******************************************/ +/**************************************************************************************/ +/************************** DEFINE A CONTINUATOR ***********************************/ +/**************************************************************************************/ class continuator { @@ -84,6 +90,8 @@ public: }; +// Specific implementation : migration of a population + template < class EOT> class eoContinuator : public continuator{ public: @@ -99,7 +107,9 @@ protected: }; -/************************** DEFINE A SELECTOR ******************************************/ +/**************************************************************************************/ +/************************** DEFINE A SELECTOR **************************************/ +/**************************************************************************************/ template < class TYPE> class selector { @@ -108,6 +118,8 @@ public: }; +// Specific implementation : migration of a population + template < class EOT, class TYPE> class eoSelector : public selector< TYPE >{ public: @@ -128,7 +140,9 @@ protected: }; -/************************** DEFINE A REPLACEMENT ******************************************/ +/**************************************************************************************/ +/************************** DEFINE A REPLACEMENT ***********************************/ +/**************************************************************************************/ template < class TYPE> class replacement { @@ -136,6 +150,9 @@ public: virtual void operator()(TYPE &)=0; }; + +// Specific implementation : migration of a population + template < class EOT, class TYPE> class eoReplace : public replacement< TYPE >{ public: eoReplace(eoReplacement & _replace, TYPE & _destination): replace(_replace), destination(_destination){} @@ -150,4 +167,32 @@ protected: TYPE & destination; }; + +/**************************************************************************************/ +/************************ Continuator for synchrone migartion ************************/ +/**************************************************************************************/ + +class eoSyncContinue: public continuator +{ + +public: + + eoSyncContinue (unsigned __period, unsigned __init_counter = 0): period (__period),counter (__init_counter) {} + + virtual bool check() + { + return ((++ counter) % period) != 0 ; + } + + +private: + + unsigned period; + + unsigned counter; + +}; + + #endif + diff --git a/trunk/paradiseo-peo/src/peoSyncIslandMig.h b/trunk/paradiseo-peo/src/peoSyncIslandMig.h index f161fc1c9..e65fcac32 100644 --- a/trunk/paradiseo-peo/src/peoSyncIslandMig.h +++ b/trunk/paradiseo-peo/src/peoSyncIslandMig.h @@ -49,6 +49,7 @@ #include #include #include +#include "peoData.h" #include "core/messaging.h" #include "core/eoPop_mesg.h" @@ -145,7 +146,7 @@ //! islands requires the reiteration of the steps 2 through 4 for creating distinct algorithms, with distinct populations and //! the associated distinctly parametrized migration objects. The interconnecting element is the underlying topology, defined at step 1 //! (the same C++ migTopology object has to be passed as parameter for all the migration objects, in order to interconnect them). -template< class EOT > class peoSyncIslandMig : public Cooperative, public eoUpdater +template< class EOT, class TYPE > class peoSyncIslandMig : public Cooperative, public eoUpdater { public: @@ -161,11 +162,11 @@ public: //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. peoSyncIslandMig( unsigned __frequency, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, + selector & __select, + replacement & __replace, Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination + peoData & __source, + peoData & __destination ); //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected @@ -202,20 +203,15 @@ private: private: - eoPeriodicContinue< EOT > cont; - eoSelect< EOT >& select; // selection strategy - eoReplacement< EOT >& replace; // replacement strategy - Topology& topology; // neighboring topology - - // source and target populations - eoPop< EOT >& source; - eoPop< EOT >& destination; - - // immigrants & emigrants in the queue - std :: queue< eoPop< EOT > > imm; - std :: queue< eoPop< EOT > > em; - - std :: queue< Cooperative* > coop_em; + eoSyncContinue cont; // continuator + selector & select; // the selection strategy + replacement & replace; // the replacement strategy + Topology& topology; // the neighboring topology + peoData & source; + peoData & destination; + std :: queue< TYPE > imm; + std :: queue< TYPE > em; + std :: queue< Cooperative* > coop_em; sem_t sync; @@ -227,14 +223,14 @@ private: }; -template< class EOT > peoSyncIslandMig< EOT > :: peoSyncIslandMig( +template< class EOT, class TYPE > peoSyncIslandMig< EOT,TYPE > :: peoSyncIslandMig( unsigned __frequency, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, + selector & __select, + replacement & __replace, Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination + peoData & __source, + peoData & __destination ) : cont( __frequency ), select( __select ), replace( __replace ), topology( __topology ), source( __source ), destination( __destination ) { @@ -244,35 +240,35 @@ template< class EOT > peoSyncIslandMig< EOT > :: peoSyncIslandMig( } -template< class EOT > void peoSyncIslandMig< EOT > :: pack() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT, TYPE > :: pack() { ::pack( coop_em.front()->getKey() ); - ::pack( em.front() ); + em.front().pack(); coop_em.pop(); em.pop(); } -template< class EOT > void peoSyncIslandMig< EOT > :: unpack() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT, TYPE > :: unpack() { - eoPop< EOT > mig; - ::unpack( mig ); + TYPE mig; + mig.unpack(); imm.push( mig ); explicitPassive = true; } -template< class EOT > void peoSyncIslandMig< EOT > :: packSynchronizeReq() { +template< class EOT, class TYPE > void peoSyncIslandMig< EOT,TYPE > :: packSynchronizeReq() { packSynchronRequest( all ); } -template< class EOT > void peoSyncIslandMig< EOT > :: emigrate() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT , TYPE > :: emigrate() { for ( unsigned i = 0; i < out.size(); i ++ ) { - eoPop< EOT > mig; - select( source, mig ); + TYPE mig; + select( mig ); em.push( mig ); coop_em.push( out[ i ] ); send( out[ i ] ); @@ -280,46 +276,43 @@ template< class EOT > void peoSyncIslandMig< EOT > :: emigrate() } } -template< class EOT > void peoSyncIslandMig< EOT > :: immigrate() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT , TYPE > :: immigrate() { assert( imm.size() ); while ( imm.size() ) { - replace( destination, imm.front() ) ; + replace( imm.front() ) ; imm.pop(); } printDebugMessage( "peoSyncIslandMig: receiving some immigrants." ); } -template< class EOT > void peoSyncIslandMig< EOT > :: operator()() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT , TYPE > :: operator()() { - if ( !cont( source ) ) + if ( cont.check() ) { explicitPassive = standbyMigration = false; topology.setNeighbors( this, in, out ); all = topology; nbMigrations = 0; - synchronizeCoopEx(); stop(); - // sending emigrants emigrate(); // synchronizing sem_wait( &sync ); // receiving immigrants immigrate(); - synchronizeCoopEx(); stop(); } } -template< class EOT > void peoSyncIslandMig< EOT > :: notifySending() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT , TYPE > :: notifySending() { if ( !explicitPassive ) getOwner()->setPassive(); } -template< class EOT > void peoSyncIslandMig< EOT > :: notifyReceiving() +template< class EOT, class TYPE > void peoSyncIslandMig< EOT , TYPE > :: notifyReceiving() { nbMigrations++; @@ -330,12 +323,12 @@ template< class EOT > void peoSyncIslandMig< EOT > :: notifyReceiving() } } -template< class EOT > void peoSyncIslandMig< EOT > :: notifySendingSyncReq () { +template< class EOT, class TYPE > void peoSyncIslandMig< EOT, TYPE > :: notifySendingSyncReq () { getOwner()->setPassive(); } -template< class EOT > void peoSyncIslandMig< EOT > :: notifySynchronized () { +template< class EOT, class TYPE > void peoSyncIslandMig< EOT, TYPE > :: notifySynchronized () { standbyMigration = true; getOwner()->setActive(); diff --git a/trunk/paradiseo-peo/tutorial/Wrapper/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Wrapper/CMakeLists.txt index 8ee575c65..b77cfcb7e 100644 --- a/trunk/paradiseo-peo/tutorial/Wrapper/CMakeLists.txt +++ b/trunk/paradiseo-peo/tutorial/Wrapper/CMakeLists.txt @@ -54,21 +54,21 @@ ENDIF(WIN32 AND NOT CYGWIN) ### 3) Define your target(s): just an executable here ###################################################################################### -#ADD_EXECUTABLE(example1 main1.cpp) -#ADD_DEPENDENCIES(example1 peo rmc_mpi) -#ADD_EXECUTABLE(example2 main2.cpp) -#ADD_DEPENDENCIES(example2 peo rmc_mpi) -#ADD_EXECUTABLE(example3 main3.cpp) -#ADD_DEPENDENCIES(example3 peo rmc_mpi) +ADD_EXECUTABLE(example1 main1.cpp) +ADD_DEPENDENCIES(example1 peo rmc_mpi) +ADD_EXECUTABLE(example2 main2.cpp) +ADD_DEPENDENCIES(example2 peo rmc_mpi) +ADD_EXECUTABLE(example3 main3.cpp) +ADD_DEPENDENCIES(example3 peo rmc_mpi) ADD_EXECUTABLE(example4 main4.cpp) ADD_DEPENDENCIES(example4 peo rmc_mpi) -#ADD_EXECUTABLE(example5 main5.cpp) -#ADD_DEPENDENCIES(example5 tsp peo rmc_mpi) -#ADD_EXECUTABLE(example6 main6.cpp) -#ADD_DEPENDENCIES(example6 tsp peo rmc_mpi) -#ADD_EXECUTABLE(example7 main7.cpp) -#ADD_DEPENDENCIES(example7 peo rmc_mpi) +ADD_EXECUTABLE(example5 main5.cpp) +ADD_DEPENDENCIES(example5 tsp peo rmc_mpi) +ADD_EXECUTABLE(example6 main6.cpp) +ADD_DEPENDENCIES(example6 tsp peo rmc_mpi) +ADD_EXECUTABLE(example7 main7.cpp) +ADD_DEPENDENCIES(example7 peo rmc_mpi) ###################################################################################### @@ -85,12 +85,12 @@ ADD_DEPENDENCIES(example4 peo rmc_mpi) ### 5) Link the librairies ###################################################################################### -#TARGET_LINK_LIBRARIES(example1 ${XML2_LIBS} peo rmc_mpi eo eoutils) -#TARGET_LINK_LIBRARIES(example2 ${XML2_LIBS} peo rmc_mpi eo eoutils) -#TARGET_LINK_LIBRARIES(example3 ${XML2_LIBS} peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example1 ${XML2_LIBS} peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example2 ${XML2_LIBS} peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example3 ${XML2_LIBS} peo rmc_mpi eo eoutils) TARGET_LINK_LIBRARIES(example4 ${XML2_LIBS} peo rmc_mpi eo eoutils) -#TARGET_LINK_LIBRARIES(example5 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) -#TARGET_LINK_LIBRARIES(example6 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) -#TARGET_LINK_LIBRARIES(example7 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example5 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example6 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(example7 ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) ###################################################################################### diff --git a/trunk/paradiseo-peo/tutorial/Wrapper/main2.cpp b/trunk/paradiseo-peo/tutorial/Wrapper/main2.cpp index 3b0514b64..3f944d22c 100644 --- a/trunk/paradiseo-peo/tutorial/Wrapper/main2.cpp +++ b/trunk/paradiseo-peo/tutorial/Wrapper/main2.cpp @@ -24,34 +24,68 @@ int main( int __argc, char** __argv ) const float CROSS_RATE = 0.8; const double EPSILON = 0.01; const float MUT_RATE = 0.5; + const unsigned MIG_FREQ = 10; + const unsigned int MIG_SIZE = 5; rng.reseed (time(0)); - + RingTopology topology; + // Algorithm eoGenContinue < Indi > genContPara (MAX_GEN); eoCombinedContinue continuatorPara (genContPara); eoCheckPoint checkpoint(continuatorPara); - peoEvalFunc mainEval( f ); peoPopEval eval(mainEval); - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); eoInitFixedLength < Indi > random (VEC_SIZE, uGen); eoRankingSelect selectionStrategy; eoSelectNumber select(selectionStrategy,POP_SIZE); eoSegmentCrossover crossover; eoUniformMutation mutation(EPSILON); - - peoTransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); - + peoTransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + peoPop < Indi > pop; + pop.append (POP_SIZE, random); eoPlusReplacement replace; - eoEasyEA< Indi > eaAlg( checkpoint, eval, select, transform, replace ); + eoRandomSelect mig_select_one; + eoSelector > mig_select (mig_select_one,MIG_SIZE,pop); + eoReplace > mig_replace (replace,pop); + peoSyncIslandMig > mig(MIG_FREQ,mig_select,mig_replace,topology,pop,pop); + checkpoint.add(mig); + eoEasyEA< Indi > eaAlg( checkpoint, eval, select, transform, replace ); + +// Algorithm + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCombinedContinue continuatorPara2 (genContPara2); + eoCheckPoint checkpoint2(continuatorPara2); + peoEvalFunc mainEval2( f ); + peoPopEval eval2(mainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoRankingSelect selectionStrategy2; + eoSelectNumber select2(selectionStrategy2,POP_SIZE); + eoSegmentCrossover crossover2; + eoUniformMutation mutation2(EPSILON); + peoTransform transform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); + peoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + eoPlusReplacement replace2; + eoRandomSelect mig_select_one2; + eoSelector > mig_select2 (mig_select_one2,MIG_SIZE,pop2); + eoReplace > mig_replace2 (replace2,pop2); + peoSyncIslandMig > mig2(MIG_FREQ,mig_select2,mig_replace2,topology,pop2,pop2); + checkpoint2.add(mig2); + eoEasyEA< Indi > eaAlg2( checkpoint2, eval2, select2, transform2, replace2 ); -// Population*/ - eoPop < Indi > pop; - pop.append (POP_SIZE, random); + peoWrapper parallelEA( eaAlg, pop); eval.setOwner(parallelEA); transform.setOwner(parallelEA); + mig.setOwner(parallelEA); + + peoWrapper parallelEA2( eaAlg2, pop2); + eval2.setOwner(parallelEA2); + transform2.setOwner(parallelEA2); + mig2.setOwner(parallelEA2); + peo :: run(); peo :: finalize(); diff --git a/trunk/paradiseo-peo/tutorial/Wrapper/main4.cpp b/trunk/paradiseo-peo/tutorial/Wrapper/main4.cpp index 6e7bd3c99..87ae8a4ef 100644 --- a/trunk/paradiseo-peo/tutorial/Wrapper/main4.cpp +++ b/trunk/paradiseo-peo/tutorial/Wrapper/main4.cpp @@ -61,6 +61,8 @@ int main( int __argc, char** __argv ) peoPSOSelect mig_selec(topology); peoWorstPositionReplacement mig_replac; + // Specific implementation (peoData.h) + eoContinuator cont(mig_cont, pop); eoSelector > mig_select (mig_selec,1,pop); eoReplace > mig_replace (mig_replac,pop); @@ -90,12 +92,15 @@ int main( int __argc, char** __argv ) // Island model eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); - eoContinuator cont2(mig_cont2,pop2); peoPSOSelect mig_selec2(topology2); - eoSelector > mig_select2 (mig_selec2,1,pop2); peoWorstPositionReplacement mig_replac2; - eoReplace > mig_replace2 (mig_replac2,pop2); +// Specific implementation (peoData.h) + + eoContinuator cont2(mig_cont2,pop2); + eoSelector > mig_select2 (mig_selec2,1,pop2); + eoReplace > mig_replace2 (mig_replac2,pop2); + // Island model