From ed97642d972dc881420410ac61c1b92cf25bd034 Mon Sep 17 00:00:00 2001 From: verel Date: Wed, 26 Jan 2011 09:11:30 +0000 Subject: [PATCH] Add moBitsNeighbor* which change several bits in a bitsring git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@2074 331e1502-861f-0410-8da2-ba01fb791d7f --- trunk/paradiseo-mo/src/mo.h | 2 + .../src/problems/bitString/moBitsNeighbor.h | 138 ++++++++++++ .../problems/bitString/moBitsNeighborhood.h | 209 ++++++++++++++++++ 3 files changed, 349 insertions(+) create mode 100644 trunk/paradiseo-mo/src/problems/bitString/moBitsNeighbor.h create mode 100644 trunk/paradiseo-mo/src/problems/bitString/moBitsNeighborhood.h diff --git a/trunk/paradiseo-mo/src/mo.h b/trunk/paradiseo-mo/src/mo.h index 6b5a3abff..55684c28b 100755 --- a/trunk/paradiseo-mo/src/mo.h +++ b/trunk/paradiseo-mo/src/mo.h @@ -167,6 +167,8 @@ #include #include +#include +#include #include #include #include diff --git a/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighbor.h b/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighbor.h new file mode 100644 index 000000000..8bf2b0ccf --- /dev/null +++ b/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighbor.h @@ -0,0 +1,138 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + + 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, + 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 +*/ + +#ifndef _moBitsNeighbor_h +#define _moBitsNeighbor_h + +#include + +/** + * Neighbor to flip several bits + * of a solution of type eoBit + */ +template< class EOT, class Fitness=typename EOT::Fitness > +class moBitsNeighbor : virtual public moNeighbor, public moBackableNeighbor +{ +public: + + // position of bits which are flipped + vector bits; + + // number of bits to flip + unsigned int nBits; + + /** + * Default Constructor + */ + moBitsNeighbor() : moNeighbor() {} + + /** + * Copy Constructor + * @param _n the neighbor to copy + */ + moBitsNeighbor(const moBitsNeighbor& _source) : moNeighbor(_source) { + bits.resize(_source.bits.size()); + + nBits = _source.nBits; + + for(unsigned i = 0; i < bits.size(); i++) + this->bits[i] = _source.bits[i] ; + } + + /** + * Assignment operator + * @param _source the source neighbor + */ + moBitsNeighbor & operator=(const moBitsNeighbor & _source) { + moNeighbor::operator=(_source); + + if (bits.size() != _source.bits.size()) + bits.resize(_source.bits.size()); + + nBits = _source.nBits; + + for(unsigned i = 0; i < bits.size(); i++) + this->bits[i] = _source.bits[i] ; + + return *this ; + } + + /** + * Return the class Name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moBitsNeighbor"; + } + + /** + * flipped the bits according to the bits vector + * @param _solution the solution to move + */ + virtual void move(EOT& _solution) { + for(unsigned i = 0; i < nBits; i++) + _solution[ this->bits[i] ] = !_solution[ this->bits[i] ]; + } + + /** + * flipped the bits according to the bits vector + * @param _solution the solution to move back + */ + virtual void moveBack(EOT& _solution) { + for(unsigned i = 0; i < nBits; i++) + _solution[ this->bits[i] ] = !_solution[ this->bits[i] ]; + } + + /** + * @param _neighbor a neighbor + * @return if _neighbor and this one are equals + */ + virtual bool equals(moBitsNeighbor& _neighbor) { + if (nBits != _neighbor.nBits) + return false; + else { + unsigned int i = 0; + + while ((i < nBits) && (bits[i] == _neighbor.bits[i])) i++; + + if (i < nBits) + return false; + else + return true; + } + } + +}; + +#endif diff --git a/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighborhood.h b/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighborhood.h new file mode 100644 index 000000000..ca10bf8d8 --- /dev/null +++ b/trunk/paradiseo-mo/src/problems/bitString/moBitsNeighborhood.h @@ -0,0 +1,209 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + + 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, + 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 +*/ + +#ifndef _moBitsNeighborhood_h +#define _moBitsNeighborhood_h + +#include +#include + +/** + * A neighborhood for bit string solutions + * where several bits could be flipped + * in a given Hamming distance + */ +template< class Neighbor > +class moBitsNeighborhood : public moNeighborhood +{ +public: + + /** + * Define type of a solution corresponding to Neighbor + */ + typedef typename Neighbor::EOT EOT; + + /** + * Constructor + * @param _length bit string length + * @param _nBits maximum number of bits to flip (radius of the neighborhood) + */ + moBitsNeighborhood(unsigned _length, unsigned _nBits): moNeighborhood(), length(_length), nBits(_nBits) { + int j; + bool last; + + neighborhoodSize = 0; + + for(int d = 1; d <= nBits; d++) { + vector bits(d); + + // the first one for this Hamming distance + for(unsigned i = 0; i < d; i++) + bits[i] = i; + + neighborsVec.push_back(bits); + + /* + std::cout << "first --" << std::endl; + for(unsigned i = 0; i < d; i++) + std::cout << bits[i] ; + std::cout << std::endl; + */ + + // the others ones + last = false; + + while(!last) { + j = d - 1; + + if (bits[j] < length - 1) { + bits[j]++; + neighborsVec.push_back(bits); + } else { + j--; + + while ( (j >= 0) && (bits[j] + 1 == bits[j+1]) ) + j--; + + if (j < 0) { + last = true; + } else { + bits[j]++; + + for(unsigned i = j+1; i < d; i++) + bits[i] = bits[i-1] + 1; + + neighborsVec.push_back(bits); + } + } + + /* + std::cout << "fin de while" << std::endl; + for(unsigned i = 0; i < d; i++) + std::cout << bits[i] << " "; + std::cout << std::endl; + */ + } + } + + neighborhoodSize = neighborsVec.size(); + } + + /** + * Test if it exist a neighbor + * @param _solution the solution to explore + * @return true if the neighborhood was not empty: the population size is at least 1 + */ + virtual bool hasNeighbor(EOT& _solution) { + return _solution.size() > 0; + } + + /** + * Initialization of the neighborhood: + * apply several bit flips on the solution + * @param _solution the solution to explore + * @param _neighbor the first neighbor + */ + virtual void init(EOT & _solution, Neighbor & _neighbor) { + key = 0; + + _neighbor.bits.resize(nBits); + + setNeighbor(0, _neighbor); + } + + /** + * Give the next neighbor + * apply several bit flips on the solution + * @param _solution the solution to explore (population of solutions) + * @param _neighbor the next neighbor which in order of distance + */ + virtual void next(EOT & _solution, Neighbor & _neighbor) { + key++; + + setNeighbor(key, _neighbor); + } + + /** + * Test if all neighbors are explored or not,if false, there is no neighbor left to explore + * @param _solution the solution to explore + * @return true if there is again a neighbor to explore: population size larger or equals than 1 + */ + virtual bool cont(EOT & _solution) { + return key < neighborhoodSize - 1; + } + + /** + * Return the class Name + * @return the class name as a std::string + */ + virtual std::string className() const { + return "moBitsNeighborhood"; + } + + unsigned int index() { + return key; + } + +protected: + // length of the bit strings + unsigned int length; + + // radius of the neighborhood + unsigned int nBits; + + // size of the neighborhood + unsigned int neighborhoodSize; + + // list of neighbors + vector< vector > neighborsVec; + + // key of the neighbor which is currently explored + unsigned int key; + + + /** + * Set the neighbor to the correct neighbor + * @param _key index in neighborVec of the neighbor to set + * @param _neighbor neighbor to set + */ + virtual void setNeighbor(unsigned _key, Neighbor & _neighbor) { + _neighbor.nBits = neighborsVec[_key].size(); + + for(unsigned i = 0; i < _neighbor.nBits; i++) + _neighbor.bits[i] = neighborsVec[_key][i]; + } + +}; + +#endif