From 4880c449c824cb1bc53f65c9066f5715e7689f57 Mon Sep 17 00:00:00 2001 From: canape Date: Thu, 8 Nov 2007 12:51:46 +0000 Subject: [PATCH] New lessons git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@772 331e1502-861f-0410-8da2-ba01fb791d7f --- trunk/paradiseo-peo/tutorial/CMakeLists.txt | 6 +- .../tutorial/Lesson1/CMakeLists.txt | 30 +- trunk/paradiseo-peo/tutorial/Lesson1/doclsn.h | 498 ------------------ trunk/paradiseo-peo/tutorial/Lesson1/main.cpp | 110 ---- .../paradiseo-peo/tutorial/Lesson1/mainEA.cpp | 125 +++++ .../{Lesson4/main.cpp => Lesson1/mainPSO.cpp} | 150 +++--- .../Lesson1/paradiseo-peo-lsn.doxyfile | 1 + .../{Lesson5/lesson.param => Lesson1/param} | 4 +- .../paradiseo-peo/tutorial/Lesson1/schema.xml | 1 + .../tutorial/Lesson2/CMakeLists.txt | 105 ---- .../Lesson2/ParadisEO-PEO_Lesson2.pdf | Bin 145864 -> 0 bytes .../tutorial/Lesson2/lesson.param | 12 - trunk/paradiseo-peo/tutorial/Lesson2/main.cpp | 143 ----- .../paradiseo-peo/tutorial/Lesson2/mainEA.cpp | 105 ++++ .../Lesson2/paradiseo-peo-lsn.doxyfile | 241 --------- .../{Lesson4/lesson.param => Lesson2/param} | 4 +- .../paradiseo-peo/tutorial/Lesson2/schema.xml | 18 - .../tutorial/Lesson3/CMakeLists.txt | 105 ---- .../Lesson3/ParadisEO-PEO_Lesson3.pdf | Bin 117573 -> 0 bytes trunk/paradiseo-peo/tutorial/Lesson3/main.cpp | 194 ------- .../paradiseo-peo/tutorial/Lesson3/mainEA.cpp | 148 ++++++ .../{Lesson5/main.cpp => Lesson3/mainPSO.cpp} | 144 +++-- .../Lesson3/paradiseo-peo-lsn.doxyfile | 241 --------- .../{Lesson1/lesson.param => Lesson3/param} | 3 - .../paradiseo-peo/tutorial/Lesson3/schema.xml | 19 - .../tutorial/Lesson4/CMakeLists.txt | 98 ---- .../paradiseo-peo/tutorial/Lesson4/mainEA.cpp | 152 ++++++ .../tutorial/Lesson4/mainPSO.cpp | 159 ++++++ ...sn.doxyfile => paradiseo-peo-lsn.doxyfile} | 1 + .../{Lesson3/lesson.param => Lesson4/param} | 3 - .../paradiseo-peo/tutorial/Lesson4/schema.xml | 19 - .../tutorial/Lesson5/CMakeLists.txt | 98 ---- .../paradiseo-peo/tutorial/Lesson5/mainEA.cpp | 43 ++ .../tutorial/Lesson5/mainPSO.cpp | 42 ++ ...sn.doxyfile => paradiseo-peo-lsn.doxyfile} | 1 + trunk/paradiseo-peo/tutorial/Lesson5/param | 9 + .../paradiseo-peo/tutorial/Lesson5/schema.xml | 19 - .../tutorial/Lesson6/CMakeLists.txt | 99 ---- .../tutorial/Lesson6/lesson.param | 12 - trunk/paradiseo-peo/tutorial/Lesson6/main.cpp | 135 ----- .../Lesson6/paradiseo-peo.lsn.doxyfile | 241 --------- .../paradiseo-peo/tutorial/Lesson6/schema.xml | 18 - 42 files changed, 957 insertions(+), 2599 deletions(-) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson1/doclsn.h delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson1/main.cpp create mode 100644 trunk/paradiseo-peo/tutorial/Lesson1/mainEA.cpp rename trunk/paradiseo-peo/tutorial/{Lesson4/main.cpp => Lesson1/mainPSO.cpp} (58%) rename trunk/paradiseo-peo/tutorial/{Lesson5/lesson.param => Lesson1/param} (74%) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/CMakeLists.txt delete mode 100755 trunk/paradiseo-peo/tutorial/Lesson2/ParadisEO-PEO_Lesson2.pdf delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/lesson.param delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/main.cpp create mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/mainEA.cpp delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/paradiseo-peo-lsn.doxyfile rename trunk/paradiseo-peo/tutorial/{Lesson4/lesson.param => Lesson2/param} (74%) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson2/schema.xml delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson3/CMakeLists.txt delete mode 100755 trunk/paradiseo-peo/tutorial/Lesson3/ParadisEO-PEO_Lesson3.pdf delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson3/main.cpp create mode 100644 trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp rename trunk/paradiseo-peo/tutorial/{Lesson5/main.cpp => Lesson3/mainPSO.cpp} (58%) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson3/paradiseo-peo-lsn.doxyfile rename trunk/paradiseo-peo/tutorial/{Lesson1/lesson.param => Lesson3/param} (60%) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson3/schema.xml delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson4/CMakeLists.txt create mode 100644 trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp create mode 100644 trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp rename trunk/paradiseo-peo/tutorial/Lesson4/{paradiseo-peo.lsn.doxyfile => paradiseo-peo-lsn.doxyfile} (99%) rename trunk/paradiseo-peo/tutorial/{Lesson3/lesson.param => Lesson4/param} (60%) delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson4/schema.xml delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson5/CMakeLists.txt create mode 100644 trunk/paradiseo-peo/tutorial/Lesson5/mainEA.cpp create mode 100644 trunk/paradiseo-peo/tutorial/Lesson5/mainPSO.cpp rename trunk/paradiseo-peo/tutorial/Lesson5/{paradiseo-peo.lsn.doxyfile => paradiseo-peo-lsn.doxyfile} (99%) create mode 100644 trunk/paradiseo-peo/tutorial/Lesson5/param delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson5/schema.xml delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson6/CMakeLists.txt delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson6/lesson.param delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson6/main.cpp delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson6/paradiseo-peo.lsn.doxyfile delete mode 100644 trunk/paradiseo-peo/tutorial/Lesson6/schema.xml diff --git a/trunk/paradiseo-peo/tutorial/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/CMakeLists.txt index 75912cafb..0dd4364c9 100644 --- a/trunk/paradiseo-peo/tutorial/CMakeLists.txt +++ b/trunk/paradiseo-peo/tutorial/CMakeLists.txt @@ -3,14 +3,14 @@ ### 1) Definitions (required for tsp target) ###################################################################################### -SET(TSP_SRC_DIR ${ParadisEO-PEO_SOURCE_DIR}/tutorial/examples/tsp) -SET(TSP_BINARY_DIR ${ParadisEO-PEO_BINARY_DIR}/tutorial/examples/tsp) +#SET(TSP_SRC_DIR ${ParadisEO-PEO_SOURCE_DIR}/tutorial/examples/tsp) +#SET(TSP_BINARY_DIR ${ParadisEO-PEO_BINARY_DIR}/tutorial/examples/tsp) ###################################################################################### ###################################################################################### ### 2) Where must cmake go now ? ###################################################################################### -SUBDIRS(examples Lesson1 Lesson2 Lesson3 Lesson4 Lesson5 Lesson6 Walkthrough) +SUBDIRS(Lesson1 Lesson2 Lesson3 Lesson4 Lesson5) ###################################################################################### diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson1/CMakeLists.txt index 8f9cc5115..f142b04d2 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/CMakeLists.txt +++ b/trunk/paradiseo-peo/tutorial/Lesson1/CMakeLists.txt @@ -5,14 +5,14 @@ SET (CMAKE_CXX_COMPILER mpicxx) -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/schema.xml) +ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/schema.xml) ADD_CUSTOM_COMMAND( TARGET install POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/lesson.param + ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/param ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson1) ADD_CUSTOM_COMMAND( TARGET install @@ -21,13 +21,7 @@ ADD_CUSTOM_COMMAND( ARGS -E copy_if_different ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/schema.xml ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson1) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson1/ParadisEO-PEO_Lesson1.pdf - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson1) + ###################################################################################### @@ -35,7 +29,7 @@ ADD_CUSTOM_COMMAND( ### 1) Include the sources ###################################################################################### -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src ${TSP_SRC_DIR}) +INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src) ###################################################################################### @@ -45,12 +39,12 @@ INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_D ###################################################################################### IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib ${TSP_BINARY_DIR}/lib) + LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib) ENDIF(NOT WIN32 OR CYGWIN) # especially for Visual Studio IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${TSP_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) + LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) ENDIF(WIN32 AND NOT CYGWIN) ###################################################################################### @@ -59,8 +53,10 @@ ENDIF(WIN32 AND NOT CYGWIN) ### 3) Define your target(s): just an executable here ###################################################################################### -ADD_EXECUTABLE(tspExample main.cpp) -ADD_DEPENDENCIES(tspExample tsp peo rmc_mpi) +ADD_EXECUTABLE(pso mainPSO.cpp) +ADD_DEPENDENCIES(pso peo rmc_mpi) +ADD_EXECUTABLE(ea mainEA.cpp) +ADD_DEPENDENCIES(ea peo rmc_mpi) ###################################################################################### @@ -69,7 +65,8 @@ ADD_DEPENDENCIES(tspExample tsp peo rmc_mpi) ###################################################################################### SET(LESSON1_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(tspExample PROPERTIES VERSION "${LESSON1_VERSION}") +SET_TARGET_PROPERTIES(pso PROPERTIES VERSION "${LESSON1_VERSION}") +SET_TARGET_PROPERTIES(ea PROPERTIES VERSION "${LESSON1_VERSION}") ###################################################################################### @@ -77,7 +74,8 @@ SET_TARGET_PROPERTIES(tspExample PROPERTIES VERSION "${LESSON1_VERSION}") ### 5) Link the librairies ###################################################################################### -TARGET_LINK_LIBRARIES(tspExample ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(pso ${XML2_LIBS} peo rmc_mpi eo eoutils) +TARGET_LINK_LIBRARIES(ea ${XML2_LIBS} peo rmc_mpi eo eoutils) ###################################################################################### diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/doclsn.h b/trunk/paradiseo-peo/tutorial/Lesson1/doclsn.h deleted file mode 100644 index 544edc583..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson1/doclsn.h +++ /dev/null @@ -1,498 +0,0 @@ -//! \mainpage Creating a simple ParadisEO-PEO Evolutionary Algorithm -//! -//! \section structure Introduction -//! -//! One of the first steps in designing an evolutionary algorithm using the ParadisEO-PEO framework -//! consists in having a clear overview of the implemented algorithm. A brief pseudo-code description is offered -//! bellow - the entire source code for the ParadisEO-PEO evolutionary algorithm is defined in the peoEA.h -//! header file. The main elements to be considered when building an evolutionary algorithm are the transformation -//! operators, i.e. crossover and mutation, the evaluation function, the continuation criterion and the selection -//! and replacement strategy. -//! -//! -//! -//! -//! -//! -//! -//! -//!
do {    
         select( population, offsprings );   // select the offsprings from the current population
         transform( offsprings );   // crossover and mutation operators are applied on the selected offsprings
         evaluate( offsprings );   // evaluation step of the resulting offsprings
         replace( population, offsprings );   // replace the individuals in the current population whith individuals from the offspring population, according to a specified replacement strategy
} while ( eaCheckpointContinue( population ) );   // checkpoint operators are applied on the current population
-//! -//! The peoEA class offers an elementary evolutionary algorithm implementation. The peoEA class has the underlying structure -//! for including parallel evaluation and parallel transformation operators, migration operators etc. Although there is -//! no restriction on using the algorithms provided by the EO framework, no parallelism is provided - the EO implementation is exclusively sequential. -//!
-//! -//! \section requirements Requirements -//! -//! You should have already installed the ParadisEO-PEO package - this requires several additional packages which should be already -//! included in the provided archive. The installation script has to be launched in order to configure and compile all the required -//! components. At the end of the installation phase you should end up having a directory tree resembling the following: -//! -//!
     ... -//!
     paradiseo-mo -//!
     paradiseo-moeo -//!
     paradiseo-peo -//!
            docs -//!
            examples -//!
                   lesson1 -//!
                   lesson2 -//!
                   ... -//!
                   shared -//!
                   ... -//!
            src -//!
            ... -//!
     ... -//!
