// select mPopulationSize individuals bool COptMethodGA::select() { unsigned C_INT32 i, j, nopp, opp; unsigned C_INT32 TotalPopulation = 2 * mPopulationSize; // tournament competition mLosses = 0; // Set all wins to 0. // compete with ~ 20% of the TotalPopulation nopp = std::max<unsigned C_INT32>(1, mPopulationSize / 5); // parents and offspring are all in competition for (i = 0; i < TotalPopulation; i++) for (j = 0; j < nopp; j++) { // get random opponent opp = mpRandom->getRandomU(TotalPopulation - 1); if (mValue[i] < mValue[opp]) mLosses[opp]++; else mLosses[i]++; } // selection of top mPopulationSize winners partialSortWithPivot(mLosses.array(), mLosses.array() + mPopulationSize, mLosses.array() + TotalPopulation, mPivot); FSwapClass<COptMethodGA, unsigned C_INT32, bool> Swap(this, &COptMethodGA::swap); applyPartialPivot(mPivot, mPopulationSize, Swap); return true; }
bool COptMethodEP::select() { size_t i, j, nopp, opp; size_t TotalPopulation = 2 * mPopulationSize; // tournament competition mLosses = 0; // Set all losses to 0. // compete with ~ 20% of the TotalPopulation nopp = std::max<size_t>(1, mPopulationSize / 5); // parents and offspring are all in competition for (i = 0; i < TotalPopulation; i++) for (j = 0; j < nopp; j++) { // get random opponent do { opp = mpRandom->getRandomU((unsigned C_INT32)(TotalPopulation - 1)); } while (i == opp); if (mValue[i] < mValue[opp]) mLosses[opp]++; else mLosses[i]++; } partialSortWithPivot(mLosses.array(), mLosses.array() + mPopulationSize, mLosses.array() + TotalPopulation, mPivot); FSwapClass<COptMethodEP, size_t, bool> Swap(this, &COptMethodEP::swap); applyPartialPivot(mPivot, mPopulationSize, Swap); return true; }