From cf4700c2be5f393fe5c036ce7d6f022438ac3cdd Mon Sep 17 00:00:00 2001 From: canape Date: Fri, 26 Oct 2007 12:54:29 +0000 Subject: [PATCH] Adding test for insular model with the PSO git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@746 331e1502-861f-0410-8da2-ba01fb791d7f --- trunk/paradiseo-peo/test/CMakeLists.txt | 4 +- trunk/paradiseo-peo/test/t-peoInsularPSO.cpp | 130 ++++++++++++++ .../paradiseo-peo/test/t-peoPSOParaIsland.cpp | 170 ++++++++++++++++++ 3 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 trunk/paradiseo-peo/test/t-peoInsularPSO.cpp create mode 100644 trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp diff --git a/trunk/paradiseo-peo/test/CMakeLists.txt b/trunk/paradiseo-peo/test/CMakeLists.txt index c88dce393..5bfa40daf 100644 --- a/trunk/paradiseo-peo/test/CMakeLists.txt +++ b/trunk/paradiseo-peo/test/CMakeLists.txt @@ -59,9 +59,11 @@ ENDIF(WIN32 AND NOT CYGWIN) SET (TEST_LIST t-peo t-peoPSO + t-peoInsularPSO ) -SET (TEST_LIBRARY t-peoPSOPara) +SET (TEST_LIBRARY t-peoPSOPara + t-peoPSOParaIsland) FOREACH (test ${TEST_LIST} ${TEST_LIBRARY}) diff --git a/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp b/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp new file mode 100644 index 000000000..9c2b8a66d --- /dev/null +++ b/trunk/paradiseo-peo/test/t-peoInsularPSO.cpp @@ -0,0 +1,130 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, LIFL, 2002-2007 +* +* Clive Canape +* +* This software is governed by the CeCILL license under French law and +* abiding by the rules of distribution of free software. You can use, +* modify and/ or redistribute the software under the terms of the CeCILL +* license as circulated by CEA, CNRS and INRIA at the following URL +* "http://www.cecill.info". +* +* As a counterpart to the access to the source code and rights to copy, +* modify and redistribute granted by the license, users are provided only +* with a limited warranty and the software's author, the holder of the +* economic rights, and the successive licensors have only limited liability. +* +* In this respect, the user's attention is drawn to the risks associated +* with loading, using, modifying and/or developing or reproducing the +* software by the user in light of its specific status of free software, +* that may mean that it is complicated to manipulate, and that also +* therefore means that it is reserved for developers and experienced +* professionals having in-depth computer knowledge. Users are therefore +* encouraged to load and test the software's suitability as regards their +* requirements in conditions enabling the security of their systems and/or +* data to be ensured and, more generally, to use and operate it in the +* same conditions as regards security. +* The fact that you are presently reading this means that you have had +* knowledge of the CeCILL license and that you accept its terms. +* +* ParadisEO WebSite : http://paradiseo.gforge.inria.fr +* Contact: paradiseo-help@lists.gforge.inria.fr +* clive.canape@inria.fr +*/ +//----------------------------------------------------------------------------- +// t-peoInsularPSO.cpp +//----------------------------------------------------------------------------- + +#include + +#define N 4 + +typedef eoRealParticle < double >Indi; +double f (const Indi & _indi) +{ + const double PI = 4.0 * atan(1.0); + double sum=0.; + for (unsigned i = 0; i < _indi.size()-1; i++) + sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); + sum+=pow(sin(3*PI*_indi[0]),2); + sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + return (-sum); + +} + +template < class POT > class eoPrint : public eoContinue +{ + public : + + bool operator () (const eoPop & __pop) + { + double result[__pop.size()]; + for(unsigned i=0;i<__pop.size();i++) + result[i]=__pop[i].best(); + std::sort(result,result+__pop.size()); + std::cout << "\n"< plainEvalSeq(f); + eoEvalFuncCounter < Indi > evalSeq (plainEvalSeq); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > popSeq; + popSeq.append (POP_SIZE, random); + apply(evalSeq, popSeq);; + apply < Indi > (veloRandom, popSeq); + apply < Indi > (localInit, popSeq); + eoLinearTopology topologySeq(NEIGHBORHOOD_SIZE); + topologySeq.setup(popSeq); + eoRealVectorBounds bndsSeq(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocitySeq (topologySeq,C1,C2,bndsSeq); + eoGenContinue < Indi > genContSeq (MAX_GEN); + eoPrint printSeq; + eoCombinedContinue continuatorSeq(genContSeq); + continuatorSeq.add(printSeq); + eoCheckPoint checkpointSeq(continuatorSeq); + eoSyncEasyPSO < Indi > psaSeq(checkpointSeq, evalSeq, velocitySeq, flight); + psaSeq (popSeq); + popSeq.sort (); +} + +void peoPSOPara() +{ + char *tmp="mpiexec -n ",*tmp2=" ./t-peoPSOParaIsland @lesson.param ",tmp3[4],buffer[256]; + sprintf(tmp3,"%d",N); + strcpy(buffer,tmp); + strcat(buffer,tmp3); + strcat(buffer,tmp2); + system(buffer); +} + +int main (int __argc, char *__argv[]) +{ + + peoPSOSeq (); + peoPSOPara(); +} diff --git a/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp b/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp new file mode 100644 index 000000000..975d8bdbf --- /dev/null +++ b/trunk/paradiseo-peo/test/t-peoPSOParaIsland.cpp @@ -0,0 +1,170 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, LIFL, 2002-2007 +* +* Clive Canape +* +* This software is governed by the CeCILL license under French law and +* abiding by the rules of distribution of free software. You can use, +* modify and/ or redistribute the software under the terms of the CeCILL +* license as circulated by CEA, CNRS and INRIA at the following URL +* "http://www.cecill.info". +* +* As a counterpart to the access to the source code and rights to copy, +* modify and redistribute granted by the license, users are provided only +* with a limited warranty and the software's author, the holder of the +* economic rights, and the successive licensors have only limited liability. +* +* In this respect, the user's attention is drawn to the risks associated +* with loading, using, modifying and/or developing or reproducing the +* software by the user in light of its specific status of free software, +* that may mean that it is complicated to manipulate, and that also +* therefore means that it is reserved for developers and experienced +* professionals having in-depth computer knowledge. Users are therefore +* encouraged to load and test the software's suitability as regards their +* requirements in conditions enabling the security of their systems and/or +* data to be ensured and, more generally, to use and operate it in the +* same conditions as regards security. +* The fact that you are presently reading this means that you have had +* knowledge of the CeCILL license and that you accept its terms. +* +* ParadisEO WebSite : http://paradiseo.gforge.inria.fr +* Contact: paradiseo-help@lists.gforge.inria.fr +* clive.canape@inria.fr +*/ +//----------------------------------------------------------------------------- +// t-peoPSOParaIsland.cpp +//----------------------------------------------------------------------------- + +#include + +typedef eoRealParticle < double >Indi; + + +//Evaluation function +double f (const Indi & _indi) +{ + + const double PI = 4.0 * atan(1.0); + double sum=0.; + for (unsigned i = 0; i < _indi.size()-1; i++) + sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); + sum+=pow(sin(3*PI*_indi[0]),2); + sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + return (-sum); + +} + +template < class POT > class eoPrint : public eoContinue +{ + public : + + bool operator () (const eoPop & __pop) + { + double result[__pop.size()]; + for(unsigned i=0;i<__pop.size();i++) + result[i]=__pop[i].best(); + std::sort(result,result+__pop.size()); + std::cout << "\n"< plainEval(f); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoEvalFuncCounter < Indi > evalSeq (plainEval); + peoParaPopEval< Indi > eval(plainEval); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + apply(evalSeq, pop); + apply < Indi > (veloRandom, pop); + apply < Indi > (localInit, pop); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + topology.setup(pop); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoPrint print; + eoCombinedContinue continuator(genContPara); + continuator.add(print); + eoCheckPoint checkpoint(continuator); + RingTopology topologyMig; + /*******************************************************************/ + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + peoPSOSelect mig_selec(topology); + eoSelectNumber< Indi > mig_select(mig_selec); + peoPSOReplacement mig_replace; +/*****************************************************************/ + + peoEvalFuncPSO plainEval2(f); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoFirstIsBestInit < Indi > localInit2; + eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight2(bndsFlight2); + eoEvalFuncCounter < Indi > evalSeq2 (plainEval2); + peoParaPopEval< Indi > eval2(plainEval2); + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + apply(evalSeq2, pop2); + apply < Indi > (veloRandom2, pop2); + apply < Indi > (localInit2, pop2); + eoLinearTopology topology2(NEIGHBORHOOD_SIZE); + topology2.setup(pop2); + eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCheckPoint checkpoint2(genContPara2); + /*******************************************************************/ + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + peoPSOSelect mig_selec2(topology2); + eoSelectNumber< Indi > mig_select2(mig_selec2); + peoPSOReplacement mig_replace2; + + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); + checkpoint.add( mig ); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop); + checkpoint2.add( mig2 ); + + peoPSO < Indi > psa(checkpoint, eval, velocity, flight); + mig.setOwner( psa ); + psa(pop); + peoPSO < Indi > psa2(checkpoint2, eval2, velocity2, flight2); + mig2.setOwner( psa2 ); + psa2(pop2); + + peo :: run(); + peo :: finalize(); +} +