diff --git a/trunk/paradiseo-mo/src/memory/moNeighborVectorTabuList.h b/trunk/paradiseo-mo/src/memory/moNeighborVectorTabuList.h new file mode 100644 index 000000000..5da01ee17 --- /dev/null +++ b/trunk/paradiseo-mo/src/memory/moNeighborVectorTabuList.h @@ -0,0 +1,132 @@ +/* + +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 _moNeighborVectorTabuList_h +#define _moNeighborVectorTabuList_h + +#include +#include +#include + +/** + * Tabu List of neighbors stocked in a vector + */ +template +class moNeighborVectorTabuList : 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 (0 -> no limits) + */ + moNeighborVectorTabuList(unsigned int _maxSize, unsigned int _howlong) : maxSize(_maxSize), howlong(_howlong) { + tabuList.reserve(_maxSize); + tabuList.resize(0); + } + + /** + * 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 the current solution (unused) + * @param _neighbor the current neighbor + */ + virtual void add(EOT & _sol, Neighbor & _neighbor) { + + if (tabuList.size() < maxSize) { + std::pair tmp; + tmp.first=_neighbor; + tmp.second=howlong; + tabuList.push_back(tmp); + } + else { + tabuList[index%maxSize].first = _neighbor; + tabuList[index%maxSize].second = howlong; + index++; + } + } + + /** + * update the tabulist + * @param _sol the current solution (unused) + * @param _neighbor the current neighbor (unused) + */ + virtual void update(EOT & _sol, Neighbor & _neighbor) { + if(howlong > 0) + for (unsigned int i=0; i 0) + tabuList[i].second--; + } + + /** + * check if the move is tabu + * @param _sol the current solution (unused) + * @param _neighbor the current neighbor + * @return true if tabuList contains _sol + */ + virtual bool check(EOT & _sol, Neighbor & _neighbor) { + for (unsigned int i=0; i 0 && tabuList[i].second > 0 && tabuList[i].first.equals(_neighbor)) || (howlong==0 && tabuList[i].first.equals(_neighbor))) + return true; + } + return false; + } + + /** + * clearMemory: remove all solution of the tabuList + */ + virtual void clearMemory() { + tabuList.resize(0); + index = 0; + } + + +private: + //tabu list + std::vector< std::pair > tabuList; + //maximum size of the tabu list + unsigned int maxSize; + //how many iteration a move is tabu + unsigned int howlong; + //index on the tabulist + unsigned long index; + +}; + +#endif diff --git a/trunk/paradiseo-mo/src/memory/moSolVectorTabuList.h b/trunk/paradiseo-mo/src/memory/moSolVectorTabuList.h index aa79c8255..66293f29c 100644 --- a/trunk/paradiseo-mo/src/memory/moSolVectorTabuList.h +++ b/trunk/paradiseo-mo/src/memory/moSolVectorTabuList.h @@ -17,7 +17,7 @@ public: /** * Constructor * @param _maxSize maximum size of the tabu list - * @param _howlong how many iteration a move is tabu + * @param _howlong how many iteration a solution is tabu */ moSolVectorTabuList(unsigned int _maxSize, unsigned int _howlong) : maxSize(_maxSize), howlong(_howlong) { tabuList.reserve(_maxSize); @@ -59,8 +59,10 @@ public: * @param _neighbor the current neighbor (unused) */ virtual void update(EOT & _sol, Neighbor & _neighbor) { - for (unsigned int i=0; i 0) + for (unsigned int i=0; i 0) + tabuList[i].second--; } /** diff --git a/trunk/paradiseo-mo/src/mo.h b/trunk/paradiseo-mo/src/mo.h index d92975df8..37ea65f71 100755 --- a/trunk/paradiseo-mo/src/mo.h +++ b/trunk/paradiseo-mo/src/mo.h @@ -97,6 +97,7 @@ #include #include #include +#include #include #include diff --git a/trunk/paradiseo-mo/src/neighborhood/moIndexNeighbor.h b/trunk/paradiseo-mo/src/neighborhood/moIndexNeighbor.h index ecaddea73..795a2e0bd 100644 --- a/trunk/paradiseo-mo/src/neighborhood/moIndexNeighbor.h +++ b/trunk/paradiseo-mo/src/neighborhood/moIndexNeighbor.h @@ -92,6 +92,14 @@ public: key=_key; } + /** + * @param _neighbor a neighbor + * @return if _neighbor and this one are equals + */ + virtual bool equals(moIndexNeighbor& _neighbor){ + return (key==_neighbor.index()); + } + protected: // key allowing to describe the neighbor unsigned int key; diff --git a/trunk/paradiseo-mo/src/neighborhood/moNeighbor.h b/trunk/paradiseo-mo/src/neighborhood/moNeighbor.h index 76e5dbcdf..f2d95ee8a 100644 --- a/trunk/paradiseo-mo/src/neighborhood/moNeighbor.h +++ b/trunk/paradiseo-mo/src/neighborhood/moNeighbor.h @@ -103,6 +103,14 @@ public: repFitness = _fitness; } + /** + * @param _neighbor a neighbor + * @return if _neighbor and this one are equals + */ + virtual bool equals(moNeighbor& _neighbor){ + return false; + } + /** * Return the class id. * @return the class name as a std::string diff --git a/trunk/paradiseo-mo/test/CMakeLists.txt b/trunk/paradiseo-mo/test/CMakeLists.txt index 5a617e2b4..0728e4941 100644 --- a/trunk/paradiseo-mo/test/CMakeLists.txt +++ b/trunk/paradiseo-mo/test/CMakeLists.txt @@ -78,6 +78,7 @@ SET (TEST_LIST t-moSimpleHC t-moFirstImprHC t-moRandomBestHC + t-moNeighborVectorTabuList ) FOREACH (test ${TEST_LIST}) diff --git a/trunk/paradiseo-mo/test/t-moNeighborVectorTabuList.cpp b/trunk/paradiseo-mo/test/t-moNeighborVectorTabuList.cpp new file mode 100644 index 000000000..5f4e37215 --- /dev/null +++ b/trunk/paradiseo-mo/test/t-moNeighborVectorTabuList.cpp @@ -0,0 +1,103 @@ +/* + +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 +*/ + +#include +#include "moTestClass.h" + +#include +#include +#include + +int main(){ + + std::cout << "[t-moNeighborVectorTabuList] => START" << std::endl; + + //tabu list of size 2 (neighbor are always tabu) + moNeighborVectorTabuList test(2,0); + + + bitVector sol; + bitNeighbor n1; + bitNeighbor n2; + bitNeighbor n3; + bitNeighbor n4; + n1.index(0); + n2.index(1); + n3.index(2); + n4.index(3); + + //n1 must be tabu + test.add(sol, n1); + assert(test.check(sol, n1)); + assert(!test.check(sol, n2)); + assert(!test.check(sol, n3)); + assert(!test.check(sol, n4)); + + //n1 and n2 must be tabu + test.add(sol, n2); + assert(test.check(sol, n1)); + assert(test.check(sol, n2)); + assert(!test.check(sol, n3)); + assert(!test.check(sol, n4)); + + //n3 is added, so it replace n1 -> n2 and n3 must be tabu + test.add(sol, n3); + assert(!test.check(sol, n1)); + assert(test.check(sol, n2)); + assert(test.check(sol, n3)); + assert(!test.check(sol, n4)); + + //clear tabu list all neighbor must not be tabu + test.init(sol); + assert(!test.check(sol, n1)); + assert(!test.check(sol, n2)); + assert(!test.check(sol, n3)); + assert(!test.check(sol, n4)); + + //tabu list of size 2 (neighbor are tabu during 2 iterations) + moNeighborVectorTabuList test2(2,2); + + test2.add(sol, n1); + assert(test2.check(sol, n1)); + test2.update(sol, n3); + test2.add(sol,n2); + assert(test2.check(sol, n1)); + assert(test2.check(sol, n2)); + test2.update(sol, n3); + assert(!test2.check(sol, n1)); + assert(test2.check(sol, n2)); + test2.update(sol, n4); + assert(!test2.check(sol, n1)); + assert(!test2.check(sol, n2)); + + std::cout << "[t-moNeighborVectorTabuList] => OK" << std::endl; + + return EXIT_SUCCESS; +} + diff --git a/trunk/paradiseo-mo/tutorial/Lesson1/CMakeLists.txt b/trunk/paradiseo-mo/tutorial/Lesson1/CMakeLists.txt index b83877751..c037cb058 100644 --- a/trunk/paradiseo-mo/tutorial/Lesson1/CMakeLists.txt +++ b/trunk/paradiseo-mo/tutorial/Lesson1/CMakeLists.txt @@ -11,7 +11,7 @@ ADD_EXECUTABLE(lesson1_randomBestHC lesson1_randomBestHC.cpp) ADD_EXECUTABLE(lesson1_neutralHC lesson1_neutralHC.cpp) ADD_EXECUTABLE(lesson1_iterContinuator lesson1_iterContinuator.cpp) ADD_EXECUTABLE(lesson1_fitContinuator lesson1_fitContinuator.cpp) -ADD_EXECUTABLE(lesson1_fullevalContinuator lesson1_fullevalContinuator.cpp) +ADD_EXECUTABLE(lesson1_fullEvalContinuator lesson1_fullEvalContinuator.cpp) ADD_EXECUTABLE(lesson1_evalContinuator lesson1_evalContinuator.cpp) ADD_EXECUTABLE(lesson1_combinedContinuator lesson1_combinedContinuator.cpp) @@ -21,6 +21,6 @@ TARGET_LINK_LIBRARIES(lesson1_randomBestHC eoutils ga eo) TARGET_LINK_LIBRARIES(lesson1_neutralHC eoutils ga eo) TARGET_LINK_LIBRARIES(lesson1_iterContinuator eoutils ga eo) TARGET_LINK_LIBRARIES(lesson1_fitContinuator eoutils ga eo) -TARGET_LINK_LIBRARIES(lesson1_fullevalContinuator eoutils ga eo) +TARGET_LINK_LIBRARIES(lesson1_fullEvalContinuator eoutils ga eo) TARGET_LINK_LIBRARIES(lesson1_evalContinuator eoutils ga eo) TARGET_LINK_LIBRARIES(lesson1_combinedContinuator eoutils ga eo)