diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt b/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt new file mode 100644 index 000000000..c65ae30f0 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/CMakeLists.txt @@ -0,0 +1,51 @@ + + +###################################################################################### +### 1) Include the sources +###################################################################################### + +INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src) +INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src/utils) +INCLUDE_DIRECTORIES(${MO_SRC_DIR}/src) +INCLUDE_DIRECTORIES(${TSP_SRC_DIR}) +###################################################################################### + +###################################################################################### +### 2) Specify where CMake can find the libraries +###################################################################################### + +LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${TSP_BIN_DIR}/lib) + +###################################################################################### + + + +###################################################################################### +### 3) Define your target(s): just an executable here +###################################################################################### + +ADD_EXECUTABLE(hybrid_ga hybrid_ga.cpp) + +ADD_DEPENDENCIES(hybrid_ga tsp) + +###################################################################################### + + + +###################################################################################### +### 4) Optionnal: define your target(s)'s version: no effect for windows +###################################################################################### + +SET(ITERATEDLOCALSEARCH_VERSION ${GLOBAL_VERSION}) +SET_TARGET_PROPERTIES(hybrid_ga PROPERTIES VERSION "${HYBRIDGA_VERSION}") +###################################################################################### + + + +###################################################################################### +### 5) Link the librairies for your target(s) +###################################################################################### + +TARGET_LINK_LIBRARIES(hybrid_ga tsp eo eoutils) + +###################################################################################### diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/hybrid_ga.cpp b/trunk/paradiseo-mo/tutorial/Lesson6/hybrid_ga.cpp new file mode 100644 index 000000000..35670ab9b --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/hybrid_ga.cpp @@ -0,0 +1,194 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, LIFL, 2002-2007 +* +* Sébastien Cahon, Thomas Legrand +* +* 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 +* +*/ + +#include +#include +#include + +void manage_configuration_file(eoParser & _parser); + +int +main (int _argc, char* _argv []) +{ + std::string instancePath, crossoverType, selectionType; + unsigned int seed, populationSize, maxIterations, selectedParentNumber; + double crossoverRate, mutationRate, elitismRate, tournamentRate; + + eoParser parser(_argc, _argv); + + manage_configuration_file(parser); + + seed=atoi( (parser.getParamWithLongName("seed")->getValue()).c_str() ); + instancePath=parser.getParamWithLongName("instancePath")->getValue(); + populationSize=atoi( (parser.getParamWithLongName("popSize")->getValue()).c_str() ); + maxIterations=atoi( (parser.getParamWithLongName("maxIter")->getValue()).c_str() ); + crossoverRate=atof( (parser.getParamWithLongName("crossRate")->getValue()).c_str() ); + mutationRate=atof( (parser.getParamWithLongName("mutRate")->getValue()).c_str() ); + selectedParentNumber=atoi( (parser.getParamWithLongName("nbSelPar")->getValue()).c_str() ); + elitismRate=atof( (parser.getParamWithLongName("elitismRate")->getValue()).c_str() ); + tournamentRate=atof( (parser.getParamWithLongName("tournRate")->getValue()).c_str() ); + crossoverType=parser.getParamWithLongName("crossType")->getValue(); + selectionType=parser.getParamWithLongName("selectionType")->getValue(); + + srand (seed); + Graph::load(instancePath.c_str()); + + RouteInit init ; + + RouteEval full_evaluation ; + + eoPop population (populationSize, init) ; + apply (full_evaluation, population) ; + + std :: cout << "[From] " << population.best_element () << std :: endl ; + + eoGenContinue continu (maxIterations) ; + + eoStochTournamentSelect select_one ; + + eoSelectNumber select (select_one, selectedParentNumber) ; + + eoQuadOp *crossover; + + if(crossoverType.compare("Partial")==0) + { + crossover=new PartialMappedXover(); + } + else if (crossoverType.compare("Order")==0) + { + crossover=new OrderXover(); + } + else if (crossoverType.compare("Edge")==0) + { + crossover=new EdgeXover(); + } + else + { + throw std::runtime_error("[tsp.cpp]: the crossover type '"+crossoverType+"' is not correct."); + } + + TwoOptInit two_opt_initializer; + + TwoOptNext two_opt_next_move_generator; + + TwoOptIncrEval two_opt_incremental_evaluation; + + moMoveSelect* two_opt_selection; + + if(selectionType.compare("Best")==0) + { + two_opt_selection= new moBestImprSelect(); + } + else if (selectionType.compare("First")==0) + { + two_opt_selection= new moFirstImprSelect(); + } + else if (selectionType.compare("Random")==0) + { + two_opt_selection= new moRandImprSelect(); + } + else + { + throw std::runtime_error("[hill_climbing.cpp]: the type of selection '"+selectionType+"' is not correct."); + } + + moHC hill_climbing_mutation (two_opt_initializer, two_opt_next_move_generator, two_opt_incremental_evaluation, + *two_opt_selection, full_evaluation); + + eoSGATransform transform (*crossover, crossoverRate, hill_climbing_mutation, mutationRate) ; + + eoElitism merge (elitismRate) ; + + eoStochTournamentTruncate reduce (tournamentRate) ; + + eoEasyEA ea (continu, full_evaluation, select, transform, merge, reduce) ; + + ea (population) ; + + std :: cout << "[To] " << population.best_element () << std :: endl ; + + delete(crossover); + delete(two_opt_selection); + + return EXIT_SUCCESS; +} + +void +manage_configuration_file(eoParser & _parser) +{ + std::ofstream os; + + _parser.createParam(std::string("../examples/tsp/benchs/berlin52.tsp"), "instancePath", "Path to the instance.", + 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)time(0), "seed", "Seed for rand.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)100, "popSize", "Size of the population.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)1000, "maxIter", "Maximum number of iterations.", 0, "Configuration", false); + + _parser.getORcreateParam((double)1.0, "crossRate", "Probability of crossover.", 0, "Configuration", false); + + _parser.getORcreateParam((double)0.01, "mutRate", "Probability of mutation.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)100, "nbSelPar", "Number of selected parents.", 0, "Configuration", false); + + _parser.getORcreateParam((double)1.0, "elitismRate", "Percentage of the best individuals kept.", 0, "Configuration", false); + + _parser.getORcreateParam((double)0.7, "tournRate", "Percentage of the individuals used during the tournament.", + 0, "Configuration", false); + + _parser.getORcreateParam(std::string("Partial"), "crossType", "Crossover to use, it can be 'Partial', 'Order' or 'Edge'.", + 0, "Configuration", false); + + + _parser.getORcreateParam(std::string("Best"), "selectionType", "Type of the selection: 'Best', 'First' or 'Random'.", + 0, "Configuration", false); + + if (_parser.userNeedsHelp()) + { + _parser.printHelp(std::cout); + exit(EXIT_FAILURE); + } + + os.open("current_param"); + if(!os.is_open()) + { + throw std::runtime_error("[tsp.cpp]: the file current_param cannot be created."); + } + os <<_parser; + os.close(); +} diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/ils_param b/trunk/paradiseo-mo/tutorial/Lesson6/ils_param new file mode 100644 index 000000000..91a5284c8 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/ils_param @@ -0,0 +1,9 @@ + +###### General ###### +# --help=0 # -h : Prints this message +# --stopOnUnknownParam=1 # Stop if unkown param entered + +###### Configuration ###### +# --instancePath=../examples/tsp/benchs/berlin52.tsp # Path to the instance. +# --seed=1203080388 # Seed for rand. +# --maxIter=1000 # Maximum number of iterations. diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/iterated_local_search.cpp b/trunk/paradiseo-mo/tutorial/Lesson6/iterated_local_search.cpp new file mode 100644 index 000000000..8d8b42324 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/iterated_local_search.cpp @@ -0,0 +1,117 @@ +/* + + Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2008 + (C) OPAC Team, LIFL, 2002-2008 + + Sébastien Cahon, Jean-Charles Boisson + + 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 +*/ + +#include +#include +#include + +void manage_configuration_file(eoParser & _parser); + +int +main (int _argc, char* _argv []) +{ + std::string instancePath; + unsigned int seed, maxIterations; + + eoParser parser(_argc, _argv); + + manage_configuration_file(parser); + + seed=atoi( (parser.getParamWithLongName("seed")->getValue()).c_str() ); + instancePath=parser.getParamWithLongName("instancePath")->getValue(); + maxIterations=atoi( (parser.getParamWithLongName("maxIter")->getValue()).c_str() ); + + srand(seed); + Graph::load (instancePath.c_str()); + + Route solution; + + RouteInit initializer; + initializer (solution); + + RouteEval full_evaluation; + full_evaluation (solution); + + std :: cout << "[From] " << solution << std :: endl; + + TwoOptInit two_opt_initializer; + + TwoOptNext two_opt_next_move_generator; + + TwoOptIncrEval two_opt_incremental_evaluation; + + moBestImprSelect two_opt_selection; + + moGenSolContinue continu(maxIterations); + + moFitComparator comparator; + + CitySwap perturbation; + + moILS iterated_local_search (two_opt_initializer, two_opt_next_move_generator, two_opt_incremental_evaluation, + two_opt_selection, continu, comparator, perturbation, full_evaluation) ; + iterated_local_search(solution); + + std :: cout << "[To] " << solution << std :: endl; + + return EXIT_SUCCESS; +} + +void +manage_configuration_file(eoParser & _parser) +{ + std::ofstream os; + + _parser.createParam(std::string("../examples/tsp/benchs/berlin52.tsp"), "instancePath", "Path to the instance.", + 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)time(0), "seed", "Seed for rand.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)1000, "maxIter", "Maximum number of iterations.", 0, "Configuration", false); + + if (_parser.userNeedsHelp()) + { + _parser.printHelp(std::cout); + exit(EXIT_FAILURE); + } + + os.open("current_param"); + if(!os.is_open()) + { + throw std::runtime_error("[iterated_local_search.cpp]: the file current_param cannot be created."); + } + os <<_parser; + os.close(); +} diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/param b/trunk/paradiseo-mo/tutorial/Lesson6/param new file mode 100644 index 000000000..f0a3f9217 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/param @@ -0,0 +1,17 @@ + +###### General ###### +# --help=0 # -h : Prints this message +# --stopOnUnknownParam=1 # Stop if unkown param entered + +###### Configuration ###### +# --instancePath=../examples/tsp/benchs/berlin52.tsp # Path to the instance. +# --seed=1224599328 # Seed for rand. +# --popSize=100 # Size of the population. +# --maxIter=1000 # Maximum number of iterations. +# --crossRate=1 # Probability of crossover. +# --mutRate=0.01 # Probability of mutation. +# --nbSelPar=100 # Number of selected parents. +# --elitismRate=1 # Percentage of the best individuals kept. +# --tournRate=0.7 # Percentage of the individuals used during the tournament. +# --crossType=Partial # Crossover to use, it can be 'Partial', 'Order' or 'Edge'. +# --selectionType=Best # Type of the selection: 'Best', 'First' or 'Random'. diff --git a/trunk/paradiseo-mo/tutorial/Lesson6/tsp.cpp b/trunk/paradiseo-mo/tutorial/Lesson6/tsp.cpp new file mode 100644 index 000000000..66c52d2f2 --- /dev/null +++ b/trunk/paradiseo-mo/tutorial/Lesson6/tsp.cpp @@ -0,0 +1,160 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, LIFL, 2002-2007 +* +* Sébastien Cahon, Thomas Legrand +* +* 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 +* +*/ + +#include +#include + +void manage_configuration_file(eoParser & _parser); + +int +main (int _argc, char* _argv []) +{ + std::string instancePath, crossoverType; + unsigned int seed, populationSize, maxIterations, selectedParentNumber; + double crossoverRate, mutationRate, elitismRate, tournamentRate; + + eoParser parser(_argc, _argv); + + manage_configuration_file(parser); + + seed=atoi( (parser.getParamWithLongName("seed")->getValue()).c_str() ); + instancePath=parser.getParamWithLongName("instancePath")->getValue(); + populationSize=atoi( (parser.getParamWithLongName("popSize")->getValue()).c_str() ); + maxIterations=atoi( (parser.getParamWithLongName("maxIter")->getValue()).c_str() ); + crossoverRate=atof( (parser.getParamWithLongName("crossRate")->getValue()).c_str() ); + mutationRate=atof( (parser.getParamWithLongName("mutRate")->getValue()).c_str() ); + selectedParentNumber=atoi( (parser.getParamWithLongName("nbSelPar")->getValue()).c_str() ); + elitismRate=atof( (parser.getParamWithLongName("elitismRate")->getValue()).c_str() ); + tournamentRate=atof( (parser.getParamWithLongName("tournRate")->getValue()).c_str() ); + crossoverType=parser.getParamWithLongName("crossType")->getValue(); + + srand (seed); + Graph::load(instancePath.c_str()); + + RouteInit init ; + + RouteEval full_eval ; + + eoPop pop (populationSize, init) ; + apply (full_eval, pop) ; + + std :: cout << "[From] " << pop.best_element () << std :: endl ; + + eoGenContinue continu (maxIterations) ; + + eoStochTournamentSelect select_one ; + + eoSelectNumber select (select_one, selectedParentNumber) ; + + eoQuadOp *crossover; + + if(crossoverType.compare("Partial")==0) + { + crossover=new PartialMappedXover(); + } + else if (crossoverType.compare("Order")==0) + { + crossover=new OrderXover(); + } + else if (crossoverType.compare("Edge")==0) + { + crossover=new EdgeXover(); + } + else + { + throw std::runtime_error("[tsp.cpp]: the crossover type '"+crossoverType+"' is not correct."); + } + + CitySwap mutation ; + + eoSGATransform transform (*crossover, crossoverRate, mutation, mutationRate) ; + + eoElitism merge (elitismRate) ; + + eoStochTournamentTruncate reduce (tournamentRate) ; + + eoEasyEA ea (continu, full_eval, select, transform, merge, reduce) ; + + ea (pop) ; + + std :: cout << "[To] " << pop.best_element () << std :: endl ; + + delete(crossover); + + return EXIT_SUCCESS; +} + +void +manage_configuration_file(eoParser & _parser) +{ + std::ofstream os; + + _parser.getORcreateParam(std::string("benchs/berlin52.tsp"), "instancePath", "Path to the instance.", + 0, "Configuration", false); + _parser.getORcreateParam((unsigned int)time(0), "seed", "Seed for rand.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)100, "popSize", "Size of the population.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)1000, "maxIter", "Maximum number of iterations.", 0, "Configuration", false); + + _parser.getORcreateParam((double)1.0, "crossRate", "Probability of crossover.", 0, "Configuration", false); + + _parser.getORcreateParam((double)0.01, "mutRate", "Probability of mutation.", 0, "Configuration", false); + + _parser.getORcreateParam((unsigned int)100, "nbSelPar", "Number of selected parents.", 0, "Configuration", false); + + _parser.getORcreateParam((double)1.0, "elitismRate", "Percentage of the best individuals kept.", 0, "Configuration", false); + + _parser.getORcreateParam((double)0.7, "tournRate", "Percentage of the individuals used during the tournament.", + 0, "Configuration", false); + + _parser.getORcreateParam(std::string("Partial"), "crossType", "Crossover to use, it can be 'Partial', 'Order' or 'Edge'.", + 0, "Configuration", false); + + if (_parser.userNeedsHelp()) + { + _parser.printHelp(std::cout); + exit(EXIT_FAILURE); + } + + os.open("current_param"); + if(!os.is_open()) + { + throw std::runtime_error("[tsp.cpp]: the file current_param cannot be created."); + } + os <<_parser; + os.close(); +}