00001 #include "ECF_base.h"
00002 #include "ECF_derived.h"
00003 #include "ECF_macro.h"
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 HybridOrthogonalCrossover::HybridOrthogonalCrossover()
00018 {
00019
00020 name_ = "HybridOrthogonalCrossover";
00021
00022
00023 selRandomOp = static_cast<SelectionOperatorP> (new SelRandomOp);
00024 selWorstOp = static_cast<SelectionOperatorP> (new SelWorstOp);
00025 selBestOp = static_cast<SelectionOperatorP> (new SelBestOp);
00026 }
00027
00028
00029 void HybridOrthogonalCrossover::registerParameters(StateP state)
00030 {
00031 registerParameter(state, "hybcrxprob", (voidP) new uint(3), ECF::UINT);
00032 registerParameter(state, "preservebestparent", (voidP) new uint(3), ECF::UINT);
00033 }
00034
00035
00036 bool HybridOrthogonalCrossover::initialize(StateP state)
00037 {
00038
00039 voidP hybcrxprobp = getParameterValue(state, "hybcrxprob");
00040 nCrxProb_ = *((uint*) hybcrxprobp.get());
00041
00042 voidP preservebestparentp = getParameterValue(state, "preservebestparent");
00043 elitism = *((uint*) preservebestparentp.get());
00044
00045
00046 selRandomOp->initialize(state);
00047 selWorstOp->initialize(state);
00048 selBestOp->initialize(state);
00049
00050 return true;
00051 }
00052
00053
00054 bool HybridOrthogonalCrossover::advanceGeneration(StateP state, DemeP deme)
00055 {
00056
00057 uint oa[8][6]={{1,1,1,1,1,1},{1,1,1,2,2,2},{1,2,2,1,1,2},{1,2,2,2,2,1},{2,1,2,1,2,1},{2,1,2,2,1,2},{2,2,1,1,2,2},{2,2,1,2,1,1}};
00058 uint m=8;
00059 uint k=6;
00060 uint parentNumber=2;
00061
00062
00063
00064 for(uint iIter = 0; iIter < deme->size(); iIter++) {
00065
00066 std::vector<IndividualP> parents;
00067 std::vector<IndividualP> offspring;
00068
00069 for (uint i = 0; i < parentNumber; i++) {
00070 if (nCrxProb_ > 0) {
00071 uint chooseParentNum = state->getRandomizer()->getRandomInteger(deme->size());
00072 double prob = state->getRandomizer()->getRandomDouble();
00073 if ( prob > nCrxProb_)
00074 parents.push_back(deme->at(i));
00075
00076 else
00077 parents.push_back(selRandomOp->select(*deme));
00078 }
00079 else
00080 parents.push_back(selRandomOp->select(*deme));
00081 }
00082
00083 IndividualP parent1, parent2;
00084
00085 parent1 = parents[0];
00086 parent2 = parents[1];
00087
00088 IndividualP child = (IndividualP) parent1->copy();
00089
00090 for (uint w = 0; w < m; w++) {
00091 for (uint z = 0; z < parent1->size(); z++) {
00092 if (oa[w][z]==1)
00093 child->at(z) = (GenotypeP) parent1->getGenotype(z)->copy();
00094 else
00095 child->at(z) = (GenotypeP) parent2->getGenotype(z)->copy();
00096 }
00097 mutate(child);
00098 evaluate(child);
00099 offspring.push_back(child);
00100 }
00101
00102 IndividualP theBest = selBestOp->select(offspring);
00103
00104 if (elitism == 0) {
00105 replaceWith(parent1, theBest);
00106 IndividualP theWorst = selWorstOp->select(offspring);
00107 replaceWith(theBest, theWorst);
00108 theBest = selBestOp->select(offspring);
00109 replaceWith(parent2, theBest);
00110 }
00111 else {
00112 replaceWith(parent1, theBest);
00113 theBest = selBestOp->select(parents);
00114 replaceWith(parent2, theBest);
00115 }
00116
00117 }
00118
00119 return true;
00120 }