//eo #include // moeo #include //general #include #include #include #include #include //peo #include #include #include #include template class generalAggregation: public eoBF{}; template class AbstractEntityToPopAggregation: public generalAggregation&, A, R>{}; template class AbstractEntityToArchiveAggregation: public generalAggregation&, A, R>{}; template class PopToPopAggregation: public AbstractEntityToPopAggregation&, void>{}; template class ArchiveToPopAggregation: public AbstractEntityToPopAggregation&, void>{}; template class PopToArchiveAggregation: public AbstractEntityToArchiveAggregation&, void>{}; template class ArchiveToArchiveAggregation: public AbstractEntityToArchiveAggregation&, void>{}; /* * */ template class gestionTransfer: public eoUpdater{ public: gestionTransfer(eoGenContinue < EOT > & _continuator, peoDataTransfer & _asyncDataTransfer, moeoArchive& _archive):continuator(_continuator), asyncDataTransfer(_asyncDataTransfer), archive(_archive){} void operator()(){ if(!continuator(archive)){ asyncDataTransfer(); continuator.totalGenerations(continuator.totalGenerations()); } } private: eoGenContinue < EOT > & continuator; peoDataTransfer& asyncDataTransfer; moeoArchive& archive; }; /* * */ template class gestionTransfer2: public eoUpdater{ public: gestionTransfer2(eoContinue < EOT > & _continuator, peoSyncDataTransfer & _asyncDataTransfer, moeoArchive& _archive):continuator(_continuator), asyncDataTransfer(_asyncDataTransfer), archive(_archive){} void operator()(){ if(!continuator(archive)){ asyncDataTransfer(); } } private: eoContinue < EOT > & continuator; peoSyncDataTransfer& asyncDataTransfer; moeoArchive& archive; }; /* * */ /*template class IBEAAggregationRnd: public ArchiveToPopAggregation{ public: void operator()(eoPop< EOT >& _pop, moeoArchive< EOT >& _archive) { UF_random_generator rndGen; std::vector tab; unsigned int resizeValue; unsigned int popCorrectSize= _pop.size(); if (_pop.size() - _archive.size()>0){ resizeValue=_pop.size() - _archive.size(); _pop.shuffle(); } else resizeValue=0; for(unsigned int i=0; i<_archive.size(); i++) tab.push_back(i); std::random_shuffle(tab.begin(), tab.end(), rndGen); _pop.resize(resizeValue); for (unsigned int i=0; i<(popCorrectSize-resizeValue); i++) { _pop.push_back(_archive[tab[i]]); } for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].fitness(0.0); _pop[i].diversity(0.0); } } };*/ /* * */ template class IBEAAggregation: public ArchiveToPopAggregation{ public: void operator()(eoPop< EOT >& _pop, moeoArchive< EOT >& _archive) { unsigned int popSize= _pop.size(); _pop.reserve(popSize + _archive.size()); for (unsigned int i=0; i<_archive.size(); i++) { _pop.push_back(_archive[i]); _pop[i+popSize].fitness(0.0); //_pop[i].diversity(0.0); } diversityAssignment(_pop); std::sort(_pop.begin(), _pop.end(), cmp); _pop.resize(popSize); } private: moeoCrowdingDiversityAssignment diversityAssignment; moeoDiversityThenFitnessComparator cmp; }; /* * */ /*template class IBEAAggregationQuiMarchePas{ public: void operator()(eoPop< EOT >& _pop, moeoArchive< EOT >& _archive) { UF_random_generator rndGen; std::vector tab; unsigned int resizeValue; unsigned int popCorrectSize= _pop.size(); if (_pop.size() <= _archive.size()) _pop.resize(0); for (unsigned int i=0; i<_archive.size(); i++) { _pop.push_back(_archive[i]); _pop[i].fitness(0.0); _pop[i].diversity(0.0); } } };*/ /* * */ template class LSAggregation: public ArchiveToArchiveAggregation{ public: LSAggregation(eoMonOp & _op, eoEvalFunc& _eval, unsigned int _nbKick): ArchiveToArchiveAggregation(),op(_op), eval(_eval), nbKick(_nbKick){} void operator()(moeoArchive< EOT >& _archive1, moeoArchive & _archive2) { unsigned int archSize=_archive2.size(); if(archSize>0){ _archive1.resize(0); _archive1.push_back(_archive2[rng.random(archSize)]); // std::cout << "kick : " << nbKick << std::endl; //si la solution n'a pas encore été visité if(_archive1[0].flag()==1){ std::cout << "kick pour du vrai" << std::endl; //on la kick for(unsigned int i=0; i & op; eoEvalFunc & eval; unsigned int nbKick; }; //Aggregation pour archiver une pop template class CentralAggregation: public PopToArchiveAggregation{ public: void operator()(moeoArchive< EOT >& _archive, eoPop< EOT >& _pop) { _archive(_pop); } }; //aggregation pour archiver une archive template class ArchToArchAggregation{ public: void operator()(moeoArchive< EOT >& _archive1, moeoArchive< EOT >& _archive2) { _archive1(_archive2); } }; template class gestArchive{ public: gestArchive(moeoArchive & _archive, eoPop & _pop, peoSyncDataTransfer & _syncDataTransfer, eoContinue & _cont): archive(_archive), pop(_pop), syncDataTransfer(_syncDataTransfer), cont(_cont){} void operator()(eoPop & population) { while(true){ // pop.resize(0); //for(unsigned int i=0; i& archive; eoPop & pop; peoSyncDataTransfer& syncDataTransfer; eoContinue & cont; }; template class testPEO{ public: testPEO(int _argc, char** _argv, moeoPopAlgo & _algo1, moeoPopAlgo & _algo2, eoPop & _pop1, eoPop & _pop2, moeoNewBoundedArchive & _centralArchive, AbstractEntityToArchiveAggregation &, void>& _algo1ToArchive, AbstractEntityToArchiveAggregation &, void>& _algo2ToArchive, generalAggregation &, moeoArchive &, void>& _archiveToAlgo1, generalAggregation &, moeoArchive &, void>& _archiveToAlgo2, eoCheckPoint & _checkAlgo1, eoCheckPoint & _checkAlgo2, eoCheckPoint & _checkArchive): argc(_argc), argv(_argv), algo1(_algo1), algo2(_algo2), pop1(_pop1), pop2(_pop2), centralArchive(_centralArchive), algo1ToArchive(_algo1ToArchive), algo2ToArchive(_algo2ToArchive), archiveToAlgo1(_archiveToAlgo1), archiveToAlgo2(_archiveToAlgo2), checkAlgo1(_checkAlgo1), checkAlgo2(_checkAlgo2), checkArchive(_checkArchive){} void operator()(){ //PEO Initialization peo :: init (argc, argv); //Two RingTopolgy RingTopology ring1, ring2; //DataTransfer for the fisrt ring peoSyncDataTransfer transfer1(centralArchive, ring1, algo1ToArchive); peoSyncDataTransfer transfer2(pop1, ring1, archiveToAlgo1); //DataTransfer for the second ring peoSyncDataTransfer transfer3(centralArchive, ring2, algo2ToArchive); peoSyncDataTransfer transfer4(pop2, ring2, archiveToAlgo2); //Transfer Algo1 -> archiveCentral (Ring1) gestArchive toCenter1(centralArchive, pop1, transfer1, checkArchive); //Transfer archiveCentral -> Algo1 (Ring1) eoGenContinue genContinuator1(100); gestionTransfer exitCenter1(genContinuator1, transfer2, centralArchive); checkAlgo1.add(exitCenter1); //Transfer Algo2 -> archiveCentral (Ring2) gestArchive toCenter2(centralArchive, pop2, transfer3, checkArchive); //Transfer archiveCentral -> Algo2 (Ring2) eoGenContinue genContinuator2(200); gestionTransfer exitCenter2(genContinuator2, transfer4, centralArchive); checkAlgo2.add(exitCenter2); //dummyPop eoPop dummyPop; //Wrapping of algotithm peoParallelAlgorithmWrapper parallelEA_1(toCenter1, dummyPop); transfer1.setOwner( parallelEA_1 ); peoParallelAlgorithmWrapper parallelEA_2(algo1, pop1); transfer2.setOwner( parallelEA_2 ); peoParallelAlgorithmWrapper parallelEA_3(toCenter2, dummyPop); transfer3.setOwner( parallelEA_3 ); peoParallelAlgorithmWrapper parallelEA_4(algo2, pop2); transfer4.setOwner( parallelEA_4 ); //run peo :: run( ); peo :: finalize( ); endDebugging(); } private: int argc; char** argv; moeoPopAlgo & algo1; moeoPopAlgo & algo2; eoPop & pop1; eoPop & pop2; moeoNewBoundedArchive & centralArchive; AbstractEntityToArchiveAggregation &, void> & algo1ToArchive; AbstractEntityToArchiveAggregation &, void> & algo2ToArchive; generalAggregation &, moeoArchive &, void> & archiveToAlgo1; generalAggregation &, moeoArchive &, void> & archiveToAlgo2; eoCheckPoint & checkAlgo1; eoCheckPoint & checkAlgo2; eoCheckPoint & checkArchive; };