diff --git a/trunk/paradiseo-peo/examples/lesson1/doclsn.h b/trunk/paradiseo-peo/examples/lesson1/doclsn.h
index 146ffc0cf..544edc583 100644
--- a/trunk/paradiseo-peo/examples/lesson1/doclsn.h
+++ b/trunk/paradiseo-peo/examples/lesson1/doclsn.h
@@ -2,7 +2,7 @@
//!
//! \section structure Introduction
//!
-//! One of the first steps in designing an evolutionary algorihtm using the ParadisEO-PEO framework
+//! 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
@@ -47,10 +47,13 @@
//!
//!
//! The source-code for this tutorial may be found in the paradiseo-peo/examples/lesson1 directory, in the main.cpp file.
-//! 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 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.
//!
//!
| ... | |
| eoPop< EOT > population( POP_SIZE, popInitializer ); | // creation of a population with POP_SIZE individuals - the popInitializer is a functor to be called for each individual |
| eoGenContinue< EOT > eaCont( NUM_GEN ); | // number of generations for the evolutionary algorithm |
| eoCheckPoint< EOT > eaCheckpointContinue( eaCont ); | // checkpoint incorporating the continuation criterion - startpoint for adding other checkpoint objects |
| peoSeqPopEval< EOT > eaPopEval( evalFunction ); | // sequential evaluation functor wrapper - evalFunction represents the actual evaluation functor |
| eoRankingSelect< EOT > selectionStrategy; | // selection strategy for creating the offspring population - a simple ranking selection in this case |
| eoSelectNumber< EOT > eaSelect( selectionStrategy, POP_SIZE ); | // the number of individuals to be selected for creating the offspring population |
| eoRankingSelect< EOT > selectionStrategy; | // selection strategy for creating the offspring population - a simple ranking selection in this case |
| eoSGATransform< EOT > transform( crossover, CROSS_RATE, mutation, MUT_RATE ); | // transformation operator - crossover and mutation operators with their associated probabilities |
| peoSeqTransform< EOT > eaTransform( transform ); | // ParadisEO specific sequential operator - a parallel version may be specified in the same manner |
| eoPlusReplacement< EOT > eaReplace; | // replacement strategy - for integrating the offspring resulting individuals in the initial population |
| peoEA< EOT > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); | // ParadisEO evolutionary algorithm integrating the above defined objects |
| eaAlg( population ); | // specifying the initial population for the algorithm |
| ... |
+//! ##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. +//! +//!
+//! ##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 +//!+//!
+//! ...
+//!
+//! 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;
+//! }
+//!
+//! +//! 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 +//!+//!
+//! 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 +//!+//!
+//! peoEA< Route > eaAlg( eaCheckpointContinue, eaPopEval, eaSelect, eaTransform, eaReplace ); +//! +//! eaAlg( population ); // specifying the initial population for the algorithm, to be iteratively evolved +//!+//!
+//! ##include "route.h" +//! ##include "route_init.h" +//! ##include "route_eval.h" +//! +//! ##include "order_xover.h" +//! ##include "city_swap.h" +//! +//! ##include "param.h" +//! +//! ##include+//! +//! +//! \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: +//! +//!+//! +//! +//! ##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; +//! } +//!
+//! +//! +//!+//! +//! 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: +//!+//! +//!+//! +//!+//! +//! +//!+//! +//! +//!1 +//!+//! +//!+//! +//!
+//! 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/examples/lesson1/lesson.param b/trunk/paradiseo-peo/examples/lesson1/lesson.param new file mode 100644 index 000000000..3caca8ccf --- /dev/null +++ b/trunk/paradiseo-peo/examples/lesson1/lesson.param @@ -0,0 +1,12 @@ +## miscallenous parameters + +--debug=false + +## deployment schema + +--schema=schema.xml + +## parameters + +--inst=../data/eil101.tsp + diff --git a/trunk/paradiseo-peo/examples/lesson1/main.cpp b/trunk/paradiseo-peo/examples/lesson1/main.cpp index b99376b63..0658fa813 100644 --- a/trunk/paradiseo-peo/examples/lesson1/main.cpp +++ b/trunk/paradiseo-peo/examples/lesson1/main.cpp @@ -6,8 +6,6 @@ Contact: paradiseo-help@lists.gforge.inria.fr */ -#include "param.h" - #include "route.h" #include "route_init.h" #include "route_eval.h" @@ -15,6 +13,8 @@ #include "order_xover.h" #include "city_swap.h" +#include "param.h" + #include