diff --git a/trunk/paradiseo-mo/src/memory/moIndexedVectorTabuList.h b/trunk/paradiseo-mo/src/memory/moIndexedVectorTabuList.h new file mode 100644 index 000000000..1283bbbc7 --- /dev/null +++ b/trunk/paradiseo-mo/src/memory/moIndexedVectorTabuList.h @@ -0,0 +1,121 @@ +/* + +Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + +Sébastien Verel, Arnaud Liefooghe, Jérémie 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". + +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 _moIndexedVectorTabuList_h +#define _moIndexedVectorTabuList_h + +#include +#include +#include + +/** + * Tabu List of indexed neighbors save in a vector + * each neighbor can not used during howlong iterations + */ +template +class moIndexedVectorTabuList : public moTabuList +{ +public: + typedef typename Neighbor::EOT EOT; + + /** + * Constructor + * @param _maxSize maximum size of the tabu list + * @param _howlong how many iteration a move is tabu + */ + moIndexedVectorTabuList(unsigned int _maxSize, unsigned int _howlong) : maxSize(_maxSize), howlong(_howlong) { + tabuList.resize(_maxSize); + } + + /** + * init the tabuList by clearing the memory + * @param _sol the current solution + */ + virtual void init(EOT & _sol) { + clearMemory(); + } + + + /** + * add a new neighbor in the tabuList + * @param _sol unused solution + * @param _neighbor the current neighbor + */ + virtual void add(EOT & _sol, Neighbor & _neighbor) { + if (_neighbor.index() < maxSize) + tabuList[_neighbor.index()] = howlong; + } + + /** + * update the tabulist by decreasing the number of tabu iteration + * @param _sol unused solution + * @param _neighbor unused neighbor + */ + virtual void update(EOT & _sol, Neighbor & _neighbor) { + for (unsigned int i = 0; i < maxSize; i++) + if (tabuList[i] > 0) + tabuList[i]--; + } + + /** + * check if the move is tabu + * @param _sol unused solution + * @param _neighbor the current neighbor + * @return true if tabuList contains _sol + */ + virtual bool check(EOT & _sol, Neighbor & _neighbor) { + return (tabuList[_neighbor.index()] > 0); + } + + /** + * clearMemory: remove all solution of the tabuList + */ + virtual void clearMemory() { + for (unsigned int i = 0; i < maxSize; i++) + tabuList[i] = 0; + } + + void print(){ + std::cout << "Tabulist:" << std::endl; + for(int i=0; i tabuList; + //maximum size of the tabu list + unsigned int maxSize; + //how many iteration a move is tabu + unsigned int howlong; + +}; + +#endif diff --git a/trunk/paradiseo-mo/src/problems/permutation/moIndexedSwapNeighbor.h b/trunk/paradiseo-mo/src/problems/permutation/moIndexedSwapNeighbor.h new file mode 100644 index 000000000..0b53dbad8 --- /dev/null +++ b/trunk/paradiseo-mo/src/problems/permutation/moIndexedSwapNeighbor.h @@ -0,0 +1,97 @@ +/* + +Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2010 + +Sébastien Verel, Arnaud Liefooghe, Jérémie 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". + +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 _moIndexedSwapNeighbor_h +#define _moIndexedSwapNeighbor_h + +#include +#include + +/** + * Indexed Swap Neighbor: the position of the swap are computed according to the index + */ +template +class moIndexedSwapNeighbor: public moBackableNeighbor, public moIndexNeighbor +{ +public: + // using moIndexNeighbor::EOT; + + using moBackableNeighbor::fitness; + using moIndexNeighbor::key; + + /** + * Apply the swap + * @param _solution the solution to move + */ + virtual void move(EOT& _solution) { + unsigned int tmp; + unsigned i, j; + + this->getIndices(_solution.size(), i, j); + + tmp = _solution[i]; + _solution[i] = _solution[j]; + _solution[j] = tmp; + + _solution.invalidate(); + } + + /** + * apply the swap to restore the solution (use by moFullEvalByModif) + * @param _solution the solution to move back + */ + virtual void moveBack(EOT& _solution) { + unsigned int tmp; + unsigned i, j; + this->getIndices(_solution.size(), i, j); + + tmp = _solution[i]; + _solution[i] = _solution[j]; + _solution[j] = tmp; + + _solution.invalidate(); + } + + /** + * Get the two indexes of the swap + * @param N size of the permutation + * @param _first first index + * @param _second second index + */ + void getIndices(unsigned N, unsigned int & _first, unsigned int & _second) { + unsigned int n = (unsigned int) ( (1 + sqrt(1 + 8 * key)) / 2); + + _first = key - (n - 1) * n / 2; + _second = N - 1 - (n - 1 - _first); + } + + +}; + +#endif