-//!
-//! -//! The source-code for this tutorial may be found in the paradiseo-peo/examples/lesson1 directory, in the main.cpp file. -//! We strongly encourage creating a backup copy of the file if you consider modifying the source code. For a complete reference on the -//! TSP-related classes and definitions please refer to the files under the paradiseo-peo/examples/shared. After the installation -//! phase you should end up having an tspExample executable file in the paradiseo-peo/examples/lesson1 directory. -//! We will discuss testing and launching aspects later in the tutorial. -//! -//! You are supposed to be familiar with working in C/C++ (with an extensive use of templates) and you should have at least an introductory -//! background in working with the EO framework. -//! -//!
-//! NOTE: All the presented examples have as case study the Traveling Salesman Problem (TSP). All the presented tutorials rely -//! on a common shared source code defining transformation operators, -//! evaluation functions, etc. for the TSP problem. For a complete understanding of the presented tutorials please take your time for -//! consulting and for studying the additional underlying defined classes. -//!

-//! -//! \section problemDef Problem Definition and Representation -//! -//! As we are not directly concerned with the Traveling Salesman Problem, and to some extent out of scope, no in depth details are offered -//! for the TSP. The problem requires finding the shortest path connecting a given set of cities, while visiting each of -//! the specified cities only once and returning to the startpoint city. The problem is known to be NP-complete, i.e. no polynomial -//! time algorithm exists for solving the problem in exact manner. -//! -//! The construction of a ParadisEO-PEO evolutionary algorithm requires following a few simple steps - please take your time to study the signature -//! of the peoEA constructor: -//! -//! -//! -//! -//!
-//!      peoEA( -//!
            eoContinue< EOT >& __cont, -//!
            peoPopEval< EOT >& __pop_eval, -//!
            eoSelect< EOT >& __select, -//!
            peoTransform< EOT >& __trans, -//!
            eoReplacement< EOT >& __replace -//!
     ); -//!
-//! \image html peoEA.png -//!
-//! -//! A few remarks have to be made: while most of the parameters are passed as EO-specific types, the evaluation and the transformation objects have to be -//! derived from the ParadisEO-PEO peoPopEval and peoTransform classes. Derived classes like the peoParaPopEval and peoParaSGATransform classes allow -//! for parallel evaluation of the population and parallel transformation operators, respectively. Wrappers are provided thus allowing to make use -//! of the EO classes. -//! -//! In the followings, the main required elements for building an evolutionary algorithm are enumerated. For complete details regarding the -//! implementation aspects of each of the components, please refer to the common shared source code. -//! Each of the bellow referred header files may be found in the pardiseo-peo/examples/shared directory. -//! -//!
    -//!
  1. representation - the first decision to be taken concerns the representation of the individuals. You may create your -//! own representation or you may use/derive one of the predefined classes of the EO framework.
    -//! -//! For our case study, the TSP, each city is defined as a Node in the node.h header file - in fact an unsigned value defined -//! as typedef unsigned Node. Moreover, each individual (of the evolutionary algorithm) is represented as a Route object, a vector of Node objects, in -//! the route.h header file - typedef eoVector< int, Node > Route. The definition of the Route object implies two -//! elements: (1) a route is a vector of nodes, and (2) the fitness is an integer value (please refer to the eoVector -//! definition in the EO framework). -//! -//! In addition you should also take a look in the route_init.h header file which includes the RouteInit class, defined for -//! initializing in random manner Route objects. -//!
  2. -//!
  3. evaluation function - having a representation model, an evaluation object has to be defined, implementing a specific -//! fitness function. The designed class has to be derived (directly or indirectly) from the peoPopEval class - you have the choice of -//! using peoSeqPopEval or peoParaPopEval for sequential and parallel evaluation, respectively. These classes act as wrappers requiring -//! the specification of an EO evaluation object derived from the eoEvalFunc class - please refer to their respective documentation.
    -//! -//! The fitness function for our TSP case study is implemented in the route_eval.h header file. The class is derived from the eoEvalFunc -//! EO class, being defined as class RouteEval : public eoEvalFunc< Route >. -//!
  4. -//!
  5. transformation operators - in order to assure the evolution of the initial population, transformation operators have to be defined. -//! Depending on your problem, you may specify quadruple operators (two input individuals, two output resulting individuals), i.e. crossover operators, -//! binary operators (one input individual and one output resulting individual), i.e. mutation operators, or combination of both types. As for the -//! evaluation function, the signature of the peoEA constructor requires specifying a peoTransform derived object as transformation operator. -//! -//! The transform operators, crossover and mutation, for the herein presented example are defined in the order_xover.h and the city_swap.h -//! header files, respectively. -//!
  6. -//!
  7. continuation criterion - the evolutionary algorithm evolves in an iterative manner; a continuation criterion has to be specified. -//! One of the most common and simplest options considers a maximum number of generations. It is your choice whether to use -//! a predefined EO class for specifying the continuation criterion or using a custom defined class. In the later case you have to -//! make sure that your class derives the eoContinue class.
    -//!
  8. -//!
  9. selection strategy - at each iteration a set of individuals are selected for applying the transform operators, in order -//! to obtain the offspring population. As the specified parameter has to be derived from the eoSelect it is your option of whether using -//! the EO provided selection strategies or implementing your own, as long as it inherits the eoSelect class. -//! -//! For our example we chose to use the eoRankingSelect strategy, provided in the EO framework. -//!
  10. -//!
  11. replacement strategy - once the offspring population is obtained, the offsprings have to be integrated back into the initial -//! population, according to a given strategy. For custom defined strategies you have to inherit the eoReplacement EO class. We chose to -//! use an eoPlusReplacement as strategy (please review the EO documentation for details on the different strategies available). -//!
  12. -//!
-//!
-//! -//! \section example A simple example for constructing a peoEA object -//! -//! The source code for this example may be found in the main.cpp file, under the paradiseo-peo/examples/lesson1 directory. Please make sure you -//! At this point you have two options: (a) you can just follow the example without touching the main.cpp or, (b) you can start from scratch, -//! following the presented steps, in which case you are required make a backup copy of the main.cpp file and replace the original file with an -//! empty one. -//! -//!
    -//!
  1. include the necessary header files - as we will be using Route objects, we have to include the files -//! which define the Route type, the initializing functor and the evaluation functions. Furthermore, in order to make use of -//! transform operators, we require having the headers which define the crossover and the mutation operators. -//! All these files may be found in the shared directory that we mentioned in the beginning. At this point you -//! should have something like the following:
    -//! -//!
    -//!		##include "route.h"
    -//!		##include "route_init.h"
    -//!		##include "route_eval.h"
    -//!		
    -//!		##include "order_xover.h"
    -//!		##include "city_swap.h"
    -//!		
    -//! In addition we require having the paradiseo header file, in order to use the ParadisEO-PEO features, and a header specific -//! for our problem, dealing with processing command-line parameters - the param.h header file. The complete picture at this point -//! with all the required header files is as follows:
    -//! -//!
    -//!		##include "route.h"
    -//!		##include "route_init.h"
    -//!		##include "route_eval.h"
    -//!		
    -//!		##include "order_xover.h"
    -//!		##include "city_swap.h"
    -//!
    -//!		##include "param.h"
    -//!
    -//!		##include <paradiseo>
    -//!		
    -//! NOTE: the paradiseo header file is in fact a "super-header" - it includes all the esential ParadisEO-PEO header files. -//! It is at at your choice if you want use the paradiseo header file or to explicitly include different header files, -//! like the peoEA.h header file, for example. -//! -//!
  2. -//!
  3. define problem specific parameters - in our case we have to specify how many individuals we want to have in our population, the number -//! of generations for the evolutionary algorithm to iterate and the probabilities associated with the crossover and mutation operators.
    -//! -//!
    -//!		##include "route.h"
    -//!		##include "route_init.h"
    -//!		##include "route_eval.h"
    -//!		
    -//!		##include "order_xover.h"
    -//!		##include "city_swap.h"
    -//!
    -//!		##include "param.h"
    -//!
    -//!		##include <paradiseo>
    -//!
    -//!
    -//!		##define POP_SIZE 10
    -//!		##define NUM_GEN 100
    -//!		##define CROSS_RATE 1.0
    -//!		##define MUT_RATE 0.01
    -//!		
    -//!
  4. -//!
  5. construct the skeleton of a simple ParadisEO-PEO program - the main function including the code for initializing the ParadisEO-PEO -//! environment, for loading problem data and for shutting down the ParadisEO-PEO environment. From this point on we will make -//! abstraction of the previous part referring only to the main function.
    -//! -//!
    -//!		...
    -//!		
    -//!		int main( int __argc, char** __argv ) {
    -//!		
    -//!			// initializing the ParadisEO-PEO environment
    -//!			peo :: init( __argc, __argv );
    -//!		
    -//!			// processing the command line specified parameters
    -//!			loadParameters( __argc, __argv );
    -//!		
    -//!
    -//!			// EVOLUTIONARY ALGORITHM TO BE DEFINED
    -//!
    -//!		
    -//!			peo :: run( );
    -//!			peo :: finalize( );
    -//!			// shutting down the ParadisEO-PEO environment
    -//!		
    -//!			return 0;
    -//!		}
    -//!		
    -//!
  6. -//!
  7. initialization functors, evaluation function and transform operators - basically we only need to create instances for each of the -//! enumerated objects, to be passed later as parameters for higher-level components of the evolutionary algorithm.
    -//! -//!
    -//!		RouteInit route_init;	// random init object - creates random Route objects
    -//!		RouteEval full_eval;	// evaluator object - offers a fitness value for a specified Route object
    -//!
    -//!		OrderXover crossover;	// crossover operator - creates two offsprings out of two specified parents
    -//!		CitySwap mutation;	// mutation operator - randomly mutates one gene for a specified individual
    -//!		
    -//!
  8. -//!
  9. construct the components of the evolutionary algorithm - each of the components that has to be passed as parameter to the -//! peoEA constructor has to be defined along with the associated parameters. Except for the requirement to provide the -//! appropriate objects (for example, a peoPopEval derived object must be specified for the evaluation functor), there is no strict -//! path to follow. It is your option what elements to mix, depending on your problem - we aimed for simplicity in our example. -//! -//!
      -//!
    • an initial population has to be specified; the constructor accepts the specification of an initializing object. Further, -//! an evaluation object is required - the peoEA constructor requires a peoPopEval derived class. -//!
    • -//!
    -//!
    -//!		eoPop< Route > population( POP_SIZE, route_init );	// initial population for the algorithm having POP_SIZE individuals
    -//!		peoSeqPopEval< Route > eaPopEval( full_eval );		// evaluator object - to be applied at each iteration on the entire population
    -//!		
    -//!
      -//!
    • the evolutionary algorithm continues to iterate till a continuation criterion is not met. For our case we consider -//! a fixed number of generations. The continuation criterion has to be specified as a checkpoint object, thus requiring -//! the creation of an eoCheckPoint object in addition. -//!
    • -//!
    -//!
    -//!		eoGenContinue< Route > eaCont( NUM_GEN );		// continuation criterion - the algorithm will iterate for NUM_GEN generations
    -//!		eoCheckPoint< Route > eaCheckpointContinue( eaCont );	// checkpoint object - verify at each iteration if the continuation criterion is met
    -//!		
    -//!
      -//!
    • selection strategy - we are required to specify a selection strategy for extracting individuals out of the parent -//! population; in addition the number of individuals to be selected has to be specified. -//!
    • -//!
    -//!
    -//!		eoRankingSelect< Route > selectionStrategy;		// selection strategy - applied at each iteration for selecting parent individuals
    -//!		eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration
    -//!		
    -//!
      -//!
    • transformation operators - we have to integrate the crossover and the mutation functors into an object which may be passed -//! as a parameter when creating the peoEA object. The constructor of peoEA requires a peoTransform derived -//! object. Associated probabilities have to be specified also. -//!
    • -//!
    -//!
    -//!		// transform operator - includes the crossover and the mutation operators with a specified associated rate
    -//!		eoSGATransform< Route > transform( crossover, CROSS_RATE, mutation, MUT_RATE );
    -//!		peoSeqTransform< Route > eaTransform( transform );	// ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object
    -//!		
    -//!
      -//!
    • replacement strategy - required for defining the way for integrating the resulting offsprings into the initial population. -//! At your option whether you would like to chose one of the predefined replacement strategies that come with the EO framework -//! or if you want to define your own. -//!
    • -//!
    -//!
    -//!		eoPlusReplacement< Route > eaReplace;			// replacement strategy - for replacing the initial population with offspring individuals
    -//!		
    -//!
  10. -//!
  11. evolutionary algorithm - having defined all the previous components, we are ready for instanciating an evolutionary algorithm. -//! In the end we have to associate a population with the algorithm, which will serve as the initial population, to be iteratively evolved. -//! -//!
    -//!		peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace );
    -//!
    -//!		eaAlg( population );	// specifying the initial population for the algorithm, to be iteratively evolved
    -//!		
    -//!
  12. -//!
