diff --git a/trunk/paradiseo-mo/src/algo/moLocalSearch.h b/trunk/paradiseo-mo/src/algo/moLocalSearch.h index 3e5da168d..971f28347 100644 --- a/trunk/paradiseo-mo/src/algo/moLocalSearch.h +++ b/trunk/paradiseo-mo/src/algo/moLocalSearch.h @@ -48,14 +48,14 @@ template class moLocalSearch: public eoMonOp { public: - typedef moNeighborhood Neighborhood; - typedef moNeighborhoodExplorer NeighborhoodExplorer; - typedef typename Neighbor::EOT EOT ; + typedef moNeighborhood Neighborhood; + typedef moNeighborhoodExplorer NeighborhoodExplorer; + typedef typename Neighbor::EOT EOT ; /** * Constructor of a moLocalSearch needs a NeighborhooExplorer and a Continuator */ - moLocalSearch(NeighborhoodExplorer& _searchExpl, moContinuator & _continuator, eoEvalFunc& _fullEval) : searchExplorer(_searchExpl), continuator(_continuator), fullEval(_fullEval) { } ; + moLocalSearch(NeighborhoodExplorer& _searchExpl, moContinuator & _cont, eoEvalFunc& _fullEval) : searchExplorer(_searchExpl), cont(&_cont), fullEval(_fullEval) { } ; /** * Run the local search on a solution @@ -70,9 +70,9 @@ public: searchExplorer.initParam(_solution); // initialization of the external continuator (for example the time, or the number of generations) - continuator.init(_solution); + cont->init(_solution); - bool b=continuator(_solution); + bool b= (*cont)(_solution); do { // explore the neighborhood of the solution @@ -88,22 +88,40 @@ public: // update the parameter of the search (for ex. Temperature of the SA) searchExplorer.updateParam(_solution); - b=continuator(_solution); + b=(*cont)(_solution); } while (b && searchExplorer.isContinue(_solution)); searchExplorer.terminate(_solution); - continuator.lastCall(_solution); + cont->lastCall(_solution); return true; }; + /** + * external continuator object + * @return the external continuator + */ + void setContinuator(moContinuator & _cont) { + cont = &_cont ; + } + + /** + * external continuator object + * + * @overload + * @return the external continuator + */ + moContinuator* getContinuator() const { + return cont ; + } + protected: // make the exploration of the neighborhood according to a local search heuristic moNeighborhoodExplorer& searchExplorer ; // external continuator - moContinuator& continuator ; + moContinuator * cont ; //full evaluation function eoEvalFunc& fullEval; diff --git a/trunk/paradiseo-mo/src/continuator/moVectorMonitor.h b/trunk/paradiseo-mo/src/continuator/moVectorMonitor.h new file mode 100644 index 000000000..00e0bc6f1 --- /dev/null +++ b/trunk/paradiseo-mo/src/continuator/moVectorMonitor.h @@ -0,0 +1,135 @@ +/* + + 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 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 moVectorMonitor_h +#define moVectorMonitor_h + +#include +#include + +/** + * To save the values of the same type in a vector + * It is similar to eoFileMonitor + * + */ +class moVectorMonitor : public eoMonitor +{ +public: + + /** + * Default Constructor + * @param _param the parameter of type double to save in the vector + */ + moVectorMonitor(eoValueParam & _param) : doubleParam(&_param), intParam(NULL) + { } + + /** + * Default Constructor + * @param _param the parameter of type unsigned int to save in the vector + */ + moVectorMonitor(eoValueParam & _param) : doubleParam(NULL), intParam(&_param) + { } + + /** + * Pure virtual function to have all the values + * + * @return the vector of values + */ + // template + // const std::vector& getVector() const ; + + /** + * To "print" the value of the parameter in the vector + * + * @return this monitor (sorry I don't why, but it is like this in EO) + */ + eoMonitor& operator()(void) { + if (doubleParam != NULL) + valueVec.push_back(doubleParam->value()); + else + valueVec.push_back((double) intParam->value()); + + return *this ; + } + + /** + * To have all the values + * + * @return the vector of values + */ + const std::vector& getVector() const { + return valueVec ; + } + + /** + * to get the value out. + * @return the string of the value + */ + std::string getValue(unsigned int i) const { + std::ostringstream os; + os << (valueVec[i]) ; + return os.str(); + } + + /** + * clear the vector + */ + void clear() { + valueVec.clear(); + } + + /** + * number of value + * @return size of the vector + */ + unsigned int size() { + return valueVec.size(); + } + + /** + * @return name of the class + */ + virtual std::string className(void) const { + return "moVectorMonitor"; + } + +protected: + eoValueParam * doubleParam ; + eoValueParam * intParam ; + + std::vector valueVec; +}; + + +#endif diff --git a/trunk/paradiseo-mo/src/mo.h b/trunk/paradiseo-mo/src/mo.h index 7cc8d429c..ed732c1f2 100755 --- a/trunk/paradiseo-mo/src/mo.h +++ b/trunk/paradiseo-mo/src/mo.h @@ -71,6 +71,7 @@ #include #include #include +#include #include #include @@ -128,6 +129,8 @@ #include #include +#include + #include #include #include diff --git a/trunk/paradiseo-mo/src/sampling/moSampling.h b/trunk/paradiseo-mo/src/sampling/moSampling.h new file mode 100644 index 000000000..b2ff3cd91 --- /dev/null +++ b/trunk/paradiseo-mo/src/sampling/moSampling.h @@ -0,0 +1,168 @@ +/* + + 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 moSampling_h +#define moSampling_h + +#include +#include +#include +#include +#include +#include +#include + +/** + * To sample the search space: + * A local search is used to sample the search space + * Some statistics are computed at each step of the local search + * + * Can be used to study the fitness landscape + */ +template +class moSampling : public eoF +{ +public: + typedef typename Neighbor::EOT EOT ; + + /** + * Default Constructor + * @param _init initialisation method of the solution + * @param _localSearch local search to sample the search space + * @param _stat statistic to compute during the search + */ + template + moSampling(eoInit & _init, moLocalSearch & _localSearch, moStat & _stat) : init(_init), localSearch(_localSearch), continuator(_localSearch.getContinuator()) + { + checkpoint = new moCheckpoint(*continuator); + add(_stat); + } + + ~moSampling() { + for(unsigned i = 0; i < monitorVec.size(); i++) + delete monitorVec[i]; + + delete checkpoint ; + } + + /** + * Add a statistic + * @param _stat another statistic to compute during the search + */ + template< class ValueType > + void add(moStat & _stat) { + // statVec.push_back(&_stat); + + moVectorMonitor * monitor = new moVectorMonitor(_stat); + monitorVec.push_back(monitor); + + checkpoint->add(_stat); + checkpoint->add(*monitor); + } + + /** + * To sample the search and get the statistics + */ + void operator()(void) { + // clear all statisic vectors + for(unsigned i = 0; i < monitorVec.size(); i++) + monitorVec[i]->clear(); + + // change the checkpoint to compute the statistics + localSearch.setContinuator(*checkpoint); + + // the initial solution + EOT solution; + + // initialisation of the solution + init(solution); + + // compute the sampling + localSearch(solution); + + // set to initial continuator + localSearch.setContinuator(*continuator); + } + + /** + * to export the vector of values into one file + */ + void exportFile(std::string _filename, std::string _delim = " ") { + // create file + ofstream os(_filename.c_str()); + + if (!os) { + string str = "moSampling: Could not open " + _filename; + throw runtime_error(str); + } + + // all vector have the same size + unsigned vecSize = monitorVec[0]->size(); + + for(unsigned int i = 0; i < vecSize; i++) { + std::vector::iterator it = monitorVec.begin(); + + os << (*it)->getValue(i); + + for(++it; it != monitorVec.end(); ++it) + { + os << _delim.c_str() << (*it)->getValue(i); + } + + os << std::endl ; + } + + } + + /** + * @return name of the class + */ + virtual std::string className(void) const { + return "moSampling"; + } + +protected: + eoInit & init; + moLocalSearch & localSearch; + + moContinuator * continuator; + moCheckpoint * checkpoint; + + // std::vector*> statVec; + std::vector monitorVec; + +}; + + +#endif diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt b/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt index 109ff7f40..83a8b073e 100644 --- a/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt +++ b/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt @@ -9,7 +9,9 @@ LINK_DIRECTORIES(${EO_BIN_DIR}/lib) ADD_EXECUTABLE(testRandomWalk testRandomWalk.cpp) ADD_EXECUTABLE(testMetropolisHasting testMetropolisHasting.cpp) ADD_EXECUTABLE(testRandomNeutralWalk testRandomNeutralWalk.cpp) +ADD_EXECUTABLE(sampling sampling.cpp) TARGET_LINK_LIBRARIES(testRandomWalk eoutils ga eo) TARGET_LINK_LIBRARIES(testMetropolisHasting eoutils ga eo) TARGET_LINK_LIBRARIES(testRandomNeutralWalk eoutils ga eo) +TARGET_LINK_LIBRARIES(sampling eoutils ga eo) diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/sampling.cpp b/trunk/paradiseo-mo/tutorial/Lesson6/sampling.cpp new file mode 100644 index 000000000..b0255d5a8 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/sampling.cpp @@ -0,0 +1,214 @@ +//----------------------------------------------------------------------------- +/** sampling.cpp + * + * SV - 03/05/10 + * + */ +//----------------------------------------------------------------------------- + +// standard includes +#define HAVE_SSTREAM + +#include // runtime_error +#include // cout +#include // ostrstream, istrstream +#include +#include + +// the general include for eo +#include +#include + +using namespace std; + +//----------------------------------------------------------------------------- +// fitness function +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +// REPRESENTATION +//----------------------------------------------------------------------------- +typedef eoBit Indi; +typedef moBitNeighbor Neighbor ; // incremental evaluation +typedef moRndWithReplNeighborhood Neighborhood ; + +void main_function(int argc, char **argv) +{ + /* ========================================================= + * + * Parameters + * + * ========================================================= */ + + // First define a parser from the command-line arguments + eoParser parser(argc, argv); + + // For each parameter, define Parameter, read it through the parser, + // and assign the value to the variable + + eoValueParam seedParam(time(0), "seed", "Random number seed", 'S'); + parser.processParam( seedParam ); + unsigned seed = seedParam.value(); + + // description of genotype + eoValueParam vecSizeParam(8, "vecSize", "Genotype size", 'V'); + parser.processParam( vecSizeParam, "Representation" ); + unsigned vecSize = vecSizeParam.value(); + + eoValueParam stepParam(10, "nbStep", "Number of steps of the random walk", 'n'); + parser.processParam( stepParam, "Representation" ); + unsigned nbStep = stepParam.value(); + + // the name of the output file + string str_out = "out.dat"; // default value + eoValueParam outParam(str_out.c_str(), "out", "Output file of the sampling", 'o'); + parser.processParam(outParam, "Persistence" ); + + // the name of the "status" file where all actual parameter values will be saved + string str_status = parser.ProgramName() + ".status"; // default value + eoValueParam statusParam(str_status.c_str(), "status", "Status file"); + parser.processParam( statusParam, "Persistence" ); + + // do the following AFTER ALL PARAMETERS HAVE BEEN PROCESSED + // i.e. in case you need parameters somewhere else, postpone these + if (parser.userNeedsHelp()) { + parser.printHelp(cout); + exit(1); + } + if (statusParam.value() != "") { + ofstream os(statusParam.value().c_str()); + os << parser;// and you can use that file as parameter file + } + + /* ========================================================= + * + * Random seed + * + * ========================================================= */ + + //reproducible random seed: if you don't change SEED above, + // you'll aways get the same result, NOT a random run + rng.reseed(seed); + + + /* ========================================================= + * + * Eval fitness function + * + * ========================================================= */ + + oneMaxEval eval; + + + /* ========================================================= + * + * Initilisation of the solution + * + * ========================================================= */ + + // a Indi random initializer + eoUniformGenerator uGen; + eoInitFixedLength random(vecSize, uGen); + + + /* ========================================================= + * + * evaluation of a neighbor solution + * + * ========================================================= */ + + moFullEvalByModif nhEval(eval); + + //An eval by copy can be used instead of the eval by modif + //moFullEvalByCopy nhEval(eval); + + + /* ========================================================= + * + * the neighborhood of a solution + * + * ========================================================= */ + + Neighborhood neighborhood(vecSize); + + + /* ========================================================= + * + * a neighborhood explorer solution + * + * ========================================================= */ + + moRandomWalkExplorer explorer(neighborhood, nhEval, nbStep); + + + /* ========================================================= + * + * the continuator and the checkpoint + * + * ========================================================= */ + + moTrueContinuator continuator;//always continue + + moFitnessStat fStat; + eoHammingDistance distance; + Indi bestSolution(vecSize, true); + moDistanceStat distStat(distance, bestSolution); + + /* ========================================================= + * + * the local search algorithm + * + * ========================================================= */ + + moLocalSearch localSearch(explorer, continuator, eval); + + /* ========================================================= + * + * The sampling of the search space + * + * ========================================================= */ + + moSampling sampling(random, localSearch, fStat); + + /* ========================================================= + * + * execute the sampling + * + * ========================================================= */ + + sampling(); + + sampling.exportFile(str_out); + +} + +// A main that catches the exceptions + +int main(int argc, char **argv) +{ + try { + main_function(argc, argv); + } + catch (exception& e) { + cout << "Exception: " << e.what() << '\n'; + } + return 1; +}