00001
00002
00003
00004
00005
00006
00007
00008
00009
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
00029
00030
00031
00032 eoGenOp<FlowShop> & do_make_op(eoParameterLoader& _parser, eoState& _state)
00033 {
00034
00036
00038
00039
00041
00042
00043 eoQuadOp<FlowShop> *cross = new FlowShopOpCrossoverQuad;
00044
00045 _state.storeFunctor(cross);
00046
00047
00048 double cross1Rate = _parser.createParam(1.0, "crossRate", "Relative rate for the only crossover", 0, "Variation Operators").value();
00049
00050 eoPropCombinedQuadOp<FlowShop> *propXover = new eoPropCombinedQuadOp<FlowShop>(*cross, cross1Rate);
00051
00052 _state.storeFunctor(propXover);
00053
00054
00055
00057
00058
00059 eoMonOp<FlowShop> *mut = new FlowShopOpMutationShift;
00060 _state.storeFunctor(mut);
00061
00062 double mut1Rate = _parser.createParam(0.5, "shiftMutRate", "Relative rate for shift mutation", 0, "Variation Operators").value();
00063
00064 eoPropCombinedMonOp<FlowShop> *propMutation = new eoPropCombinedMonOp<FlowShop>(*mut, mut1Rate);
00065 _state.storeFunctor(propMutation);
00066
00067
00068 mut = new FlowShopOpMutationExchange;
00069 _state.storeFunctor(mut);
00070
00071 double mut2Rate = _parser.createParam(0.5, "exchangeMutRate", "Relative rate for exchange mutation", 0, "Variation Operators").value();
00072
00073 propMutation -> add(*mut, mut2Rate);
00074
00075
00077
00078
00079 eoValueParam<double>& pCrossParam = _parser.createParam(0.25, "pCross", "Probability of Crossover", 'c', "Variation Operators" );
00080
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
00086 if ( (pMutParam.value() < 0) || (pMutParam.value() > 1) )
00087 throw std::runtime_error("Invalid pMut");
00088
00089
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());
00095 propOp -> add(*ptQuad, 1-pCrossParam.value());
00096
00097
00098 eoSequentialOp<FlowShop> *op = new eoSequentialOp<FlowShop>;
00099 _state.storeFunctor(op);
00100 op -> add(*propOp, 1.0);
00101 op -> add(*propMutation, pMutParam.value());
00102
00103
00104 return *op;
00105 }
00106
00107 #endif