make_op_FlowShop.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00003 //-----------------------------------------------------------------------------
00004 // make_op_FlowShop.h
00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
00006 /*
00007     This library...
00008 
00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
00010  */
00011 //-----------------------------------------------------------------------------
00012 
00013 #ifndef MAKE_OP_FLOWSHOP_H_
00014 #define MAKE_OP_FLOWSHOP_H_
00015 
00016 #include <utils/eoParser.h>
00017 #include <utils/eoState.h>
00018 #include <eoOp.h>
00019 #include <eoGenOp.h>
00020 #include <eoCloneOps.h>
00021 #include <eoOpContainer.h>
00022 #include <eoProportionalCombinedOp.h>
00023 #include <FlowShopOpCrossoverQuad.h>
00024 #include <FlowShopOpMutationShift.h>
00025 #include <FlowShopOpMutationExchange.h>
00026 
00027 /*
00028  * This function builds the operators that will be applied to the eoFlowShop
00029  * @param eoParameterLoader& _parser to get user parameters
00030  * @param eoState& _state to store the memory
00031  */
00032 eoGenOp<FlowShop> & do_make_op(eoParameterLoader& _parser, eoState& _state)
00033 {
00034 
00036     // Variation operators
00038 
00039     // the crossover
00041 
00042     // a first crossover
00043     eoQuadOp<FlowShop> *cross = new FlowShopOpCrossoverQuad;
00044     // store in the state
00045     _state.storeFunctor(cross);
00046 
00047     // relative rate in the combination
00048     double cross1Rate = _parser.createParam(1.0, "crossRate", "Relative rate for the only crossover", 0, "Variation Operators").value();
00049     // creation of the combined operator with this one
00050     eoPropCombinedQuadOp<FlowShop> *propXover = new eoPropCombinedQuadOp<FlowShop>(*cross, cross1Rate);
00051     // store in the state
00052     _state.storeFunctor(propXover);
00053 
00054 
00055     // the mutation
00057 
00058     // a first mutation : the shift mutation
00059     eoMonOp<FlowShop> *mut = new FlowShopOpMutationShift;
00060     _state.storeFunctor(mut);
00061     // its relative rate in the combination
00062     double mut1Rate = _parser.createParam(0.5, "shiftMutRate", "Relative rate for shift mutation", 0, "Variation Operators").value();
00063     // creation of the combined operator with this one
00064     eoPropCombinedMonOp<FlowShop> *propMutation = new eoPropCombinedMonOp<FlowShop>(*mut, mut1Rate);
00065     _state.storeFunctor(propMutation);
00066 
00067     // a second mutation : the exchange mutation
00068     mut = new FlowShopOpMutationExchange;
00069     _state.storeFunctor(mut);
00070     // its relative rate in the combination
00071     double mut2Rate = _parser.createParam(0.5, "exchangeMutRate", "Relative rate for exchange mutation", 0, "Variation Operators").value();
00072     // addition of this one to the combined operator
00073     propMutation -> add(*mut, mut2Rate);
00074 
00075     // end of crossover and mutation definitions
00077 
00078     // First read the individual level parameters
00079     eoValueParam<double>& pCrossParam = _parser.createParam(0.25, "pCross", "Probability of Crossover", 'c', "Variation Operators" );
00080     // minimum check
00081     if ( (pCrossParam.value() < 0) || (pCrossParam.value() > 1) )
00082         throw std::runtime_error("Invalid pCross");
00083 
00084     eoValueParam<double>& pMutParam = _parser.createParam(0.35, "pMut", "Probability of Mutation", 'm', "Variation Operators" );
00085     // minimum check
00086     if ( (pMutParam.value() < 0) || (pMutParam.value() > 1) )
00087         throw std::runtime_error("Invalid pMut");
00088 
00089     // the crossover - with probability pCross
00090     eoProportionalOp<FlowShop> * propOp = new eoProportionalOp<FlowShop> ;
00091     _state.storeFunctor(propOp);
00092     eoQuadOp<FlowShop> *ptQuad = new eoQuadCloneOp<FlowShop>;
00093     _state.storeFunctor(ptQuad);
00094     propOp -> add(*propXover, pCrossParam.value()); // crossover, with proba pcross
00095     propOp -> add(*ptQuad, 1-pCrossParam.value()); // nothing, with proba 1-pcross
00096 
00097     // now the sequential
00098     eoSequentialOp<FlowShop> *op = new eoSequentialOp<FlowShop>;
00099     _state.storeFunctor(op);
00100     op -> add(*propOp, 1.0);     // always do combined crossover
00101     op -> add(*propMutation, pMutParam.value()); // then mutation, with proba pmut
00102 
00103     // return a reference
00104     return *op;
00105 }
00106 
00107 #endif /*MAKE_OP_FLOWSHOP_H_*/

Generated on Mon Oct 8 10:35:51 2007 for ParadisEO-MOEOMovingObjects by  doxygen 1.4.7