From 0ef7bc21654399bda27a38eae94ac922a997d7dd Mon Sep 17 00:00:00 2001 From: verel Date: Tue, 17 Aug 2010 13:14:31 +0000 Subject: [PATCH] Ajout de moPopSolInit.h pour initialiser a solution-set git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@1903 331e1502-861f-0410-8da2-ba01fb791d7f --- .../src/problems/bitString/moPopBitNeighbor.h | 159 +++++++++--------- .../src/problems/bitString/moPopSol.h | 20 ++- .../src/problems/eval/moPopBitEval.h | 84 +++++---- 3 files changed, 144 insertions(+), 119 deletions(-) diff --git a/trunk/paradiseo-mo/src/problems/bitString/moPopBitNeighbor.h b/trunk/paradiseo-mo/src/problems/bitString/moPopBitNeighbor.h index 028aedd25..30657ec44 100644 --- a/trunk/paradiseo-mo/src/problems/bitString/moPopBitNeighbor.h +++ b/trunk/paradiseo-mo/src/problems/bitString/moPopBitNeighbor.h @@ -1,30 +1,30 @@ /* - -Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 -Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau + Sebastien Verel, Arnaud Liefooghe, Jeremie Humeau -This software is governed by the CeCILL license under French law and -abiding by the rules of distribution of free software. You can ue, -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". + This software is governed by the CeCILL license under French law and + abiding by the rules of distribution of free software. You can ue, + 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". -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. + 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 + ParadisEO WebSite : http://paradiseo.gforge.inria.fr + Contact: paradiseo-help@lists.gforge.inria.fr */ #ifndef _moPopBitNeighbor_h @@ -33,7 +33,6 @@ Contact: paradiseo-help@lists.gforge.inria.fr #include #include #include -#include #include /** @@ -43,73 +42,73 @@ template< class Fitness > class moPopBitNeighbor : public moIndexNeighbor< moPopSol > > { public: - typedef moPopSol > EOT ; - typedef eoBit SUBEOT; + typedef moPopSol > EOT ; + typedef eoBit SUBEOT; - using moIndexNeighbor::fitness; - using moIndexNeighbor::key; + using moIndexNeighbor::fitness; + using moIndexNeighbor::key; - /** - * move the solution - * @param _solution the solution to move - */ - virtual void move(EOT & _solution) { - if(_solution[0].size()>0){ - unsigned size=_solution[0].size(); - unsigned s = key/size; - unsigned b = key%size; - _solution[s][b] = !_solution[s][b]; - _solution[s].fitness(subfit); - _solution.invalidate(); - } + /** + * move the solution + * @param _solution the solution to move + */ + virtual void move(EOT & _solution) { + if(_solution[0].size()>0){ + unsigned size=_solution[0].size(); + unsigned s = key/size; + unsigned b = key%size; + _solution[s][b] = !_solution[s][b]; + _solution[s].fitness(subfit); + _solution.invalidate(); } + } - void setSubFit(Fitness _subfit){ - subfit=_subfit; - } + void setSubFit(Fitness _subfit){ + subfit=_subfit; + } - /** - * return the class name - * @return the class name as a std::string - */ - virtual std::string className() const { - return "moPopBitNeighbor"; - } + /** + * return the class name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moPopBitNeighbor"; + } - /** - * Read object.\ - * Calls base class, just in case that one had something to do. - * The read and print methods should be compatible and have the same format. - * In principle, format is "plain": they just print a number - * @param _is a std::istream. - * @throw runtime_std::exception If a valid object can't be read. - */ - virtual void readFrom(std::istream& _is) { - std::string fitness_str; - int pos = _is.tellg(); - _is >> fitness_str; - if (fitness_str == "INVALID") { - throw std::runtime_error("invalid fitness"); - } - else { - Fitness repFit ; - _is.seekg(pos); - _is >> repFit; - _is >> key; - fitness(repFit); - } + /** + * Read object.\ + * Calls base class, just in case that one had something to do. + * The read and print methods should be compatible and have the same format. + * In principle, format is "plain": they just print a number + * @param _is a std::istream. + * @throw runtime_std::exception If a valid object can't be read. + */ + virtual void readFrom(std::istream& _is) { + std::string fitness_str; + int pos = _is.tellg(); + _is >> fitness_str; + if (fitness_str == "INVALID") { + throw std::runtime_error("invalid fitness"); } + else { + Fitness repFit ; + _is.seekg(pos); + _is >> repFit; + _is >> key; + fitness(repFit); + } + } - /** - * Write object. Called printOn since it prints the object _on_ a stream. - * @param _os A std::ostream. - */ - virtual void printOn(std::ostream& _os) const { - _os << fitness() << ' ' << key << std::endl; - } + /** + * Write object. Called printOn since it prints the object _on_ a stream. + * @param _os A std::ostream. + */ + virtual void printOn(std::ostream& _os) const { + _os << fitness() << ' ' << key << std::endl; + } private: - Fitness subfit; + Fitness subfit; }; #endif diff --git a/trunk/paradiseo-mo/src/problems/bitString/moPopSol.h b/trunk/paradiseo-mo/src/problems/bitString/moPopSol.h index adb70a859..4fa346980 100644 --- a/trunk/paradiseo-mo/src/problems/bitString/moPopSol.h +++ b/trunk/paradiseo-mo/src/problems/bitString/moPopSol.h @@ -36,16 +36,18 @@ Contact: paradiseo-help@lists.gforge.inria.fr template class moPopSol : public EO, public std::vector{ public: - typedef typename EO::Fitness Fitness; - using EO::invalidate; - - virtual void printOn(std::ostream& _os) const - { - _os << (*this).size() << " " << (*this).fitness() << '\n'; - for(unsigned int i=0; i<(*this).size(); i++) - _os << (*this).operator[](i) << std::endl; - } + typedef EOT SUBEOT; // public type of the solution + typedef typename EO::Fitness Fitness; + using EO::invalidate; + + virtual void printOn(std::ostream& _os) const + { + _os << (*this).size() << " " << (*this).fitness() << '\n'; + for(unsigned int i=0; i<(*this).size(); i++) + _os << (*this).operator[](i) << std::endl; + } + }; #endif diff --git a/trunk/paradiseo-mo/src/problems/eval/moPopBitEval.h b/trunk/paradiseo-mo/src/problems/eval/moPopBitEval.h index fcc4b13b7..d856bfd00 100644 --- a/trunk/paradiseo-mo/src/problems/eval/moPopBitEval.h +++ b/trunk/paradiseo-mo/src/problems/eval/moPopBitEval.h @@ -2,7 +2,7 @@ Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 - Sébastien Verel, Arnaud Liefooghe, Jérémie Humeau + Sebastien Verel, Arnaud Liefooghe, Jeremie Humeau This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, @@ -39,46 +39,70 @@ #include /** - * Abstract class for the evaluation + * Class to compute the fitness of the solution-set after mutation of one bit */ template class moPopBitEval : public moEval { public: - typedef typename Neighbor::EOT EOT; - typedef typename Neighbor::SUBEOT SUBEOT; + typedef typename Neighbor::EOT EOT; + typedef typename Neighbor::SUBEOT SUBEOT; // type of the solution - typedef typename EOT::Fitness Fitness; + typedef typename SUBEOT::Fitness Fitness; // fitness type of the solution - moPopBitEval(eoEvalFunc& _eval, unsigned int _p):eval(_eval), p(_p){ + /** + * Default constructor + * + * @param _eval evaluation function of the solution + * @param _p exponent of the p-norm to compute the fitness of the solution-set + */ + moPopBitEval(eoEvalFunc& _eval, unsigned int _p):eval(_eval), p(_p){ + } + + /** + * Compute the fitness of the neighbor after one bit mutation + * + * @param _sol the solution-set + * @param _n the neighbor which is supposed to be indexed + */ + void operator()(EOT& _sol, Neighbor& _n){ + if(_sol[0].size()>0) { + // index of the solution and the bit + unsigned int size = _sol[0].size(); + unsigned int s = _n.index() / size; // solution index + unsigned int b = _n.index() % size; // bit index + + // flip the right bit + _sol[s][b] = !_sol[s][b]; + + // compute and save the fitness of the solution s + fitOfSol = _sol[s].fitness(); + + _sol[s].invalidate(); + eval(_sol[s]); + + _n.setSubFit(_sol[s].fitness()); + + // compute the fitness of the solution-set + double fit = 0; + for (unsigned int i = 0; i < _sol.size(); i++) + fit += pow((double) _sol[i].fitness(), (int) p); + + fit = pow((double) fit, (double)1/p); + + _n.fitness(fit); + + // come back to the initial solution + _sol[s][b] = !_sol[s][b]; + _sol[s].fitness(fitOfSol); } - - void operator()(EOT& _sol, Neighbor& _n){ - if(_sol[0].size()>0){ - unsigned int size=_sol[0].size(); - unsigned int s=_n.index()/size; - unsigned int b=_n.index()%size; - subfit=_sol[s].fitness(); - _sol[s][b]=!_sol[s][b]; - _sol[s].invalidate(); - eval(_sol[s]); - double fit=0; - for (unsigned int i = 0; i < _sol.size(); i++){ - fit+=pow((double) _sol[i].fitness(), (int) p); - } - fit=pow((double) fit, (double)1/p); - _n.setSubFit(_sol[s].fitness()); - _n.fitness(fit); - _sol[s][b]=!_sol[s][b]; - _sol[s].fitness(subfit); - } - } + } private: - eoEvalFunc & eval; - unsigned int p; - Fitness subfit; + eoEvalFunc & eval; + unsigned int p; + Fitness fitOfSol; };