diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h index df533b4df..fbddadacd 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,41 +10,41 @@ */ //----------------------------------------------------------------------------- -#ifndef _FlowShop_h -#define _FlowShop_h +#ifndef FLOWSHOP_H_ +#define FLOWSHOP_H_ -#include -// Fitness for multi-objective flow-shop -#include "FlowShopFitness.h" +#include +#include +#include + + +/** + * definition of the objective vector for multi-objective flow-shop problems + */ +typedef moeoObjectiveVectorDouble FlowShopObjectiveVector; /** * Structure of the genotype for the flow-shop scheduling problem */ -class FlowShop:public EO < FlowShopFitness > -{ +class FlowShop: public MOEO { public: /** * default constructor */ - FlowShop () - { - } + FlowShop() {} /** * destructor */ - virtual ~ FlowShop () - { - } - + virtual ~FlowShop() {} + /** * class name */ - virtual string className () const - { + virtual string className() const { return "FlowShop"; } @@ -52,86 +52,63 @@ public: * set scheduling vector * @param vector & _scheduling the new scheduling to set */ - void setScheduling (vector < unsigned >&_scheduling) - { + void setScheduling(vector & _scheduling) { scheduling = _scheduling; } - + /** * get scheduling vector */ - const vector < unsigned >&getScheduling () const - { + const vector & getScheduling() const { return scheduling; } - + /** * printing... */ - void printOn (ostream & _os) const - { + void printOn(ostream& _os) const { // fitness - EO < FlowShopFitness >::printOn (_os); - _os << "\t"; + MOEO::printOn(_os); // size - _os << scheduling.size () << "\t"; + _os << scheduling.size() << "\t" ; // scheduling - for (unsigned i = 0; i < scheduling.size (); i++) - _os << scheduling[i] << ' '; + for (unsigned i=0; i::readFrom (_is); + MOEO::readFrom(_is); // size unsigned size; _is >> size; // scheduling - scheduling.resize (size); + scheduling.resize(size); bool tmp; - for (unsigned i = 0; i < size; i++) - { - _is >> tmp; - scheduling[i] = tmp; - } - } - - - bool operator== (const FlowShop & _other) const - { - return scheduling == _other.getScheduling (); - } - bool operator!= (const FlowShop & _other) const - { - return scheduling != _other.getScheduling (); - } - bool operator< (const FlowShop & _other) const - { - return scheduling < _other.getScheduling (); - } - bool operator> (const FlowShop & _other) const - { - return scheduling > _other.getScheduling (); - } - bool operator<= (const FlowShop & _other) const - { - return scheduling <= _other.getScheduling (); - } - bool operator>= (const FlowShop & _other) const - { - return scheduling >= _other.getScheduling (); + for (unsigned i=0; i> tmp; + scheduling[i] = tmp; + } } + + + bool operator==(const FlowShop& _other) const { return scheduling == _other.getScheduling(); } + bool operator!=(const FlowShop& _other) const { return scheduling != _other.getScheduling(); } + bool operator< (const FlowShop& _other) const { return scheduling < _other.getScheduling(); } + bool operator> (const FlowShop& _other) const { return scheduling > _other.getScheduling(); } + bool operator<=(const FlowShop& _other) const { return scheduling <= _other.getScheduling(); } + bool operator>=(const FlowShop& _other) const { return scheduling >= _other.getScheduling(); } private: /** scheduling (order of operations) */ - std::vector < unsigned >scheduling; + std::vector scheduling; }; -#endif + +#endif /*FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h index f0e36d8fd..7cc808409 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // FlowShopBenchmarkParser.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,26 +10,20 @@ */ //----------------------------------------------------------------------------- -#ifndef _FlowShopBenchmarkParser_h -#define _FlowShopBenchmarkParser_h - -// general include +#ifndef FLOWSHOPBENCHMARKPARSER_H_ +#define FLOWSHOPBENCHMARKPARSER_H_ #include #include /** Web site to download benchmarks */ -const static - std::string - BENCHMARKS_WEB_SITE = "www.lifl.fr/~liefooga/benchmarks/"; +const static std::string BENCHMARKS_WEB_SITE = "www.lifl.fr/~basseur/BenchsUncertain/"; /** * Class to handle parameters of a flow-shop instance from a benchmark file * benchmark files are available at www.lifl.fr/~basseur/BenchsUncertain/ */ -class - FlowShopBenchmarkParser -{ +class FlowShopBenchmarkParser { public: @@ -37,146 +31,110 @@ public: * constructor * @param const string _benchmarkFileName the name of the benchmark file */ - FlowShopBenchmarkParser (const string _benchmarkFileName) - { - init (_benchmarkFileName); + FlowShopBenchmarkParser(const string _benchmarkFileName) { + init(_benchmarkFileName); } - + /** * the number of machines */ - const unsigned - getM () - { + const unsigned getM() { return M; } /** * the number of jobs */ - const unsigned - getN () - { + const unsigned getN() { return N; } /** * the processing times */ - const - std::vector < - std::vector < unsigned > > - getP () - { + const std::vector< std::vector > getP() { return p; } /** * the due-dates */ - const - std::vector < unsigned > - getD () - { + const std::vector getD() { return d; } /** * printing... */ - void - printOn (ostream & _os) const - { - _os << - "M=" << - M << - " N=" << - N << - endl; - _os << - "*** processing times" << - endl; - for (unsigned i = 0; i < M; i++) - { - for (unsigned j = 0; j < N; j++) - { - _os << p[i][j] << " "; - } - _os << - endl; + void printOn(ostream& _os) const { + _os << "M=" << M << " N=" << N << endl; + _os << "*** processing times" << endl; + for (unsigned i=0; i > - p; + std::vector< std::vector > p; /** d[j] = due-date of the job j */ - std::vector < unsigned > - d; + std::vector d; /** * Initialisation of the parameters with the data contained in the benchmark file * @param const string _benchmarkFileName the name of the benchmark file */ - void - init (const string _benchmarkFileName) - { - string - buffer; + void init(const string _benchmarkFileName) { + string buffer; string::size_type start, end; - ifstream - inputFile (_benchmarkFileName.data (), ios::in); + ifstream inputFile(_benchmarkFileName.data(), ios::in); // opening of the benchmark file - if (!inputFile) - cerr << "*** ERROR : Unable to open the benchmark file '" << - _benchmarkFileName << "'" << endl; + if (! inputFile) + cerr << "*** ERROR : Unable to open the benchmark file '" << _benchmarkFileName << "'" << endl; // number of jobs (N) - getline (inputFile, buffer, '\n'); - N = atoi (buffer.data ()); + getline(inputFile, buffer, '\n'); + N = atoi(buffer.data()); // number of machines M - getline (inputFile, buffer, '\n'); - M = atoi (buffer.data ()); + getline(inputFile, buffer, '\n'); + M = atoi(buffer.data()); // initial and current seeds (not used) - getline (inputFile, buffer, '\n'); + getline(inputFile, buffer, '\n'); // processing times and due-dates - p = std::vector < std::vector < unsigned > > (M, N); - d = std::vector < unsigned >(N); + p = std::vector< std::vector > (M,N); + d = std::vector (N); // for each job... - for (unsigned j = 0; j < N; j++) - { - // index of the job (<=> j) - getline (inputFile, buffer, '\n'); - // due-date of the job j - getline (inputFile, buffer, '\n'); - d[j] = atoi (buffer.data ()); - // processing times of the job j on each machine - getline (inputFile, buffer, '\n'); - start = buffer.find_first_not_of (" "); - for (unsigned i = 0; i < M; i++) - { - end = buffer.find_first_of (" ", start); - p[i][j] = atoi (buffer.substr (start, end - start).data ()); - start = buffer.find_first_not_of (" ", end); - } + for (unsigned j=0 ; j j) + getline(inputFile, buffer, '\n'); + // due-date of the job j + getline(inputFile, buffer, '\n'); + d[j] = atoi(buffer.data()); + // processing times of the job j on each machine + getline(inputFile, buffer, '\n'); + start = buffer.find_first_not_of(" "); + for (unsigned i=0 ; i // for the creation of an evaluator #include "make_eval_FlowShop.h" // for the creation of an initializer @@ -26,42 +26,25 @@ using namespace std; // how to initialize the population #include // the stopping criterion -#include +#include // outputs (stats, population dumps, ...) -#include +#include +// evolution engine (selection and replacement) +#include // simple call to the algo #include - // checks for help demand, and writes the status file and make_help; in libutils -void make_help (eoParser & _parser); - - -/* MOEO */ -#include -#include -#include -#include -#include -#include -// evolution engine (selection and replacement) -#include - +void make_help(eoParser & _parser); /* FLOW-SHOP */ // definition of representation #include "FlowShop.h" -// definition of fitness -#include "FlowShopFitness.h" - -int -main (int argc, char *argv[]) -{ - try - { - - eoParser parser (argc, argv); // for user-parameter reading - eoState state; // to keep all things allocated +int main(int argc, char* argv[]) { + try { + + eoParser parser(argc, argv); // for user-parameter reading + eoState state; // to keep all things allocated @@ -70,11 +53,11 @@ main (int argc, char *argv[]) /*** the representation-dependent things ***/ // The fitness evaluation - eoEvalFuncCounter < FlowShop > &eval = do_make_eval (parser, state); + eoEvalFuncCounter& eval = do_make_eval(parser, state); // the genotype (through a genotype initializer) - eoInit < FlowShop > &init = do_make_genotype (parser, state); + eoInit& init = do_make_genotype(parser, state); // the variation operators - eoGenOp < FlowShop > &op = do_make_op (parser, state); + eoGenOp& op = do_make_op(parser, state); @@ -83,43 +66,16 @@ main (int argc, char *argv[]) /*** the representation-independent things ***/ // initialization of the population - eoPop < FlowShop > &pop = do_make_pop (parser, state, init); + eoPop& pop = do_make_pop(parser, state, init); // definition of the archive - moeoArchive < FlowShop > arch; + moeoArchive arch; // stopping criteria - eoContinue < FlowShop > &term = - do_make_continue_pareto (parser, state, eval); + eoContinue& term = do_make_continue_moeo(parser, state, eval); // output - eoCheckPoint < FlowShop > &checkpoint = - do_make_checkpoint_pareto (parser, state, eval, term); + eoCheckPoint& checkpoint = do_make_checkpoint_moeo(parser, state, eval, term, pop, arch); // algorithm - eoAlgo < FlowShop > &algo = - do_make_algo_MOEO (parser, state, eval, checkpoint, op, arch); - - - - - - /*** archive-related features ***/ - // update the archive every generation - moeoArchiveUpdater < FlowShop > updater (arch, pop); - checkpoint.add (updater); - // save the archive every generation in 'Res/Arch*' - moeoArchiveFitnessSavingUpdater < FlowShop > save_updater (arch); - checkpoint.add (save_updater); - // save the contribution of the non-dominated solutions in 'Res/Contribution.txt' - moeoVectorVsVectorBM < FlowShop, double >*contribution = - new moeoContributionMetric < FlowShop > (); - moeoBinaryMetricSavingUpdater < FlowShop > - contribution_updater (*contribution, arch, "Res/Contribution.txt"); - checkpoint.add (contribution_updater); - // save the entropy of the non-dominated solutions in 'Res/Entropy.txt' - moeoVectorVsVectorBM < FlowShop, double >*entropy = - new moeoEntropyMetric < FlowShop > (); - moeoBinaryMetricSavingUpdater < FlowShop > entropy_updater (*entropy, - arch, - "Res/Entropy.txt"); - checkpoint.add (entropy_updater); + eoAlgo& algo = do_make_ea_moeo(parser, state, eval, checkpoint, op, arch); + @@ -127,32 +83,36 @@ main (int argc, char *argv[]) /*** Go ! ***/ // help ? - make_help (parser); + make_help(parser); // first evalution - apply < FlowShop > (eval, pop); + apply(eval, pop); + + pop.sort(); + arch.update(pop); // printing of the initial population cout << "Initial Population\n"; - pop.sortedPrintOn (cout); + pop.sortedPrintOn(cout); cout << endl; // run the algo - do_run (algo, pop); - + do_run(algo, pop); + // printing of the final population cout << "Final Population\n"; - pop.sortedPrintOn (cout); + pop.sortedPrintOn(cout); cout << endl; // printing of the final archive cout << "Final Archive\n"; - arch.sortedPrintOn (cout); + arch.sortedPrintOn(cout); cout << endl; - } catch (exception & e) - { - cout << e.what () << endl; + + + } catch(exception& e) { + cout << e.what() << endl; } return EXIT_SUCCESS; } diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param index c70b0b1a7..a8b185228 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param @@ -2,50 +2,47 @@ ###### General ###### # --help=0 # -h : Prints this message # --stopOnUnknownParam=1 # Stop if unkown param entered -# --seed=1165485212 # -S : Random number seed +# --seed=1176819700 # -S : Random number seed ###### Evolution Engine ###### ---popSize=20 # -P : Population Size ---selCrit=NSGA-II # -S : Multi-objective selection criterion: NSGA, NSGA-II, IBEA, ParetoRanking, ParetoSharing ---nicheSize=1 # -n : Size of niche for NSGA-I or ParetoSharing ---kappa=0.05 # -k : Scaling factor kappa for IBEA ---indicator=Epsilon # -I : Binary quality indicator for IBEA : Epsilon, Hypervolume ---rho=1.1 # -r : reference point for the hypervolume calculation (must not be smaller than 1) ---selection=DetTour(2) # -s : Selection: Roulette, DetTour(T), StochTour(t) or Random ---elitism=0 # -E : Use elitism in the selection process (individuals from the archive are randomly selected) ---ratio=0.8 # Ratio from the population for elitism (must not be greater than 1) ---nbOffspring=100% # -O : Nb of offspring (percentage or absolute) ---replacement=Plus # -R : Replacement: Plus, DistinctPlus or Generational +# --popSize=20 # -P : Population Size +# --updateArch=1 # Update the archive at each gen. +# --fitness=FastNonDominatedSorting # -F : Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased +# --indicator=Epsilon # -i : Binary indicator for IndicatorBased: Epsilon, Hypervolume +# --rho=1.1 # -r : reference point for the hypervolume indicator +# --kappa=0.05 # -k : Scaling factor kappa for IndicatorBased +# --diversity=Dummy # -D : Diversity assignment scheme: Dummy or CrowdingDistance +# --comparator=FitnessThenDiversity # -C : Comparator scheme: FitnessThenDiversity or DiversityThenFitness +# --selection=DetTour(2) # -S : Selection scheme: DetTour(T), StochTour(t) or Random +# --replacement=Elitist # -R : Replacement scheme: Elitist, Environmental or Generational +# --nbOffspring=100% # -O : Number of offspring (percentage or absolute) ###### Output ###### ---useEval=1 # Use nb of eval. as counter (vs nb of gen.) ---printPop=0 # Print sorted pop. every gen. - -###### Output - Disk ###### ---resDir=Res # Directory to store DISK outputs ---eraseDir=1 # erase files in dirName if any ---frontFileFrequency=1(0,1) # File save frequency in objective spaces (std::pairs of comma-separated objectives in 1 single parentheses std::pair) - -###### Output - Graphical ###### ---plotFront=0 # Objective plots (requires corresponding files - see frontFileFrequency +# --resDir=Res # Directory to store DISK outputs +# --eraseDir=1 # erase files in dirName if any +# --printPop=0 # Print sorted pop. every gen. +# --storeArch=0 # Store the archive's objective vectors at each gen. +# --contribution=0 # Store the contribution of the archive at each gen. +# --entropy=0 # Store the entropy of the archive at each gen. ###### Persistence ###### # --Load= # -L : A save file to restart from ---recomputeFitness=0 # -r : Recompute the fitness after re-loading the pop.? ---saveFrequency=0 # Save every F generation (0 = only final state, absent = never) ---saveTimeInterval=0 # Save every T seconds (0 or absent = never) ---status=./FlowShopEA.status # Status file +# --recomputeFitness=0 # -r : Recompute the fitness after re-loading the pop.? +# --saveFrequency=0 # Save every F generation (0 = only final state, absent = never) +# --saveTimeInterval=0 # Save every T seconds (0 or absent = never) +# --status=./FlowShopEA.status # Status file ###### Representation ###### ---BenchmarkFile=benchmarks/020_05_01.txt # -B : Benchmark file name (benchmarks are available at www.lifl.fr/~basseur/BenchsUncertain/) REQUIRED +--BenchmarkFile=benchmarks/020_10_01.txt # -B : Benchmark file name (benchmarks are available at www.lifl.fr/~basseur/BenchsUncertain/) REQUIRED ###### Stopping criterion ###### ---maxGen=100 # -G : Maximum number of generations () = none) ---CtrlC=1 # -C : Terminate current generation upon Ctrl C +# --maxGen=100 # -G : Maximum number of generations (0 = none) +# --maxEval=0 # -E : Maximum number of evaluations (0 = none) +# --CtrlC=1 # -C : Terminate current generation upon Ctrl C ###### Variation Operators ###### ---crossRate=1 # Relative rate for the only crossover ---shiftMutRate=0.5 # Relative rate for shift mutation ---exchangeMutRate=0.5 # Relative rate for exchange mutation ---pCross=0.25 # -c : Probability of Crossover ---pMut=0.35 # -m : Probability of Mutation +# --crossRate=1 # Relative rate for the only crossover +# --shiftMutRate=0.5 # Relative rate for shift mutation +# --exchangeMutRate=0.5 # Relative rate for exchange mutation +# --pCross=0.25 # -c : Probability of Crossover +# --pMut=0.35 # -m : Probability of Mutation diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h index 10754ccaf..049474001 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // FlowShopEval.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,22 +10,17 @@ */ //----------------------------------------------------------------------------- -#ifndef _FlowShopEval_h -#define _FlowShopEval_h - -// Flow-shop fitness -#include "FlowShopFitness.h" -// include the base definition of eoEvalFunc -#include - +#ifndef FLOWSHOPEVAL_H_ +#define FLOWSHOPEVAL_H_ +#include "FlowShop.h" +#include /** * Functor * Computation of the multi-objective evaluation of a FlowShop object */ -class FlowShopEval:public eoEvalFunc < FlowShop > -{ +class FlowShopEval : public moeoEvalFunc { public: @@ -36,60 +31,56 @@ public: * @param _p the processing times * @param _d the due dates */ - FlowShopEval (const unsigned _M, const unsigned _N, - const vector < vector < unsigned > >&_p, - const vector < unsigned >&_d):M (_M), N (_N), p (_p), d (_d) - { + FlowShopEval(const unsigned _M, const unsigned _N, const vector< vector > & _p, const vector & _d) : + M(_M), N (_N), p(_p), d(_d){ unsigned nObjs = 2; - std::vector < bool > bObjs (nObjs, false); - eoVariableParetoTraits::setUp (nObjs, bObjs); + std::vector bObjs(nObjs, true); + moeoObjectiveVectorTraits::setup(nObjs, bObjs); } - + /** * computation of the multi-objective evaluation of an eoFlowShop object * @param FlowShop & _eo the FlowShop object to evaluate */ - void operator () (FlowShop & _eo) - { - FlowShopFitness fitness; - fitness[0] = tardiness (_eo); - fitness[1] = makespan (_eo); - _eo.fitness (fitness); + void operator()(FlowShop & _eo) { + FlowShopObjectiveVector objVector; + objVector[0] = tardiness(_eo); + objVector[1] = makespan(_eo); + _eo.objectiveVector(objVector); } + - -private: +private: /** number of machines */ - unsigned M; + unsigned M; /** number of jobs */ unsigned N; /** p[i][j] = processing time of job j on machine i */ - std::vector < std::vector < unsigned > >p; + std::vector< std::vector > p; /** d[j] = due-date of the job j */ - std::vector < unsigned >d; - + std::vector d; + /** * computation of the makespan * @param FlowShop _eo the FlowShop object to evaluate */ - double makespan (FlowShop _eo) - { + double makespan(FlowShop _eo) { // the scheduling to evaluate - vector < unsigned >scheduling = _eo.getScheduling (); + vector scheduling = _eo.getScheduling(); // completion times computation for each job on each machine // C[i][j] = completion of the jth job of the scheduling on the ith machine - std::vector < std::vector < unsigned > >C = completionTime (_eo); + std::vector< std::vector > C = completionTime(_eo); // fitness == C[M-1][scheduling[N-1]]; - return C[M - 1][scheduling[N - 1]]; + return C[M-1][scheduling[N-1]]; } @@ -98,49 +89,41 @@ private: * computation of the tardiness * @param _eo the FlowShop object to evaluate */ - double tardiness (FlowShop _eo) - { + double tardiness(FlowShop _eo) { // the scheduling to evaluate - vector < unsigned >scheduling = _eo.getScheduling (); + vector scheduling = _eo.getScheduling(); // completion times computation for each job on each machine // C[i][j] = completion of the jth job of the scheduling on the ith machine - std::vector < std::vector < unsigned > >C = completionTime (_eo); + std::vector< std::vector > C = completionTime(_eo); // tardiness computation unsigned long sum = 0; - for (unsigned j = 0; j < N; j++) - sum += - (unsigned) std::max (0, - (int) (C[M - 1][scheduling[j]] - - d[scheduling[j]])); + for (unsigned j=0 ; j >completionTime (FlowShop _eo) - { - vector < unsigned >scheduling = _eo.getScheduling (); - std::vector < std::vector < unsigned > >C (M, N); + std::vector< std::vector > completionTime(FlowShop _eo) { + vector scheduling = _eo.getScheduling(); + std::vector< std::vector > C(M,N); C[0][scheduling[0]] = p[0][scheduling[0]]; - for (unsigned j = 1; j < N; j++) - C[0][scheduling[j]] = C[0][scheduling[j - 1]] + p[0][scheduling[j]]; - for (unsigned i = 1; i < M; i++) - C[i][scheduling[0]] = C[i - 1][scheduling[0]] + p[i][scheduling[0]]; - for (unsigned i = 1; i < M; i++) - for (unsigned j = 1; j < N; j++) - C[i][scheduling[j]] = - std::max (C[i][scheduling[j - 1]], - C[i - 1][scheduling[j]]) + p[i][scheduling[j]]; - return C; + for (unsigned j=1; j - - -/** - * definition of the fitness for multi-objective flow-shop problems - */ -typedef eoParetoFitness < eoVariableParetoTraits > FlowShopFitness; - -#endif diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopInit.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopInit.h index 616b52c39..9ed0270f1 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopInit.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopInit.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // FlowShopInit.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,18 +10,17 @@ */ //----------------------------------------------------------------------------- -#ifndef _FlowShopInit_h -#define _FlowShopInit_h +#ifndef FLOWSHOPINIT_H_ +#define FLOWSHOPINIT_H_ #include - +#include "FlowShop.h" /** * Functor * Initialisation of a random genotype built by the default constructor of the eoFlowShop class */ -class FlowShopInit:public eoInit < FlowShop > -{ +class FlowShopInit: public eoInit { public: @@ -29,40 +28,37 @@ public: * constructor * @param const unsigned _N the number of jobs to schedule */ - FlowShopInit (const unsigned _N) - { + FlowShopInit(const unsigned _N) { N = _N; } - + /** * randomize a genotype * @param FlowShop & _genotype a genotype that has been default-constructed */ - void operator () (FlowShop & _genotype) - { + void operator()(FlowShop & _genotype) { // scheduling vector - vector < unsigned >scheduling (N); + vector scheduling(N); // initialisation of possible values - vector < unsigned >possibles (N); - for (unsigned i = 0; i < N; i++) + vector possibles(N); + for(unsigned i=0 ; i +#include "FlowShop.h" /** * Functor * Quadratic crossover operator for flow-shop (modify the both genotypes) */ -class FlowShopOpCrossoverQuad:public eoQuadOp < FlowShop > -{ - -public: - +class FlowShopOpCrossoverQuad: public eoQuadOp { + +public: + /** * default constructor - */ - FlowShopOpCrossoverQuad () - { - } - + */ + FlowShopOpCrossoverQuad() {} + /** * the class name (used to display statistics) */ - string className () const - { + string className() const { return "FlowShopOpCrossoverQuad"; } - + /** * eoQuad crossover - _genotype1 and _genotype2 are the (future) offspring, i.e. _copies_ of the parents * @param FlowShop & _genotype1 the first parent * @param FlowShop & _genotype2 the second parent */ - bool operator () (FlowShop & _genotype1, FlowShop & _genotype2) - { + bool operator()(FlowShop & _genotype1, FlowShop & _genotype2) { bool oneAtLeastIsModified; - + // parents - vector < unsigned >parent1 = _genotype1.getScheduling (); - vector < unsigned >parent2 = _genotype2.getScheduling (); - + vector parent1 = _genotype1.getScheduling(); + vector parent2 = _genotype2.getScheduling(); + // computation of the 2 random points unsigned point1, point2; - do - { - point1 = rng.random (min (parent1.size (), parent2.size ())); - point2 = rng.random (min (parent1.size (), parent2.size ())); - } - while (fabs ((double) point1 - point2) <= 1); - + do { + point1 = rng.random(min(parent1.size(), parent2.size())); + point2 = rng.random(min(parent1.size(), parent2.size())); + } while (fabs((double) point1-point2) <= 2); + // computation of the offspring - vector < unsigned >offspring1 = - generateOffspring (parent1, parent2, point1, point2); - vector < unsigned >offspring2 = - generateOffspring (parent2, parent1, point1, point2); - + vector offspring1 = generateOffspring(parent1, parent2, point1, point2); + vector offspring2 = generateOffspring(parent2, parent1, point1, point2); + // does at least one genotype has been modified ? - if ((parent1 != offspring1) || (parent2 != offspring2)) - { - // update - _genotype1.setScheduling (offspring1); - _genotype2.setScheduling (offspring2); - // at least one genotype has been modified - oneAtLeastIsModified = true; - } - else - { - // no genotype has been modified - oneAtLeastIsModified = false; - } + if ((parent1 != offspring1) || (parent2 != offspring2)) { + // update + _genotype1.setScheduling(offspring1); + _genotype2.setScheduling(offspring2); + // at least one genotype has been modified + oneAtLeastIsModified = true; + } + else { + // no genotype has been modified + oneAtLeastIsModified = false; + } // return 'true' if at least one genotype has been modified return oneAtLeastIsModified; } - - + + private: - + /** * generation of an offspring by a 2 points crossover * @param vector _parent1 the first parent @@ -96,43 +86,35 @@ private: * @param unsigned_point1 the first point * @param unsigned_point2 the second point */ - vector < unsigned >generateOffspring (vector < unsigned >_parent1, - vector < unsigned >_parent2, - unsigned _point1, unsigned _point2) - { - vector < unsigned >result = _parent1; - vector < bool > taken_values (result.size (), false); - if (_point1 > _point2) - swap (_point1, _point2); - + vector generateOffspring(vector _parent1, vector _parent2, unsigned _point1, unsigned _point2) { + vector result = _parent1; + vector taken_values(result.size(), false); + if (_point1 > _point2) swap(_point1, _point2); + /* first parent */ - for (unsigned i = 0; i <= _point1; i++) - { - // result[i] == _parent1[i] - taken_values[_parent1[i]] = true; - } - for (unsigned i = _point2; i < result.size (); i++) - { - // result[i] == _parent1[i] - taken_values[_parent1[i]] = true; - } - + for (unsigned i=0 ; i<=_point1 ; i++) { + // result[i] == _parent1[i] + taken_values[_parent1[i]] = true; + } + for (unsigned i=_point2 ; i - +#include "FlowShop.h" /** * Functor * Exchange mutation operator for flow-shop */ -class FlowShopOpMutationExchange:public eoMonOp < FlowShop > -{ +class FlowShopOpMutationExchange: public eoMonOp { public: /** * default constructor - */ - FlowShopOpMutationExchange () - { - } - + */ + FlowShopOpMutationExchange() {} + /** * the class name (used to display statistics) */ - string className () const - { + string className() const { return "FlowShopOpMutationExchange"; } @@ -44,39 +40,34 @@ public: * modifies the parent with an exchange mutation * @param FlowShop & _genotype the parent genotype (will be modified) */ - bool operator () (FlowShop & _genotype) - { + bool operator()(FlowShop & _genotype) { bool isModified; - + // schedulings - vector < unsigned >initScheduling = _genotype.getScheduling (); - vector < unsigned >resultScheduling = _genotype.getScheduling (); - + vector initScheduling = _genotype.getScheduling(); + vector resultScheduling = _genotype.getScheduling(); + // computation of the 2 random points unsigned point1, point2; - do - { - point1 = rng.random (resultScheduling.size ()); - point2 = rng.random (resultScheduling.size ()); - } - while (point1 == point2); - + do { + point1 = rng.random(resultScheduling.size()); + point2 = rng.random(resultScheduling.size()); + } while (point1 == point2); + // swap swap (resultScheduling[point1], resultScheduling[point2]); - + // update (if necessary) - if (resultScheduling != initScheduling) - { - // update - _genotype.setScheduling (resultScheduling); - // the genotype has been modified - isModified = true; - } - else - { - // the genotype has not been modified - isModified = false; - } + if (resultScheduling != initScheduling) { + // update + _genotype.setScheduling(resultScheduling); + // the genotype has been modified + isModified = true; + } + else { + // the genotype has not been modified + isModified = false; + } // return 'true' if the genotype has been modified return isModified; @@ -84,4 +75,4 @@ public: }; -#endif +#endif /*FLOWSHOPOPMUTATIONEXCHANGE_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h index 77ce5ec84..64949a549 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // FlowShopOpMutationShift.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,33 +10,29 @@ */ //----------------------------------------------------------------------------- -#ifndef _FlowShopOpMutationShift_h -#define _FlowShopOpMutationShift_h +#ifndef FLOWSHOPOPMUTATIONSHIFT_H_ +#define FLOWSHOPOPMUTATIONSHIFT_H_ #include - +#include "FlowShop.h" /** * Functor * Shift mutation operator for flow-shop */ -class FlowShopOpMutationShift:public eoMonOp < FlowShop > -{ +class FlowShopOpMutationShift: public eoMonOp { public: - + /** * default constructor */ - FlowShopOpMutationShift () - { - } - + FlowShopOpMutationShift() {} + /** * the class name (used to display statistics) */ - string className () const - { + string className() const { return "FlowShopOpMutationShift"; } @@ -44,49 +40,42 @@ public: * modifies the parent with a shift mutation * @param FlowShop & _genotype the parent genotype (will be modified) */ - bool operator () (FlowShop & _genotype) - { + bool operator()(FlowShop & _genotype) { bool isModified; int direction; unsigned tmp; - + // schedulings - vector < unsigned >initScheduling = _genotype.getScheduling (); - vector < unsigned >resultScheduling = initScheduling; - + vector initScheduling = _genotype.getScheduling(); + vector resultScheduling = initScheduling; + // computation of the 2 random points unsigned point1, point2; - do - { - point1 = rng.random (resultScheduling.size ()); - point2 = rng.random (resultScheduling.size ()); - } - while (point1 == point2); - + do { + point1 = rng.random(resultScheduling.size()); + point2 = rng.random(resultScheduling.size()); + } while (point1 == point2); + // direction - if (point1 < point2) - direction = 1; - else - direction = -1; + if (point1 < point2) direction = 1; + else direction = -1; // mutation tmp = resultScheduling[point1]; - for (unsigned i = point1; i != point2; i += direction) - resultScheduling[i] = resultScheduling[i + direction]; + for(unsigned i=point1 ; i!=point2 ; i+=direction) + resultScheduling[i] = resultScheduling[i+direction]; resultScheduling[point2] = tmp; - + // update (if necessary) - if (resultScheduling != initScheduling) - { - // update - _genotype.setScheduling (resultScheduling); - // the genotype has been modified - isModified = true; - } - else - { - // the genotype has not been modified - isModified = false; - } + if (resultScheduling != initScheduling) { + // update + _genotype.setScheduling(resultScheduling); + // the genotype has been modified + isModified = true; + } + else { + // the genotype has not been modified + isModified = false; + } // return 'true' if the genotype has been modified return isModified; @@ -94,4 +83,4 @@ public: }; -#endif +#endif /*FLOWSHOPOPMUTATIONSHIFT_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h index 3ab17dc1d..7545b37b8 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // make_eval_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,56 +10,46 @@ */ //----------------------------------------------------------------------------- -#ifndef _make_eval_FlowShop_h -#define _make_eval_FlowShop_h +#ifndef MAKE_EVAL_FLOWSHOP_H_ +#define MAKE_EVAL_FLOWSHOP_H_ + +#include +#include #include "FlowShop.h" #include "FlowShopBenchmarkParser.h" #include "FlowShopEval.h" -// also need the parser and param includes -#include -#include - /* * This function creates an eoEvalFuncCounter that can later be used to evaluate an individual. * @param eoParser& _parser to get user parameters * @param eoState& _state to store the memory */ -eoEvalFuncCounter < FlowShop > &do_make_eval (eoParser & _parser, - eoState & _state) -{ - +eoEvalFuncCounter & do_make_eval(eoParser& _parser, eoState& _state) { + // benchmark file name - string benchmarkFileName = - _parser.getORcreateParam (string (), "BenchmarkFile", - "Benchmark file name (benchmarks are available at " - + BENCHMARKS_WEB_SITE + ")", 'B', - "Representation", true).value (); - if (benchmarkFileName == "") - { - std::string stmp = "*** Missing name of the benchmark file\n"; - stmp += - " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; - stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; - throw std::runtime_error (stmp.c_str ()); - } + string benchmarkFileName = _parser.getORcreateParam(string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at " + BENCHMARKS_WEB_SITE + ")", 'B',"Representation", true).value(); + if (benchmarkFileName == "") { + std::string stmp = "*** Missing name of the benchmark file\n"; + stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; + stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; + throw std::runtime_error(stmp.c_str()); + } // reading of the parameters contained in the benchmark file - FlowShopBenchmarkParser fParser (benchmarkFileName); - unsigned M = fParser.getM (); - unsigned N = fParser.getN (); - std::vector < std::vector < unsigned > >p = fParser.getP (); - std::vector < unsigned >d = fParser.getD (); - + FlowShopBenchmarkParser fParser(benchmarkFileName); + unsigned M = fParser.getM(); + unsigned N = fParser.getN(); + std::vector< std::vector > p = fParser.getP(); + std::vector d = fParser.getD(); + // build of the initializer (a pointer, stored in the eoState) - FlowShopEval *plainEval = new FlowShopEval (M, N, p, d); + FlowShopEval* plainEval = new FlowShopEval(M, N, p, d); // turn that object into an evaluation counter - eoEvalFuncCounter < FlowShop > *eval = - new eoEvalFuncCounter < FlowShop > (*plainEval); + eoEvalFuncCounter* eval = new eoEvalFuncCounter (* plainEval); // store in state - _state.storeFunctor (eval); + _state.storeFunctor(eval); // and return a reference return *eval; } -#endif +#endif /*MAKE_EVAL_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h index 771377183..157481f36 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // make_genotype_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,49 +10,40 @@ */ //----------------------------------------------------------------------------- -#ifndef _make_genotype_FlowShop_h -#define _make_genotype_FlowShop_h +#ifndef MAKE_GENOTYPE_FLOWSHOP_H_ +#define MAKE_GENOTYPE_FLOWSHOP_H_ +#include +#include #include "FlowShop.h" #include "FlowShopInit.h" #include "FlowShopBenchmarkParser.h" -// also need the parser and param includes -#include -#include - /* * This function creates an eoInit that can later be used to initialize the population (see make_pop.h). * @param eoParser& _parser to get user parameters * @param eoState& _state to store the memory */ -eoInit < FlowShop > &do_make_genotype (eoParser & _parser, eoState & _state) -{ - +eoInit & do_make_genotype(eoParser& _parser, eoState& _state) { + // benchmark file name - string benchmarkFileName = - _parser.getORcreateParam (string (), "BenchmarkFile", - "Benchmark file name (benchmarks are available at " - + BENCHMARKS_WEB_SITE + ")", 'B', - "Representation", true).value (); - if (benchmarkFileName == "") - { - std::string stmp = "*** Missing name of the benchmark file\n"; - stmp += - " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; - stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; - throw std::runtime_error (stmp.c_str ()); - } + string benchmarkFileName = _parser.getORcreateParam(string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at " + BENCHMARKS_WEB_SITE + ")", 'B',"Representation", true).value(); + if (benchmarkFileName == "") { + std::string stmp = "*** Missing name of the benchmark file\n"; + stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; + stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; + throw std::runtime_error(stmp.c_str()); + } // reading of number of jobs to schedule contained in the benchmark file - FlowShopBenchmarkParser fParser (benchmarkFileName); - unsigned N = fParser.getN (); + FlowShopBenchmarkParser fParser(benchmarkFileName); + unsigned N = fParser.getN(); // build of the initializer (a pointer, stored in the eoState) - eoInit < FlowShop > *init = new FlowShopInit (N); + eoInit* init = new FlowShopInit(N); // store in state - _state.storeFunctor (init); + _state.storeFunctor(init); // and return a reference return *init; } -#endif +#endif /*MAKE_GENOTYPE_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h index 6581838f1..23c05c72d 100644 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h +++ b/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // make_op_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006 +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,122 +10,97 @@ */ //----------------------------------------------------------------------------- -#ifndef _make_op_FlowShop_h -#define _make_op_FlowShop_h +#ifndef MAKE_OP_FLOWSHOP_H_ +#define MAKE_OP_FLOWSHOP_H_ -// the operators +#include +#include #include #include #include #include -// combinations of simple eoOps (eoMonOp and eoQuadOp) #include - -// definition of crossover #include "FlowShopOpCrossoverQuad.h" -// definition of mutation #include "FlowShopOpMutationShift.h" #include "FlowShopOpMutationExchange.h" -// also need the parser and state includes -#include -#include - - /* * This function builds the operators that will be applied to the eoFlowShop * @param eoParameterLoader& _parser to get user parameters * @param eoState& _state to store the memory */ -eoGenOp < FlowShop > &do_make_op (eoParameterLoader & _parser, - eoState & _state) -{ - +eoGenOp & do_make_op(eoParameterLoader& _parser, eoState& _state) { + ///////////////////////////// // Variation operators //////////////////////////// - + // the crossover //////////////// // a first crossover - eoQuadOp < FlowShop > *cross = new FlowShopOpCrossoverQuad; + eoQuadOp *cross = new FlowShopOpCrossoverQuad; // store in the state - _state.storeFunctor (cross); - + _state.storeFunctor(cross); + // relative rate in the combination - double cross1Rate = _parser.createParam (1.0, "crossRate", - "Relative rate for the only crossover", - 0, - "Variation Operators").value (); + double cross1Rate = _parser.createParam(1.0, "crossRate", "Relative rate for the only crossover", 0, "Variation Operators").value(); // creation of the combined operator with this one - eoPropCombinedQuadOp < FlowShop > *propXover = - new eoPropCombinedQuadOp < FlowShop > (*cross, cross1Rate); + eoPropCombinedQuadOp *propXover = new eoPropCombinedQuadOp(*cross, cross1Rate); // store in the state - _state.storeFunctor (propXover); - + _state.storeFunctor(propXover); + // the mutation /////////////// - + // a first mutation : the shift mutation - eoMonOp < FlowShop > *mut = new FlowShopOpMutationShift; - _state.storeFunctor (mut); + eoMonOp *mut = new FlowShopOpMutationShift; + _state.storeFunctor(mut); // its relative rate in the combination - double mut1Rate = _parser.createParam (0.5, "shiftMutRate", - "Relative rate for shift mutation", - 0, - "Variation Operators").value (); + double mut1Rate = _parser.createParam(0.5, "shiftMutRate", "Relative rate for shift mutation", 0, "Variation Operators").value(); // creation of the combined operator with this one - eoPropCombinedMonOp < FlowShop > *propMutation = - new eoPropCombinedMonOp < FlowShop > (*mut, mut1Rate); - _state.storeFunctor (propMutation); - + eoPropCombinedMonOp *propMutation = new eoPropCombinedMonOp(*mut, mut1Rate); + _state.storeFunctor(propMutation); + // a second mutation : the exchange mutation mut = new FlowShopOpMutationExchange; - _state.storeFunctor (mut); + _state.storeFunctor(mut); // its relative rate in the combination - double mut2Rate = _parser.createParam (0.5, "exchangeMutRate", - "Relative rate for exchange mutation", - 0, - "Variation Operators").value (); + double mut2Rate = _parser.createParam(0.5, "exchangeMutRate", "Relative rate for exchange mutation", 0, "Variation Operators").value(); // addition of this one to the combined operator - propMutation->add (*mut, mut2Rate); + propMutation -> add(*mut, mut2Rate); // end of crossover and mutation definitions //////////////////////////////////////////// - + // First read the individual level parameters - eoValueParam < double >&pCrossParam = - _parser.createParam (0.25, "pCross", "Probability of Crossover", 'c', - "Variation Operators"); + eoValueParam& pCrossParam = _parser.createParam(0.25, "pCross", "Probability of Crossover", 'c', "Variation Operators" ); // minimum check - if ((pCrossParam.value () < 0) || (pCrossParam.value () > 1)) - throw runtime_error ("Invalid pCross"); + if ( (pCrossParam.value() < 0) || (pCrossParam.value() > 1) ) + throw runtime_error("Invalid pCross"); - eoValueParam < double >&pMutParam = - _parser.createParam (0.35, "pMut", "Probability of Mutation", 'm', - "Variation Operators"); + eoValueParam& pMutParam = _parser.createParam(0.35, "pMut", "Probability of Mutation", 'm', "Variation Operators" ); // minimum check - if ((pMutParam.value () < 0) || (pMutParam.value () > 1)) - throw runtime_error ("Invalid pMut"); - + if ( (pMutParam.value() < 0) || (pMutParam.value() > 1) ) + throw runtime_error("Invalid pMut"); + // the crossover - with probability pCross - eoProportionalOp < FlowShop > *propOp = new eoProportionalOp < FlowShop >; - _state.storeFunctor (propOp); - eoQuadOp < FlowShop > *ptQuad = new eoQuadCloneOp < FlowShop >; - _state.storeFunctor (ptQuad); - propOp->add (*propXover, pCrossParam.value ()); // crossover, with proba pcross - propOp->add (*ptQuad, 1 - pCrossParam.value ()); // nothing, with proba 1-pcross - + eoProportionalOp * propOp = new eoProportionalOp ; + _state.storeFunctor(propOp); + eoQuadOp *ptQuad = new eoQuadCloneOp; + _state.storeFunctor(ptQuad); + propOp -> add(*propXover, pCrossParam.value()); // crossover, with proba pcross + propOp -> add(*ptQuad, 1-pCrossParam.value()); // nothing, with proba 1-pcross + // now the sequential - eoSequentialOp < FlowShop > *op = new eoSequentialOp < FlowShop >; - _state.storeFunctor (op); - op->add (*propOp, 1.0); // always do combined crossover - op->add (*propMutation, pMutParam.value ()); // then mutation, with proba pmut + eoSequentialOp *op = new eoSequentialOp; + _state.storeFunctor(op); + op -> add(*propOp, 1.0); // always do combined crossover + op -> add(*propMutation, pMutParam.value()); // then mutation, with proba pmut // return a reference return *op; } -#endif +#endif /*MAKE_OP_FLOWSHOP_H_*/