-//! -//! If you have not missed any of the enumerated points, your program should be like the following: -//! -//!
-//! ##include "route.h"
-//! ##include "route_init.h"
-//! ##include "route_eval.h"
-//! 
-//! ##include "order_xover.h"
-//! ##include "city_swap.h"
-//! 
-//! ##include "param.h"
-//! 
-//! ##include 
-//! 
-//! 
-//! ##define POP_SIZE 10
-//! ##define NUM_GEN 100
-//! ##define CROSS_RATE 1.0
-//! ##define MUT_RATE 0.01
-//! 
-//! 
-//! int main( int __argc, char** __argv ) {
-//! 
-//! 	// initializing the ParadisEO-PEO environment
-//! 	peo :: init( __argc, __argv );
-//! 
-//! 
-//! 	// processing the command line specified parameters
-//! 	loadParameters( __argc, __argv );
-//! 
-//! 
-//! 	// init, eval operators, EA operators -------------------------------------------------------------------------------------------------------------
-//! 
-//! 	RouteInit route_init;	// random init object - creates random Route objects
-//! 	RouteEval full_eval;	// evaluator object - offers a fitness value for a specified Route object
-//! 
-//! 	OrderXover crossover;	// crossover operator - creates two offsprings out of two specified parents
-//! 	CitySwap mutation;	// mutation operator - randomly mutates one gene for a specified individual
-//! 	// ------------------------------------------------------------------------------------------------------------------------------------------------
-//! 
-//! 
-//! 	// evolutionary algorithm components --------------------------------------------------------------------------------------------------------------
-//! 
-//! 	eoPop< Route > population( POP_SIZE, route_init );	// initial population for the algorithm having POP_SIZE individuals
-//! 	peoSeqPopEval< Route > eaPopEval( full_eval );		// evaluator object - to be applied at each iteration on the entire population
-//! 
-//! 	eoGenContinue< Route > eaCont( NUM_GEN );		// continuation criterion - the algorithm will iterate for NUM_GEN generations
-//! 	eoCheckPoint< Route > eaCheckpointContinue( eaCont );	// checkpoint object - verify at each iteration if the continuation criterion is met
-//! 
-//! 	eoRankingSelect< Route > selectionStrategy;		// selection strategy - applied at each iteration for selecting parent individuals
-//! 	eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration
-//! 
-//! 	// transform operator - includes the crossover and the mutation operators with a specified associated rate
-//! 	eoSGATransform< Route > transform( crossover, CROSS_RATE, mutation, MUT_RATE );
-//! 	peoSeqTransform< Route > eaTransform( transform );	// ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object
-//! 
-//! 	eoPlusReplacement< Route > eaReplace;			// replacement strategy - for replacing the initial population with offspring individuals
-//! 	// ------------------------------------------------------------------------------------------------------------------------------------------------
-//! 
-//! 
-//! 	// ParadisEO-PEO evolutionary algorithm -----------------------------------------------------------------------------------------------------------
-//! 
-//! 	peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace );
-//! 	
-//! 	eaAlg( population );	// specifying the initial population for the algorithm, to be iteratively evolved
-//! 	// ------------------------------------------------------------------------------------------------------------------------------------------------
-//! 
-//! 
-//! 	peo :: run( );
-//! 	peo :: finalize( );
-//! 	// shutting down the ParadisEO-PEO environment
-//! 
-//! 	return 0;
-//! }
-//! 
-//! -//! -//! \section testing Compilation and Execution -//! -//! First, please make sure that you followed all the previous steps in defining the evolutionary algorithm. Your file should be called main.cpp - please -//! make sure you do not rename the file (we will be using a pre-built makefile, thus you are required not to change the file names). Please make sure you -//! are in the paradiseo-peo/examples/lesson1 directory - you should open a console and you should change your current directory to the one of Lesson1. -//! -//! Compilation: being in the paradiseo-peo/examples/lesson1 directory, you have to type make. As a result the main.cpp file -//! will be compiled and you should obtain an executable file called tspExample. If you have errors, please verify any of the followings: -//! -//! -//! -//! NOTE: in order to successfully compile your program you should already have installed an MPI distribution in your system. -//! -//! Execution: the execution of a ParadisEO-PEO program requires having already created an environment for launching MPI programs. For MPICH-2, -//! for example, this requires starting a ring of daemons. The implementation that we provided as an example is sequential and includes no parallelism - we -//! will see in the end how to include also parallelism. Executing a parallel program requires specifying a mapping of resources, in order to assing different -//! algorithms to different machines, define worker machines etc. This mapping is defined by an XML file called schema.xml, which, for our case, has -//! the following structure: -//! -//!
-//!	
-//!	
-//!	
-//!		
-//!			
-//!			
-//!			
-//!			
-//!			1
-//!			
-//!			
-//!			
-//!			
-//!			
-//!			
-//!		
-//!	
-//! 
-//! -//! Not going into details, the XML file presented above describes a mapping which includes four nodes, the first one having the role of scheduler, -//! the second one being the node on which the evolutionary algorithm is actually executed and the third and the fourth ones being slave nodes. Overall -//! the mapping says that we will be launching four processes, out of which only one will be executing the evolutionary algorithm. The other node entries -//! in the XML file have no real functionality as we have no parallelism in our program - the entries were created for you convenience, in order to provide -//! a smooth transition to creating a parallel program. -//! -//! Launching the program may be different, depending on your MPI distribution - for MPICH-2, in a console, in the paradiseo-peo/examples/lesson1 -//! directory you have to type the following command: -//! -//! mpiexec -n 4 ./tspExample @lesson.param -//! -//! NOTE: the "-n 4" indicates the number of processes to be launched. The last argument, "@lesson.param", indicates a file which specifies different -//! application specific parameters (the mapping file to be used, for example, whether to use logging or not, etc). -//! -//! The result of your execution should be similar to the following: -//!
-//! 	Loading '../data/eil101.tsp'.
-//! 	NAME: eil101.
-//! 	COMMENT: 101-city problem (Christofides/Eilon).
-//! 	TYPE: TSP.
-//! 	DIMENSION: 101.
-//! 	EDGE_WEIGHT_TYPE: EUC_2D.
-//! 	Loading '../data/eil101.tsp'.
-//! 	NAME: eil101.
-//! 	COMMENT: 101-city problem (Christofides/Eilon).
-//! 	EOF.
-//! 	TYPE: TSP.
-//! 	DIMENSION: 101.
-//! 	EDGE_WEIGHT_TYPE: EUC_2D.
-//! 	EOF.
-//! 	Loading '../data/eil101.tsp'.
-//! 	NAME: eil101.
-//! 	COMMENT: 101-city problem (Christofides/Eilon).
-//! 	TYPE: TSP.
-//! 	DIMENSION: 101.
-//! 	EDGE_WEIGHT_TYPE: EUC_2D.
-//! 	EOF.
-//! 	Loading '../data/eil101.tsp'.
-//! 	NAME: eil101.
-//! 	COMMENT: 101-city problem (Christofides/Eilon).
-//! 	TYPE: TSP.
-//! 	DIMENSION: 101.
-//! 	EDGE_WEIGHT_TYPE: EUC_2D.
-//! 	EOF.
-//! 	STOP in eoGenContinue: Reached maximum number of generations [100/100]
-//!	
-//! -//! -//! \section paraIntro Introducing parallelism -//! -//! Creating parallel programs with ParadisEO-PEO represents an easy task once you have the basic structure for your program. For experimentation, -//! in the main.cpp file, replace the line -//!
-//!	peoSeqPopEval< Route > eaPopEval( full_eval );
-//! 
-//! with -//!
-//!	peoParaPopEval< Route > eaPopEval( full_eval );
-//! 
-//! The second line only tells that we would like to evaluate individuals in parallel - this is very interesting if you have a time consuming fitness -//! evaluation function. If you take another look on the schema.xml XML file you will see the last two nodes being marked as slaves (the "num_workers" -//! attribute - these nodes will be used for computing the fitness of the individuals. -//! -//! At this point you only have to recompile your program and to launch it again - as we are not using a time consuming fitness fitness function, the -//! effects might not be visible - you may increase the number of individuals to experiment. diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/main.cpp b/trunk/paradiseo-peo/tutorial/Lesson1/main.cpp deleted file mode 100644 index 7478eb329..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson1/main.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* -* -* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 -* -* Sebastien Cahon, Alexandru-Adrian Tantar -* -* 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 "route.h" -#include "route_init.h" -#include "route_eval.h" - -#include "order_xover.h" -#include "city_swap.h" - -#include "param.h" - -#include - - -#define POP_SIZE 10 -#define NUM_GEN 100 -#define CROSS_RATE 1.0 -#define MUT_RATE 0.01 - - -int main( int __argc, char** __argv ) { - - // initializing the ParadisEO-PEO environment - peo :: init( __argc, __argv ); - - - // processing the command line specified parameters - loadParameters( __argc, __argv ); - - - // init, eval operators, EA operators ------------------------------------------------------------------------------------------------------------- - - RouteInit route_init; // random init object - creates random Route objects - RouteEval full_eval; // evaluator object - offers a fitness value for a specified Route object - - OrderXover crossover; // crossover operator - creates two offsprings out of two specified parents - CitySwap mutation; // mutation operator - randomly mutates one gene for a specified individual - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // evolutionary algorithm components -------------------------------------------------------------------------------------------------------------- - - eoPop< Route > population( POP_SIZE, route_init ); // initial population for the algorithm having POP_SIZE individuals - peoSeqPopEval< Route > eaPopEval( full_eval ); // evaluator object - to be applied at each iteration on the entire population - - eoGenContinue< Route > eaCont( NUM_GEN ); // continuation criterion - the algorithm will iterate for NUM_GEN generations - eoCheckPoint< Route > eaCheckpointContinue( eaCont ); // checkpoint object - verify at each iteration if the continuation criterion is met - - eoRankingSelect< Route > selectionStrategy; // selection strategy - applied at each iteration for selecting parent individuals - eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration - - // transform operator - includes the crossover and the mutation operators with a specified associated rate - eoSGATransform< Route > transform( crossover, CROSS_RATE, mutation, MUT_RATE ); - peoSeqTransform< Route > eaTransform( transform ); // ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object - - eoPlusReplacement< Route > eaReplace; // replacement strategy - for replacing the initial population with offspring individuals - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // ParadisEO-PEO evolutionary algorithm ----------------------------------------------------------------------------------------------------------- - - peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); - - eaAlg( population ); // specifying the initial population for the algorithm, to be iteratively evolved - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - peo :: run( ); - peo :: finalize( ); - // shutting down the ParadisEO-PEO environment - - if(getNodeRank()==1) - std::cout<<"\n\nPopulation :\n"< +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +typedef eoReal Indi; + +//Evaluation function + +double f (const Indi & _indi) +{ + // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 + // => optimal : f* = 0 , with x* =(1,1) + + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); +} + +int main (int __argc, char *__argv[]) +{ + + +// Initialization of the parallel environment : thanks this instruction, ParadisEO-PEO can initialize himself + peo :: init( __argc, __argv ); + +//Parameters + + const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function + const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population + const unsigned int MAX_GEN = 300; // Define the number of maximal generation + const double INIT_POSITION_MIN = -2.0; // For initialize x + const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 + const float CROSS_RATE = 0.8; // Crossover rate + const double EPSILON = 0.01; // Range for real uniform mutation + const float MUT_RATE = 0.3; // Mutation rate + rng.reseed (time(0)); + +// Stopping + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + + + /* In this lesson, you should define a peoEvalFunc witch will allow to initialize : + * + * - peoSeqPopEval : using to the sequential evaluation + * + * OR + * + * - peoParaPopEval : using to the parallel evaluation + * + */ + +// For a parallel evaluation + peoEvalFunc plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + + +// Initialization + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + +// Selection + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + +// Transformation + eoSegmentCrossover crossover; // Crossover + eoUniformMutation mutation(EPSILON); // Mutation + eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + peoSeqTransform eaTransform(transform); + +// Replacement + eoPlusReplacement replace; + +// Creation of the population + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + +//Parallel algorithm + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + Algo(pop); + + peo :: run(); + peo :: finalize(); + if(getNodeRank()==1) + std::cout << "Final population :\n" << pop << std::endl; +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/main.cpp b/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp similarity index 58% rename from trunk/paradiseo-peo/tutorial/Lesson4/main.cpp rename to trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp index 75f076531..6ebeba39d 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson4/main.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson1/mainPSO.cpp @@ -1,7 +1,7 @@ /* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 +* (C) OPAC Team, INRIA, 2007 * * Clive Canape * @@ -31,98 +31,112 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* clive.canape@inria.fr +* */ -//For define a parallel PSO or a sequential PSO -#define PARA - #include typedef eoRealParticle < double >Indi; + //Evaluation function double f (const Indi & _indi) { - //Levy function f* = -21.502356 x*=(1,1,1,-9.752356 ) for vector size = 4 + // Rosenbrock function f(x) = 100*(x[1]-x[0]^2)^2+(1-x[0])^2 + // => optimal : f* = 0 , with x* =(1,1) - const double PI = 4.0 * atan(1.0); - double sum=0.; - for (unsigned i = 0; i < _indi.size()-1; i++) - sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); - sum+=pow(sin(3*PI*_indi[0]),2); - sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); return (-sum); } int main (int __argc, char *__argv[]) { -#ifdef PARA -//Initialization - peo :: init( __argc, __argv ); -#endif + +// Initialization of the parallel environment : thanks this instruction, ParadisEO-PEO can initialize himself + peo :: init( __argc, __argv ); + //Parameters - const unsigned int VEC_SIZE = 4; - const unsigned int POP_SIZE = 20; - const unsigned int NEIGHBORHOOD_SIZE= 5; - const unsigned int MAX_GEN = 500; - const double INIT_POSITION_MIN = -10.0; - const double INIT_POSITION_MAX = 1.0; - const double INIT_VELOCITY_MIN = -1; - const double INIT_VELOCITY_MAX = 1; - const double C1 = 0.5; - const double C2 = 2; + + const unsigned int VEC_SIZE = 2; // Don't change this parameter when you are resolving the Rosenbrock function + + const unsigned int POP_SIZE = 20; // As with a sequential algorithm, you change the size of the population + + const unsigned int NEIGHBORHOOD_SIZE= 6; // This parameter define the neighborhoods in the PSO's topology + + const unsigned int MAX_GEN = 150; // Define the number of maximal generation + + const double INIT_POSITION_MIN = -2.0; // For initialize x + const double INIT_POSITION_MAX = 2.0; // In the case of the Rosenbrock function : -2 < x[i] < 2 + + const double INIT_VELOCITY_MIN = -1.; // For initialize PSO's velocity + const double INIT_VELOCITY_MAX = 1.; // ie Lesson 6 of ParadisEO-EO + + const double C1 = 0.5; // For calculate the velocity + const double C2 = 2.; // ie Lesson 6 of ParadisEO-EO rng.reseed (time(0)); -#ifndef PARA - eoEvalFuncPtr plainEval(f); - eoEvalFuncCounter < Indi > eval (plainEval); -#else - peoEvalFuncPSO plainEval(f); - eoEvalFuncCounter < Indi > evalSeq (plainEval); - peoParaPopEval< Indi > eval(plainEval); -#endif - eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); -//Velocity - eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); -//Initializing the best - eoFirstIsBestInit < Indi > localInit; -//Flight - eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoPop < Indi > pop; - pop.append (POP_SIZE, random); -#ifndef PARA - apply(eval, pop); -#else -//The first evaluation must be sequential - apply(evalSeq, pop); -#endif - apply < Indi > (veloRandom, pop); - apply < Indi > (localInit, pop); -//Topology - eoLinearTopology topology(NEIGHBORHOOD_SIZE); - topology.setup(pop); - eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); - eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + +// Stopping eoGenContinue < Indi > genContPara (MAX_GEN); eoCombinedContinue continuatorPara (genContPara); eoCheckPoint checkpoint(continuatorPara); -#ifndef PARA -//Sequential algorithm - eoSyncEasyPSO < Indi > psa(checkpoint, eval, velocity, flight); - psa (pop); - pop.sort (); - std::cout << "Final population :\n" << pop << std::endl; -#else + + + + + /* In this lesson, you should define a peoEvalFuncPSO witch will allow to initialize : + * + * - peoSeqPopEval : using to the sequential evaluation + * + * OR + * + * - peoParaPopEval : using to the parallel evaluation + * + */ + +// For a parallel evaluation + peoEvalFuncPSO plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + + + + + +// Initialization + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + +// Velocity (ie Lesson 6 of ParadisEO-PEO) + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + +// Initializing the best (ie Lesson 6 of ParadisEO-PEO) + eoFirstIsBestInit < Indi > localInit; + +// Flight (ie Lesson 6 of ParadisEO-PEO) + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + +// Creation of the population + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + +// Initialization + peoInitializer init(eval,veloRandom,localInit,pop); + +// Topology (ie Lesson 6 of ParadisEO-PEO) + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + //Parallel algorithm - peoPSO < Indi > psa(checkpoint, eval, velocity, flight); + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); psa(pop); peo :: run(); peo :: finalize(); if(getNodeRank()==1) std::cout << "Final population :\n" << pop << std::endl; -#endif } diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/paradiseo-peo-lsn.doxyfile b/trunk/paradiseo-peo/tutorial/Lesson1/paradiseo-peo-lsn.doxyfile index b7ecda59e..dcbaf631a 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/paradiseo-peo-lsn.doxyfile +++ b/trunk/paradiseo-peo/tutorial/Lesson1/paradiseo-peo-lsn.doxyfile @@ -239,3 +239,4 @@ DOT_CLEANUP = YES # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = YES + diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/lesson.param b/trunk/paradiseo-peo/tutorial/Lesson1/param similarity index 74% rename from trunk/paradiseo-peo/tutorial/Lesson5/lesson.param rename to trunk/paradiseo-peo/tutorial/Lesson1/param index 6ba37c292..730f547e1 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson5/lesson.param +++ b/trunk/paradiseo-peo/tutorial/Lesson1/param @@ -4,4 +4,6 @@ ## deployment schema ---schema=schema.xml \ No newline at end of file +--schema=schema.xml + + diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/schema.xml b/trunk/paradiseo-peo/tutorial/Lesson1/schema.xml index 3edea1488..f34107574 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/schema.xml +++ b/trunk/paradiseo-peo/tutorial/Lesson1/schema.xml @@ -13,6 +13,7 @@ + diff --git a/trunk/paradiseo-peo/tutorial/Lesson2/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson2/CMakeLists.txt deleted file mode 100644 index 34d510325..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson2/CMakeLists.txt +++ /dev/null @@ -1,105 +0,0 @@ - -###################################################################################### -### 0) Set the compiler and define targets to easily run the lessons -###################################################################################### - -SET (CMAKE_CXX_COMPILER mpicxx) - -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson2/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson2/schema.xml) - -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson2/lesson.param - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson2) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson2/schema.xml - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson2) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson2/ParadisEO-PEO_Lesson2.pdf - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson2) -###################################################################################### - - -###################################################################################### -### 1) Include the sources -###################################################################################### - -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src ${TSP_SRC_DIR}) - -###################################################################################### - - -###################################################################################### -### 2) Specify where CMake can find the libraries -###################################################################################### - -IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib ${TSP_BINARY_DIR}/lib) -ENDIF(NOT WIN32 OR CYGWIN) - -# especially for Visual Studio -IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${TSP_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) -ENDIF(WIN32 AND NOT CYGWIN) -###################################################################################### - - -###################################################################################### -### 3) Define your target(s): just an executable here -###################################################################################### - -ADD_EXECUTABLE(tspExample main.cpp) -ADD_DEPENDENCIES(tspExample tsp peo rmc_mpi) -###################################################################################### - - -###################################################################################### -### 4) Optionnal: define properties -###################################################################################### - -SET(LESSON2_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(tspExample PROPERTIES VERSION "${LESSON2_VERSION}") -###################################################################################### - - -###################################################################################### -### 5) Link the librairies -###################################################################################### - -TARGET_LINK_LIBRARIES(tspExample ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) - -###################################################################################### - - -###################################################################################### -### 6) Windows advanced config - especially for Microsoft Visual Studio 8 -###################################################################################### - - IF(CMAKE_CXX_COMPILER MATCHES cl) - IF(NOT WITH_SHARED_LIBS) - IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy") - SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") - - ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - ENDIF(NOT WITH_SHARED_LIBS) - ENDIF(CMAKE_CXX_COMPILER MATCHES cl) -###################################################################################### - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson2/ParadisEO-PEO_Lesson2.pdf b/trunk/paradiseo-peo/tutorial/Lesson2/ParadisEO-PEO_Lesson2.pdf deleted file mode 100755 index d99d43f1ae2b235f4bf85e0b3fcfb5d3cf67aec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145864 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 -* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 -* -* Sebastien Cahon, Alexandru-Adrian Tantar -* -* 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 "route.h" -#include "route_init.h" -#include "route_eval.h" - -#include "order_xover.h" -#include "city_swap.h" - -#include "param.h" - -#include "merge_route_eval.h" -#include "part_route_eval.h" - - -#include - - -#define POP_SIZE 10 -#define NUM_GEN 100 -#define CROSS_RATE 1.0 -#define MUT_RATE 0.01 - -#define NUM_PART_EVALS 2 - - -// by default, parallel evaluation of the population is performed; -// for parallel fitness evaluation, uncomment the following line - -#define PARALLEL_FIT_EVALUATION - - -int main( int __argc, char** __argv ) { - - // initializing the ParadisEO-PEO environment - peo :: init( __argc, __argv ); - - - // processing the command line specified parameters - loadParameters( __argc, __argv ); - - - // init, eval operators, EA operators ------------------------------------------------------------------------------------------------------------- - - RouteInit route_init; // random init object - creates random Route objects - RouteEval full_eval; // evaluator object - offers a fitness value for a specified Route object - - OrderXover crossover; // crossover operator - creates two offsprings out of two specified parents - CitySwap mutation; // mutation operator - randomly mutates one gene for a specified individual - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // evolutionary algorithm components -------------------------------------------------------------------------------------------------------------- - - eoPop< Route > population( POP_SIZE, route_init ); // initial population for the algorithm having POP_SIZE individuals - - - #ifdef PARALLEL_FIT_EVALUATION - - MergeRouteEval merge_eval; - - std :: vector< eoEvalFunc< Route >* > part_eval; - for ( unsigned index = 1; index <= NUM_PART_EVALS; index++ ) - part_eval.push_back( new PartRouteEval( ( float )( index - 1 ) / NUM_PART_EVALS, ( float )index / NUM_PART_EVALS ) ); - - peoParaPopEval< Route > ox_pop_eval( part_eval, merge_eval ); - - #else - - peoParaPopEval< Route > ox_pop_eval( full_eval ); - - #endif - - - - peoParaPopEval< Route > eaPopEval( full_eval ); // evaluator object - to be applied at each iteration on the entire population - - eoGenContinue< Route > eaCont( NUM_GEN ); // continuation criterion - the algorithm will iterate for NUM_GEN generations - eoCheckPoint< Route > eaCheckpointContinue( eaCont ); // checkpoint object - verify at each iteration if the continuation criterion is met - - eoRankingSelect< Route > selectionStrategy; // selection strategy - applied at each iteration for selecting parent individuals - eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration - - // transform operator - includes the crossover and the mutation operators with a specified associated rate - eoSGATransform< Route > transform( crossover, CROSS_RATE, mutation, MUT_RATE ); - peoSeqTransform< Route > eaTransform( transform ); // ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object - - eoPlusReplacement< Route > eaReplace; // replacement strategy - for replacing the initial population with offspring individuals - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // ParadisEO-PEO evolutionary algorithm ----------------------------------------------------------------------------------------------------------- - - peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); - - eaAlg( population ); // specifying the initial population for the algorithm, to be iteratively evolved - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - peo :: run( ); - peo :: finalize( ); - - if(getNodeRank()==1) - std::cout<<"\n\nPopulation :\n"< +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +typedef eoReal Indi; + +double f (const Indi & _indi) +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); +} + +int main (int __argc, char *__argv[]) +{ + + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; + rng.reseed (time(0)); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + + /******************************************************************************************/ + + /* In this lesson, you can choose between : + * + * - A sequential transformation (crossover + mutation) : eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + * peoSeqTransform eaTransform(transform); + * + * OR + * + * - A parallel transformation (crossover + mutation) : peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + * + * Unfortunately, if you don't use a crossover which creates two children with two parents, + * you can't use this operator. + * In this case, you should send a mail to : paradiseo-help@lists.gforge.inria.fr + */ + + peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + +/******************************************************************************************/ + + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + Algo(pop); + peo :: run(); + peo :: finalize(); + if(getNodeRank()==1) + std::cout << "Final population :\n" << pop << std::endl; +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson2/paradiseo-peo-lsn.doxyfile b/trunk/paradiseo-peo/tutorial/Lesson2/paradiseo-peo-lsn.doxyfile deleted file mode 100644 index 318d06ba0..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson2/paradiseo-peo-lsn.doxyfile +++ /dev/null @@ -1,241 +0,0 @@ -# Doxyfile 1.4.7 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = "ParadisEO-PEO Lesson2" -PROJECT_NUMBER = 0.1 -OUTPUT_DIRECTORY = ../../../doc/html/lesson2 -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = YES -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -BUILTIN_STL_SUPPORT = NO -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = YES -HIDE_UNDOC_CLASSES = YES -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = NO -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = YES -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = . -FILE_PATTERNS = *.cpp \ - *.h \ - NEWS \ - README -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = ../../docs/images -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 3 -IGNORE_PREFIX = peo -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = YES -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = YES -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = ../../../paradiseo-mo/docs/eo.doxytag=../../../../../paradiseo-mo/docs/html \ - ../../../paradiseo-mo/docs/mo.doxytag=../../../../../paradiseo-mo/docs/html \ - ../../docs/paradiseo-peo.doxytag=../../ \ - ../shared/paradiseo-peo-lsn-shared.doxytag=../../lsnshared/html -GENERATE_TAGFILE = ../../docs/paradiseo-peo-lsn.doxytag -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = YES diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/lesson.param b/trunk/paradiseo-peo/tutorial/Lesson2/param similarity index 74% rename from trunk/paradiseo-peo/tutorial/Lesson4/lesson.param rename to trunk/paradiseo-peo/tutorial/Lesson2/param index 6ba37c292..730f547e1 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson4/lesson.param +++ b/trunk/paradiseo-peo/tutorial/Lesson2/param @@ -4,4 +4,6 @@ ## deployment schema ---schema=schema.xml \ No newline at end of file +--schema=schema.xml + + diff --git a/trunk/paradiseo-peo/tutorial/Lesson2/schema.xml b/trunk/paradiseo-peo/tutorial/Lesson2/schema.xml deleted file mode 100644 index 3edea1488..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson2/schema.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - 1 - - - - - - - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson3/CMakeLists.txt deleted file mode 100644 index 6aad38f4b..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson3/CMakeLists.txt +++ /dev/null @@ -1,105 +0,0 @@ - -###################################################################################### -### 0) Set the compiler and define targets to easily run the lessons -###################################################################################### - -SET (CMAKE_CXX_COMPILER mpicxx) - -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson3/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson3/schema.xml) - -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson3/lesson.param - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson3) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson3/schema.xml - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson3) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson3/ParadisEO-PEO_Lesson3.pdf - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson3) -###################################################################################### - - -###################################################################################### -### 1) Include the sources -###################################################################################### - -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src ${TSP_SRC_DIR}) - -###################################################################################### - - -###################################################################################### -### 2) Specify where CMake can find the libraries -###################################################################################### - -IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib ${TSP_BINARY_DIR}/lib) -ENDIF(NOT WIN32 OR CYGWIN) - -# especially for Visual Studio -IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${TSP_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) -ENDIF(WIN32 AND NOT CYGWIN) -###################################################################################### - - -###################################################################################### -### 3) Define your target(s): just an executable here -###################################################################################### - -ADD_EXECUTABLE(tspExample main.cpp) -ADD_DEPENDENCIES(tspExample tsp peo rmc_mpi) -###################################################################################### - - -###################################################################################### -### 4) Optionnal: define properties -###################################################################################### - -SET(LESSON3_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(tspExample PROPERTIES VERSION "${LESSON3_VERSION}") -###################################################################################### - - -###################################################################################### -### 5) Link the librairies -###################################################################################### - -TARGET_LINK_LIBRARIES(tspExample ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) - -###################################################################################### - - -###################################################################################### -### 6) Windows advanced config - especially for Microsoft Visual Studio 8 -###################################################################################### - - IF(CMAKE_CXX_COMPILER MATCHES cl) - IF(NOT WITH_SHARED_LIBS) - IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy") - SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") - - ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - ENDIF(NOT WITH_SHARED_LIBS) - ENDIF(CMAKE_CXX_COMPILER MATCHES cl) -###################################################################################### - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/ParadisEO-PEO_Lesson3.pdf b/trunk/paradiseo-peo/tutorial/Lesson3/ParadisEO-PEO_Lesson3.pdf deleted file mode 100755 index dda6ad44f861aee4d2a5469dd909ae242c586959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117573 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 MbLLnqu~bq1AGl(L1^@s6 diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/main.cpp b/trunk/paradiseo-peo/tutorial/Lesson3/main.cpp deleted file mode 100644 index a7caa0c8a..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson3/main.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* -* -* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 -* -* Sebastien Cahon, Alexandru-Adrian Tantar -* -* 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 "route.h" -#include "route_init.h" -#include "route_eval.h" - -#include "order_xover.h" -#include "city_swap.h" - -#include "param.h" - - -#include - - -#define POP_SIZE 10 -#define NUM_GEN 100 -#define CROSS_RATE 1.0 -#define MUT_RATE 0.01 - -#define MIG_FREQ 10 -#define MIG_SIZE 5 - - -int main( int __argc, char** __argv ) { - - // initializing the ParadisEO-PEO environment - peo :: init( __argc, __argv ); - - - // processing the command line specified parameters - loadParameters( __argc, __argv ); - - - // init, eval operators, EA operators ------------------------------------------------------------------------------------------------------------- - - RouteInit route_init; // random init object - creates random Route objects - RouteEval full_eval; // evaluator object - offers a fitness value for a specified Route object - - OrderXover crossover; // crossover operator - creates two offsprings out of two specified parents - CitySwap mutation; // mutation operator - randomly mutates one gene for a specified individual - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // evolutionary algorithm components -------------------------------------------------------------------------------------------------------------- - - eoPop< Route > population( POP_SIZE, route_init ); // initial population for the algorithm having POP_SIZE individuals - peoParaPopEval< Route > eaPopEval( full_eval ); // evaluator object - to be applied at each iteration on the entire population - - eoGenContinue< Route > eaCont( NUM_GEN ); // continuation criterion - the algorithm will iterate for NUM_GEN generations - eoCheckPoint< Route > eaCheckpointContinue( eaCont ); // checkpoint object - verify at each iteration if the continuation criterion is met - - eoRankingSelect< Route > selectionStrategy; // selection strategy - applied at each iteration for selecting parent individuals - eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration - - // transform operator - includes the crossover and the mutation operators with a specified associated rate - eoSGATransform< Route > transform( crossover, CROSS_RATE, mutation, MUT_RATE ); - peoSeqTransform< Route > eaTransform( transform ); // ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object - - eoPlusReplacement< Route > eaReplace; // replacement strategy - for replacing the initial population with offspring individuals - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - RingTopology topology; - - // migration policy and components ---------------------------------------------------------------------------------------------------------------- - - eoPeriodicContinue< Route > mig_cont( MIG_FREQ ); // migration occurs periodically - - eoRandomSelect< Route > mig_select_one; // emigrants are randomly selected - eoSelectNumber< Route > mig_select( mig_select_one, MIG_SIZE ); - - eoPlusReplacement< Route > mig_replace; // immigrants replace the worse individuals - - peoSyncIslandMig< Route > mig( MIG_FREQ, mig_select, mig_replace, topology, population, population ); - //peoAsyncIslandMig< Route > mig( mig_cont, mig_select, mig_replace, topology, population, population ); - - eaCheckpointContinue.add( mig ); - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - - - // ParadisEO-PEO evolutionary algorithm ----------------------------------------------------------------------------------------------------------- - - peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); - - mig.setOwner( eaAlg ); - - eaAlg( population ); // specifying the initial population for the algorithm, to be iteratively evolved - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - - // evolutionary algorithm components -------------------------------------------------------------------------------------------------------------- - - eoPop< Route > population2( POP_SIZE, route_init ); // initial population for the algorithm having POP_SIZE individuals - peoParaPopEval< Route > eaPopEval2( full_eval ); // evaluator object - to be applied at each iteration on the entire population - - eoGenContinue< Route > eaCont2( NUM_GEN ); // continuation criterion - the algorithm will iterate for NUM_GEN generations - eoCheckPoint< Route > eaCheckpointContinue2( eaCont2 ); // checkpoint object - verify at each iteration if the continuation criterion is met - - eoRankingSelect< Route > selectionStrategy2; // selection strategy - applied at each iteration for selecting parent individuals - eoSelectNumber< Route > eaSelect2( selectionStrategy2, POP_SIZE ); // selection object - POP_SIZE individuals are selected at each iteration - - // transform operator - includes the crossover and the mutation operators with a specified associated rate - eoSGATransform< Route > transform2( crossover, CROSS_RATE, mutation, MUT_RATE ); - peoSeqTransform< Route > eaTransform2( transform2 ); // ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object - - eoPlusReplacement< Route > eaReplace2; // replacement strategy - for replacing the initial population with offspring individuals - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - - // migration policy and components ---------------------------------------------------------------------------------------------------------------- - - eoPeriodicContinue< Route > mig_cont2( MIG_FREQ ); // migration occurs periodically - - eoRandomSelect< Route > mig_select_one2; // emigrants are randomly selected - eoSelectNumber< Route > mig_select2( mig_select_one2, MIG_SIZE ); - - eoPlusReplacement< Route > mig_replace2; // immigrants replace the worse individuals - - peoSyncIslandMig< Route > mig2( MIG_FREQ, mig_select2, mig_replace2, topology, population2, population2 ); - //peoAsyncIslandMig< Route > mig2( mig_cont2, mig_select2, mig_replace2, topology, population2, population2 ); - - eaCheckpointContinue2.add( mig2 ); - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - - - // ParadisEO-PEO evolutionary algorithm ----------------------------------------------------------------------------------------------------------- - - peoEA< Route > eaAlg2( eaCheckpointContinue2, eaPopEval2, eaSelect2, eaTransform2, eaReplace2 ); - - mig2.setOwner( eaAlg2 ); - - eaAlg2( population2 ); // specifying the initial population for the algorithm, to be iteratively evolved - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - - peo :: run( ); - peo :: finalize( ); - - if(getNodeRank()==1) - { - std::cout << "Population 1 :\n" << population << std::endl; - std::cout << "Population 2 :\n" << population2 << std::endl; - } - // shutting down the ParadisEO-PEO environment - - return 0; -} diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp new file mode 100644 index 000000000..eda971e92 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson3/mainEA.cpp @@ -0,0 +1,148 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +typedef eoReal Indi; + +double f (const Indi & _indi) +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); +} + +int main (int __argc, char *__argv[]) +{ + + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; + // MIG_FREQ define the frequence of the migration. + const unsigned int MIG_FREQ = 10; + // MIG_SIZE define the size of each migration. + const unsigned int MIG_SIZE = 5; + rng.reseed (time(0)); + + // Define the topology of your island model + RingTopology topology; + + // First algorithm + /*****************************************************************************************/ + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + eoSGATransform transform(crossover,CROSS_RATE,mutation,MUT_RATE); + peoSeqTransform eaTransform(transform); // Here, the transformation is sequential + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + + eoPeriodicContinue mig_cont( MIG_FREQ ); // Migration occurs periodically + eoRandomSelect mig_select_one; // Emigrants are randomly selected + eoSelectNumber mig_select (mig_select_one,MIG_SIZE); + eoPlusReplacement mig_replace; // Immigrants replace the worse individuals + +/*****************************************************************************************/ + +// Second algorithm (on the same model but with others names) + /*****************************************************************************************/ + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCombinedContinue continuatorPara2 (genContPara2); + eoCheckPoint checkpoint2(continuatorPara2); + peoEvalFunc plainEval2(f); + peoSeqPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoRankingSelect selectionStrategy2; + eoSelectNumber select2(selectionStrategy2,POP_SIZE); + eoSegmentCrossover crossover2; + eoUniformMutation mutation2(EPSILON); + eoSGATransform transform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); + peoSeqTransform eaTransform2(transform2); + eoPlusReplacement replace2; + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + eoPeriodicContinue mig_cont2( MIG_FREQ ); + eoRandomSelect mig_select_one2; + eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); + eoPlusReplacement mig_replace2; + +/*****************************************************************************************/ + +// You can choose between : +// +// - Synchrone communication : peoSyncIslandMig mig(MIG_FREQ,mig_select,mig_replace,topology,pop,pop); +// - Asynchrone communication : peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop); +// With a grid, you should use an asynchrone communication + peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); + checkpoint.add(mig); + peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); + checkpoint2.add(mig2); + +// Initialization of the algorithms + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + mig.setOwner(Algo); + Algo(pop); + peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); + mig2.setOwner(Algo2); + Algo2(pop2); + + peo :: run(); + peo :: finalize(); + if(getNodeRank()==1) + { + std::cout << "Final population 1 :\n" << pop << std::endl; + std::cout << "Final population 2 :\n" << pop2 << std::endl; + } +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/main.cpp b/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp similarity index 58% rename from trunk/paradiseo-peo/tutorial/Lesson5/main.cpp rename to trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp index 1f97d78c2..7c726fea3 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson5/main.cpp +++ b/trunk/paradiseo-peo/tutorial/Lesson3/mainPSO.cpp @@ -1,7 +1,7 @@ /* * * Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 +* (C) OPAC Team, INRIA, 2007 * * Clive Canape * @@ -31,136 +31,122 @@ * * ParadisEO WebSite : http://paradiseo.gforge.inria.fr * Contact: paradiseo-help@lists.gforge.inria.fr -* clive.canape@inria.fr +* */ #include -// You can choose : a replacement or an affectation on the velocity -#define REPLAC - typedef eoRealParticle < double >Indi; - -//Evaluation function double f (const Indi & _indi) { - //Levy function f* = -21.502356 x*=(1,1,1,-9.752356 ) for vector size = 4 - - const double PI = 4.0 * atan(1.0); - double sum=0.; - for (unsigned i = 0; i < _indi.size()-1; i++) - sum+=pow((_indi[i]-1),2)*(1+pow(sin(3*PI*_indi[i+1]),2)); - sum+=pow(sin(3*PI*_indi[0]),2); - sum+=(_indi[_indi.size()-1]-1)*(1+pow(sin(2*PI*_indi[_indi.size()-1]),2)); + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); return (-sum); } int main (int __argc, char *__argv[]) { -//Initialization - peo :: init( __argc, __argv ); -//Parameters - - const unsigned int MIG_FREQ = 10; // 1 or 2 for peoPSOVelocity ... - const unsigned int VEC_SIZE = 4; - const unsigned int POP_SIZE = 10; - const unsigned int NEIGHBORHOOD_SIZE= 5; - const unsigned int MAX_GEN = 100; - const double INIT_POSITION_MIN = -10.0; - const double INIT_POSITION_MAX = 1.0; - const double INIT_VELOCITY_MIN = -1; - const double INIT_VELOCITY_MAX = 1; - const double C1 = 1; - const double C2 = 0.5; -// c3 is used to calculate of an affectation on the velocity - const double C3 = 2; +// In this lesson, we define two algorithms of the PSO witch represente two islands. +// Obviously, you can define more algorithms. + + // The parameters are commun between the two algorithms. + /*****************************************************************************************/ + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int NEIGHBORHOOD_SIZE= 6; + const unsigned int MAX_GEN = 150; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const double INIT_VELOCITY_MIN = -1.; + const double INIT_VELOCITY_MAX = 1.; + const double C1 = 0.5; + const double C2 = 2.; + // C3 is used for the calculation of one of the strategies of the island model. + const double C3 = 2.; + // MIG_FREQ define the frequence of the migration. + const unsigned int MIG_FREQ = 10; // The optimal value is 1 or 2 for the component peoPSOVelocity. rng.reseed (time(0)); - - peoEvalFuncPSO plainEval(f); + /*****************************************************************************************/ + + // Define the topology of your island model + RingTopology topologyMig; + + // First algorithm + /*****************************************************************************************/ + peoEvalFuncPSO plainEval(f); + peoSeqPopEval< Indi > eval(plainEval); // Here, the evaluation is sequential ! eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); eoFirstIsBestInit < Indi > localInit; eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight(bndsFlight); - eoEvalFuncCounter < Indi > evalSeq (plainEval); - peoParaPopEval< Indi > eval(plainEval); + eoStandardFlight < Indi > flight(bndsFlight); eoPop < Indi > pop; - pop.append (POP_SIZE, random); - apply(evalSeq, pop); - apply < Indi > (veloRandom, pop); - apply < Indi > (localInit, pop); + pop.append (POP_SIZE, random); + peoInitializer init(eval,veloRandom,localInit,pop); eoLinearTopology topology(NEIGHBORHOOD_SIZE); - topology.setup(pop); eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); eoGenContinue < Indi > genContPara (MAX_GEN); eoCheckPoint checkpoint(genContPara); - RingTopology topologyMig; - /*******************************************************************/ - eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + // Specific implementation for the island model + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); peoPSOSelect mig_selec(topology); eoSelectNumber< Indi > mig_select(mig_selec); -#ifndef REPLAC - peoPSOVelocity mig_replace(C3,velocity); -#else + // If you want to use a replacement stategy : peoPSOReplacement mig_replace; + // If you want to use a consideration of the migration in the calculation of the velocity : peoPSOVelocity mig_replace(C3,velocity); peoPSOReplacement mig_replace; -#endif -/*****************************************************************/ - - +/*****************************************************************************************/ + + // Second algorithm (on the same model but with others names) +/*****************************************************************************************/ peoEvalFuncPSO plainEval2(f); + peoSeqPopEval< Indi > eval2(plainEval2); eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); - eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); - eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); eoFirstIsBestInit < Indi > localInit2; eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); - eoStandardFlight < Indi > flight2(bndsFlight2); - eoEvalFuncCounter < Indi > evalSeq2 (plainEval2); - peoParaPopEval< Indi > eval2(plainEval2); + eoStandardFlight < Indi > flight2(bndsFlight2); eoPop < Indi > pop2; - pop2.append (POP_SIZE, random2); - apply(evalSeq2, pop2); - apply < Indi > (veloRandom2, pop2); - apply < Indi > (localInit2, pop2); + pop2.append (POP_SIZE, random2); + peoInitializer init2(eval2,veloRandom2,localInit2,pop2); eoLinearTopology topology2(NEIGHBORHOOD_SIZE); - topology2.setup(pop2); eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); eoGenContinue < Indi > genContPara2 (MAX_GEN); eoCheckPoint checkpoint2(genContPara2); - /*******************************************************************/ - eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); peoPSOSelect mig_selec2(topology2); eoSelectNumber< Indi > mig_select2(mig_selec2); -#ifndef REPLAC - peoPSOVelocity mig_replace2(C3,velocity2); -#else peoPSOReplacement mig_replace2; -#endif -/*******************************************************************/ +/*****************************************************************************************/ - peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); + // Define the communication between the islands + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop); checkpoint.add( mig ); - peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop); - checkpoint.add( mig2 ); - - peoPSO < Indi > psa(checkpoint, eval, velocity, flight); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop2); + checkpoint2.add( mig2 ); + // Initialization of the algorithms + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); mig.setOwner( psa ); psa(pop); - peoPSO < Indi > psa2(checkpoint2, eval2, velocity2, flight2); + peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); mig2.setOwner( psa2 ); psa2(pop2); - + peo :: run(); peo :: finalize(); if(getNodeRank()==1) { - std::cout << "Population 1 :\n" << pop << std::endl; + std::cout << "Population 1 :\n" << pop << std::endl; std::cout << "Population 2 :\n" << pop2 << std::endl; } } diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/paradiseo-peo-lsn.doxyfile b/trunk/paradiseo-peo/tutorial/Lesson3/paradiseo-peo-lsn.doxyfile deleted file mode 100644 index 1d97a8596..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson3/paradiseo-peo-lsn.doxyfile +++ /dev/null @@ -1,241 +0,0 @@ -# Doxyfile 1.4.7 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = "ParadisEO-PEO Lesson3" -PROJECT_NUMBER = 0.1 -OUTPUT_DIRECTORY = ../../../doc/html/lesson3 -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = YES -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -BUILTIN_STL_SUPPORT = NO -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = YES -HIDE_UNDOC_CLASSES = YES -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = NO -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = YES -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = . -FILE_PATTERNS = *.cpp \ - *.h \ - NEWS \ - README -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = ../../docs/images -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 3 -IGNORE_PREFIX = peo -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = YES -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = YES -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = ../../../paradiseo-mo/docs/eo.doxytag=../../../../../paradiseo-mo/docs/html \ - ../../../paradiseo-mo/docs/mo.doxytag=../../../../../paradiseo-mo/docs/html \ - ../../docs/paradiseo-peo.doxytag=../../ \ - ../shared/paradiseo-peo-lsn-shared.doxytag=../../lsnshared/html -GENERATE_TAGFILE = ../../docs/paradiseo-peo-lsn.doxytag -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = YES diff --git a/trunk/paradiseo-peo/tutorial/Lesson1/lesson.param b/trunk/paradiseo-peo/tutorial/Lesson3/param similarity index 60% rename from trunk/paradiseo-peo/tutorial/Lesson1/lesson.param rename to trunk/paradiseo-peo/tutorial/Lesson3/param index eb843c65f..730f547e1 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson1/lesson.param +++ b/trunk/paradiseo-peo/tutorial/Lesson3/param @@ -6,7 +6,4 @@ --schema=schema.xml -## parameters - ---inst=../examples/tsp/benchs/eil101.tsp diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/schema.xml b/trunk/paradiseo-peo/tutorial/Lesson3/schema.xml deleted file mode 100644 index 9b8bf316c..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson3/schema.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - 1 - 2 - - - - - - - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson4/CMakeLists.txt deleted file mode 100644 index 7a4ac3edc..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson4/CMakeLists.txt +++ /dev/null @@ -1,98 +0,0 @@ - -###################################################################################### -### 0) Set the compiler and define targets to easily run the lessons -###################################################################################### - -SET (CMAKE_CXX_COMPILER mpicxx) - -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson4/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson4/schema.xml) - -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson4/lesson.param - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson4) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson4/schema.xml - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson4) -###################################################################################### - - -###################################################################################### -### 1) Include the sources -###################################################################################### - -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src) - -###################################################################################### - - -###################################################################################### -### 2) Specify where CMake can find the libraries -###################################################################################### - -IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib) -ENDIF(NOT WIN32 OR CYGWIN) - -# especially for Visual Studio -IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) -ENDIF(WIN32 AND NOT CYGWIN) -###################################################################################### - - -###################################################################################### -### 3) Define your target(s): just an executable here -###################################################################################### - -ADD_EXECUTABLE(psoExample main.cpp) -ADD_DEPENDENCIES(psoExample peo rmc_mpi) -###################################################################################### - - -###################################################################################### -### 4) Optionnal: define properties -###################################################################################### - -SET(LESSON4_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(psoExample PROPERTIES VERSION "${LESSON4_VERSION}") -###################################################################################### - - -###################################################################################### -### 5) Link the librairies -###################################################################################### - -TARGET_LINK_LIBRARIES(psoExample ${XML2_LIBS} peo rmc_mpi eo eoutils) - -###################################################################################### - - -###################################################################################### -### 6) Windows advanced config - especially for Microsoft Visual Studio 8 -###################################################################################### - - IF(CMAKE_CXX_COMPILER MATCHES cl) - IF(NOT WITH_SHARED_LIBS) - IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy") - SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") - - ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - ENDIF(NOT WITH_SHARED_LIBS) - ENDIF(CMAKE_CXX_COMPILER MATCHES cl) -###################################################################################### - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp new file mode 100644 index 000000000..878e7dea2 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson4/mainEA.cpp @@ -0,0 +1,152 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +typedef eoReal Indi; + +double f (const Indi & _indi) +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); +} + +int main (int __argc, char *__argv[]) +{ + +// In this lesson, we can see an exemple of an evolutionary algorithms with three islands. +// The evaluation is parallel. +// The transformation is parallel. + + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int MAX_GEN = 300; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const float CROSS_RATE = 0.8; + const double EPSILON = 0.01; + const float MUT_RATE = 0.3; + const unsigned int MIG_FREQ = 10; + const unsigned int MIG_SIZE = 5; + rng.reseed (time(0)); + RingTopology topology; + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCombinedContinue continuatorPara (genContPara); + eoCheckPoint checkpoint(continuatorPara); + peoEvalFunc plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoRankingSelect selectionStrategy; + eoSelectNumber select(selectionStrategy,POP_SIZE); + eoSegmentCrossover crossover; + eoUniformMutation mutation(EPSILON); + peoParaSGATransform eaTransform(crossover,CROSS_RATE,mutation,MUT_RATE); + eoPlusReplacement replace; + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + eoPeriodicContinue mig_cont( MIG_FREQ ); + eoRandomSelect mig_select_one; + eoSelectNumber mig_select (mig_select_one,MIG_SIZE); + eoPlusReplacement mig_replace; + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCombinedContinue continuatorPara2 (genContPara2); + eoCheckPoint checkpoint2(continuatorPara2); + peoEvalFunc plainEval2(f); + peoParaPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoRankingSelect selectionStrategy2; + eoSelectNumber select2(selectionStrategy2,POP_SIZE); + eoSegmentCrossover crossover2; + eoUniformMutation mutation2(EPSILON); + peoParaSGATransform eaTransform2(crossover2,CROSS_RATE,mutation2,MUT_RATE); + eoPlusReplacement replace2; + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + eoPeriodicContinue mig_cont2( MIG_FREQ ); + eoRandomSelect mig_select_one2; + eoSelectNumber mig_select2 (mig_select_one2,MIG_SIZE); + eoPlusReplacement mig_replace2; + eoGenContinue < Indi > genContPara3 (MAX_GEN); + eoCombinedContinue continuatorPara3 (genContPara3); + eoCheckPoint checkpoint3(continuatorPara3); + peoEvalFunc plainEval3(f); + peoParaPopEval< Indi > eval3(plainEval3); + eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); + eoRankingSelect selectionStrategy3; + eoSelectNumber select3(selectionStrategy3,POP_SIZE); + eoSegmentCrossover crossover3; + eoUniformMutation mutation3(EPSILON); + peoParaSGATransform eaTransform3(crossover3,CROSS_RATE,mutation3,MUT_RATE); + eoPlusReplacement replace3; + eoPop < Indi > pop3; + pop3.append (POP_SIZE, random3); + eoPeriodicContinue mig_cont3( MIG_FREQ ); + eoRandomSelect mig_select_one3; + eoSelectNumber mig_select3 (mig_select_one3,MIG_SIZE); + eoPlusReplacement mig_replace3; + peoAsyncIslandMig mig(mig_cont,mig_select,mig_replace,topology,pop,pop2); + checkpoint.add(mig); + peoAsyncIslandMig mig2(mig_cont2,mig_select2,mig_replace2,topology,pop2,pop); + checkpoint2.add(mig2); + peoAsyncIslandMig mig3(mig_cont3,mig_select3,mig_replace3,topology,pop3,pop); + checkpoint3.add(mig3); + peoEA Algo(checkpoint,eval,select,eaTransform,replace); + mig.setOwner(Algo); + Algo(pop); + peoEA Algo2(checkpoint2,eval2,select2,eaTransform2,replace2); + mig2.setOwner(Algo2); + Algo2(pop2); + peoEA Algo3(checkpoint3,eval3,select3,eaTransform3,replace3); + mig3.setOwner(Algo3); + Algo3(pop3); + + peo :: run(); + peo :: finalize(); + if(getNodeRank()==1) + { + std::cout << "Final population 1 :\n" << pop << std::endl; + std::cout << "Final population 2 :\n" << pop2 << std::endl; + std::cout << "Final population 3 :\n" << pop3 << std::endl; + } +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp b/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp new file mode 100644 index 000000000..ac20ddbb2 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson4/mainPSO.cpp @@ -0,0 +1,159 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +typedef eoRealParticle < double >Indi; + +double f (const Indi & _indi) +{ + double sum; + sum=_indi[1]-pow(_indi[0],2); + sum=100*pow(sum,2); + sum+=pow((1-_indi[0]),2); + return (-sum); +} + +int main (int __argc, char *__argv[]) +{ + +// In this lesson, we can see an exemple of a PSO with three islands. +// The stategy of migration is the replacement. +// The evaluation is parallel. + + peo :: init( __argc, __argv ); + const unsigned int VEC_SIZE = 2; + const unsigned int POP_SIZE = 20; + const unsigned int NEIGHBORHOOD_SIZE= 6; + const unsigned int MAX_GEN = 150; + const double INIT_POSITION_MIN = -2.0; + const double INIT_POSITION_MAX = 2.0; + const double INIT_VELOCITY_MIN = -1.; + const double INIT_VELOCITY_MAX = 1.; + const double C1 = 0.5; + const double C2 = 2.; + const double C3 = 2.; + const unsigned int MIG_FREQ = 10; + rng.reseed (time(0)); + RingTopology topologyMig; + peoEvalFuncPSO plainEval(f); + peoParaPopEval< Indi > eval(plainEval); + eoUniformGenerator < double >uGen (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random (VEC_SIZE, uGen); + eoUniformGenerator < double >sGen (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom (VEC_SIZE, sGen); + eoFirstIsBestInit < Indi > localInit; + eoRealVectorBounds bndsFlight(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight(bndsFlight); + eoPop < Indi > pop; + pop.append (POP_SIZE, random); + peoInitializer init(eval,veloRandom,localInit,pop); + eoLinearTopology topology(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity (topology,C1,C2,bnds); + eoGenContinue < Indi > genContPara (MAX_GEN); + eoCheckPoint checkpoint(genContPara); + eoPeriodicContinue< Indi > mig_cont( MIG_FREQ ); + peoPSOSelect mig_selec(topology); + eoSelectNumber< Indi > mig_select(mig_selec); + peoPSOReplacement mig_replace; + peoEvalFuncPSO plainEval2(f); + peoParaPopEval< Indi > eval2(plainEval2); + eoUniformGenerator < double >uGen2 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random2 (VEC_SIZE, uGen2); + eoUniformGenerator < double >sGen2 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom2 (VEC_SIZE, sGen2); + eoFirstIsBestInit < Indi > localInit2; + eoRealVectorBounds bndsFlight2(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight2(bndsFlight2); + eoPop < Indi > pop2; + pop2.append (POP_SIZE, random2); + peoInitializer init2(eval2,veloRandom2,localInit2,pop2); + eoLinearTopology topology2(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds2(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity2 (topology2,C1,C2,bnds2); + eoGenContinue < Indi > genContPara2 (MAX_GEN); + eoCheckPoint checkpoint2(genContPara2); + eoPeriodicContinue< Indi > mig_cont2( MIG_FREQ ); + peoPSOSelect mig_selec2(topology2); + eoSelectNumber< Indi > mig_select2(mig_selec2); + peoPSOReplacement mig_replace2; + peoEvalFuncPSO plainEval3(f); + peoParaPopEval< Indi > eval3(plainEval3); + eoUniformGenerator < double >uGen3 (INIT_POSITION_MIN, INIT_POSITION_MAX); + eoInitFixedLength < Indi > random3 (VEC_SIZE, uGen3); + eoUniformGenerator < double >sGen3 (INIT_VELOCITY_MIN, INIT_VELOCITY_MAX); + eoVelocityInitFixedLength < Indi > veloRandom3 (VEC_SIZE, sGen3); + eoFirstIsBestInit < Indi > localInit3; + eoRealVectorBounds bndsFlight3(VEC_SIZE,INIT_POSITION_MIN,INIT_POSITION_MAX); + eoStandardFlight < Indi > flight3(bndsFlight3); + eoPop < Indi > pop3; + pop3.append (POP_SIZE, random3); + peoInitializer init3(eval3,veloRandom3,localInit3,pop3); + eoLinearTopology topology3(NEIGHBORHOOD_SIZE); + eoRealVectorBounds bnds3(VEC_SIZE,INIT_VELOCITY_MIN,INIT_VELOCITY_MAX); + eoStandardVelocity < Indi > velocity3 (topology3,C1,C2,bnds3); + eoGenContinue < Indi > genContPara3 (MAX_GEN); + eoCheckPoint checkpoint3(genContPara3); + eoPeriodicContinue< Indi > mig_cont3( MIG_FREQ ); + peoPSOSelect mig_selec3(topology3); + eoSelectNumber< Indi > mig_select3(mig_selec3); + peoPSOReplacement mig_replace3; + peoAsyncIslandMig< Indi > mig( mig_cont, mig_select, mig_replace, topologyMig, pop, pop2); + checkpoint.add( mig ); + peoAsyncIslandMig< Indi > mig2( mig_cont2, mig_select2, mig_replace2, topologyMig, pop2, pop3); + checkpoint2.add( mig2 ); + peoAsyncIslandMig< Indi > mig3( mig_cont3, mig_select3, mig_replace3, topologyMig, pop3, pop); + checkpoint3.add( mig3 ); + peoPSO < Indi > psa(init,checkpoint, eval, velocity, flight); + mig.setOwner( psa ); + psa(pop); + peoPSO < Indi > psa2(init2,checkpoint2, eval2, velocity2, flight2); + mig2.setOwner( psa2 ); + psa2(pop2); + peoPSO < Indi > psa3(init3,checkpoint3, eval3, velocity3, flight3); + mig3.setOwner( psa3 ); + psa3(pop3); + + peo :: run(); + peo :: finalize(); + if(getNodeRank()==1) + { + std::cout << "Population 1 :\n" << pop << std::endl; + std::cout << "Population 2 :\n" << pop2 << std::endl; + std::cout << "Population 3 :\n" << pop3 << std::endl; + } +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo.lsn.doxyfile b/trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo-lsn.doxyfile similarity index 99% rename from trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo.lsn.doxyfile rename to trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo-lsn.doxyfile index 35766a845..bd82ebc84 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo.lsn.doxyfile +++ b/trunk/paradiseo-peo/tutorial/Lesson4/paradiseo-peo-lsn.doxyfile @@ -239,3 +239,4 @@ DOT_CLEANUP = YES # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = YES + diff --git a/trunk/paradiseo-peo/tutorial/Lesson3/lesson.param b/trunk/paradiseo-peo/tutorial/Lesson4/param similarity index 60% rename from trunk/paradiseo-peo/tutorial/Lesson3/lesson.param rename to trunk/paradiseo-peo/tutorial/Lesson4/param index eb843c65f..730f547e1 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson3/lesson.param +++ b/trunk/paradiseo-peo/tutorial/Lesson4/param @@ -6,7 +6,4 @@ --schema=schema.xml -## parameters - ---inst=../examples/tsp/benchs/eil101.tsp diff --git a/trunk/paradiseo-peo/tutorial/Lesson4/schema.xml b/trunk/paradiseo-peo/tutorial/Lesson4/schema.xml deleted file mode 100644 index 9b8bf316c..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson4/schema.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - 1 - 2 - - - - - - - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson5/CMakeLists.txt deleted file mode 100644 index 469ac6dfe..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson5/CMakeLists.txt +++ /dev/null @@ -1,98 +0,0 @@ - -###################################################################################### -### 0) Set the compiler and define targets to easily run the lessons -###################################################################################### - -SET (CMAKE_CXX_COMPILER mpicxx) - -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson5/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson5/schema.xml) - -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson5/lesson.param - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson5) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson5/schema.xml - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson5) -###################################################################################### - - -###################################################################################### -### 1) Include the sources -###################################################################################### - -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src) - -###################################################################################### - - -###################################################################################### -### 2) Specify where CMake can find the libraries -###################################################################################### - -IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib) -ENDIF(NOT WIN32 OR CYGWIN) - -# especially for Visual Studio -IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) -ENDIF(WIN32 AND NOT CYGWIN) -###################################################################################### - - -###################################################################################### -### 3) Define your target(s): just an executable here -###################################################################################### - -ADD_EXECUTABLE(psoExample main.cpp) -ADD_DEPENDENCIES(psoExample peo rmc_mpi) -###################################################################################### - - -###################################################################################### -### 4) Optionnal: define properties -###################################################################################### - -SET(LESSON4_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(psoExample PROPERTIES VERSION "${LESSON4_VERSION}") -###################################################################################### - - -###################################################################################### -### 5) Link the librairies -###################################################################################### - -TARGET_LINK_LIBRARIES(psoExample ${XML2_LIBS} peo rmc_mpi eo eoutils) - -###################################################################################### - - -###################################################################################### -### 6) Windows advanced config - especially for Microsoft Visual Studio 8 -###################################################################################### - - IF(CMAKE_CXX_COMPILER MATCHES cl) - IF(NOT WITH_SHARED_LIBS) - IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy") - SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") - - ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - ENDIF(NOT WITH_SHARED_LIBS) - ENDIF(CMAKE_CXX_COMPILER MATCHES cl) -###################################################################################### - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/mainEA.cpp b/trunk/paradiseo-peo/tutorial/Lesson5/mainEA.cpp new file mode 100644 index 000000000..8ce3d8f31 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson5/mainEA.cpp @@ -0,0 +1,43 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +int main (int __argc, char *__argv[]) +{ + std::cout<<"\nHybridization\n"; +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/mainPSO.cpp b/trunk/paradiseo-peo/tutorial/Lesson5/mainPSO.cpp new file mode 100644 index 000000000..6087c7195 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson5/mainPSO.cpp @@ -0,0 +1,42 @@ +/* +* +* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 +* (C) OPAC Team, INRIA, 2007 +* +* Clive Canape +* +* 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 + +int main (int __argc, char *__argv[]) +{ + std::cout<<"\nHybridization\n"; +} diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo.lsn.doxyfile b/trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo-lsn.doxyfile similarity index 99% rename from trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo.lsn.doxyfile rename to trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo-lsn.doxyfile index 8a0b3d3fe..c0f644a90 100644 --- a/trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo.lsn.doxyfile +++ b/trunk/paradiseo-peo/tutorial/Lesson5/paradiseo-peo-lsn.doxyfile @@ -239,3 +239,4 @@ DOT_CLEANUP = YES # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = YES + diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/param b/trunk/paradiseo-peo/tutorial/Lesson5/param new file mode 100644 index 000000000..730f547e1 --- /dev/null +++ b/trunk/paradiseo-peo/tutorial/Lesson5/param @@ -0,0 +1,9 @@ +## miscallenous parameters + +--debug=false + +## deployment schema + +--schema=schema.xml + + diff --git a/trunk/paradiseo-peo/tutorial/Lesson5/schema.xml b/trunk/paradiseo-peo/tutorial/Lesson5/schema.xml deleted file mode 100644 index 9b8bf316c..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson5/schema.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - 1 - 2 - - - - - - - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson6/CMakeLists.txt b/trunk/paradiseo-peo/tutorial/Lesson6/CMakeLists.txt deleted file mode 100644 index d4e2ec44f..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson6/CMakeLists.txt +++ /dev/null @@ -1,99 +0,0 @@ - -###################################################################################### -### 0) Set the compiler and define targets to easily run the lessons -###################################################################################### - -SET (CMAKE_CXX_COMPILER mpicxx) - -ADD_CUSTOM_TARGET(install DEPENDS ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson6/lesson.param ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson6/schema.xml) - -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson6/lesson.param - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson6) -ADD_CUSTOM_COMMAND( - TARGET install - POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS -E copy_if_different - ${ParadisEO-PEO_SOURCE_DIR}/tutorial/Lesson6/schema.xml - ${ParadisEO-PEO_BINARY_DIR}/tutorial/Lesson6) - -###################################################################################### - - -###################################################################################### -### 1) Include the sources -###################################################################################### - -INCLUDE_DIRECTORIES(${EO_SRC_DIR}/src ${MO_SRC_DIR}/src ${ParadisEO-PEO_SOURCE_DIR}/src ${TSP_SRC_DIR}) - -###################################################################################### - - -###################################################################################### -### 2) Specify where CMake can find the libraries -###################################################################################### - -IF(NOT WIN32 OR CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}/lib ${ParadisEO-PEO_BINARY_DIR}/lib ${TSP_BINARY_DIR}/lib) -ENDIF(NOT WIN32 OR CYGWIN) - -# especially for Visual Studio -IF(WIN32 AND NOT CYGWIN) - LINK_DIRECTORIES(${EO_BIN_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${ParadisEO-PEO_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE} ${TSP_BINARY_DIR}\\lib\\${CMAKE_BUILD_TYPE}) -ENDIF(WIN32 AND NOT CYGWIN) -###################################################################################### - - -###################################################################################### -### 3) Define your target(s): just an executable here -###################################################################################### - -ADD_EXECUTABLE(tspExample main.cpp) -ADD_DEPENDENCIES(tspExample tsp peo rmc_mpi) -###################################################################################### - - -###################################################################################### -### 4) Optionnal: define properties -###################################################################################### - -SET(LESSON6_VERSION ${GLOBAL_VERSION}) -SET_TARGET_PROPERTIES(tspExample PROPERTIES VERSION "${LESSON6_VERSION}") -###################################################################################### - - -###################################################################################### -### 5) Link the librairies -###################################################################################### - -TARGET_LINK_LIBRARIES(tspExample ${XML2_LIBS} tsp peo rmc_mpi eo eoutils) - -###################################################################################### - - -###################################################################################### -### 6) Windows advanced config - especially for Microsoft Visual Studio 8 -###################################################################################### - - IF(CMAKE_CXX_COMPILER MATCHES cl) - IF(NOT WITH_SHARED_LIBS) - IF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - SET(CMAKE_CXX_FLAGS "/nologo /W3 /Gy") - SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Z7 /Od") - SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2") - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/MT /O2") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MTd /Z7 /Od") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") - - ENDIF(CMAKE_GENERATOR STREQUAL "Visual Studio 8 2005") - ENDIF(NOT WITH_SHARED_LIBS) - ENDIF(CMAKE_CXX_COMPILER MATCHES cl) -###################################################################################### - - - diff --git a/trunk/paradiseo-peo/tutorial/Lesson6/lesson.param b/trunk/paradiseo-peo/tutorial/Lesson6/lesson.param deleted file mode 100644 index eb843c65f..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson6/lesson.param +++ /dev/null @@ -1,12 +0,0 @@ -## miscallenous parameters - ---debug=false - -## deployment schema - ---schema=schema.xml - -## parameters - ---inst=../examples/tsp/benchs/eil101.tsp - diff --git a/trunk/paradiseo-peo/tutorial/Lesson6/main.cpp b/trunk/paradiseo-peo/tutorial/Lesson6/main.cpp deleted file mode 100644 index 5287a4fec..000000000 --- a/trunk/paradiseo-peo/tutorial/Lesson6/main.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* -* -* Copyright (C) DOLPHIN Project-Team, INRIA Futurs, 2006-2007 -* (C) OPAC Team, LIFL, 2002-2007 -* -* Clive Canape -* -* 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 -* clive.canape@inria.fr -*/ - -#include "route.h" -#include "route_init.h" -#include "route_eval.h" - -#include "order_xover.h" -#include "city_swap.h" - -#include "param.h" - -#include "merge_route_eval.h" -#include "part_route_eval.h" - - -#include - - -#define POP_SIZE 10 -#define NUM_GEN 100 -#define CROSS_RATE 1.0 -#define MUT_RATE 0.01 - - -int main( int __argc, char** __argv ) { - - // initializing the ParadisEO-PEO environment - peo :: init( __argc, __argv ); - - - // processing the command line specified parameters - loadParameters( __argc, __argv ); - - // init, eval operators, EA operators ------------------------------------------------------------------------------------------------------------- - - RouteInit route_init; // random init object - creates random Route objects - RouteEval full_eval; // evaluator object - offers a fitness value for a specified Route object - OrderXover crossover; // crossover operator - creates two offsprings out of two specified parents - CitySwap mutation; // mutation operator - randomly mutates one gene for a specified individual - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - // evolutionary algorithm components -------------------------------------------------------------------------------------------------------------- - - /* - * You can change the size of the population thanks POP_SIZE - * - */ - - eoPop< Route > population( POP_SIZE, route_init ); - - /* - * If you want to use a parallel evaluation : peoParaPopEval< Route > eaPopEval( full_eval ); - * Else, you can use a sequential evaluation : peoSeqPopEval< Route > eaPopEval( full_eval ); - * - */ - peoParaPopEval< Route > eaPopEval( full_eval ); - - /* - * Continuation criterion - */ - eoGenContinue< Route > eaCont( NUM_GEN ); - eoCheckPoint< Route > eaCheckpointContinue( eaCont ); - - /* - * Selection strategy - */ - eoRankingSelect< Route > selectionStrategy; - eoSelectNumber< Route > eaSelect( selectionStrategy, POP_SIZE ); - - /* With this transform operator, you can use a parallel crossover and a parallel mutation - * - * Unfortunately, if you don't use a crossover which creates two children with two parents, - * you can't use this operator. - * In this case, you should send a mail to : paradiseo-help@lists.gforge.inria.fr - * - */ - peoParaSGATransform< Route > eaTransform( crossover, CROSS_RATE, mutation, MUT_RATE ); // ParadisEO transform operator (please remark the peo prefix) - wraps an e EO transform object - - /* - * Replacement strategy - */ - eoPlusReplacement< Route > eaReplace; - - - // ParadisEO-PEO evolutionary algorithm ----------------------------------------------------------------------------------------------------------- - - peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); - - eaAlg( population ); // specifying the initial population for the algorithm, to be iteratively evolved - // ------------------------------------------------------------------------------------------------------------------------------------------------ - - - peo :: run( ); - peo :: finalize( ); - - if(getNodeRank()==1) - std::cout<<"\n\nPopulation :\n"< - - - - - - - - 1 - - - - - - - - -