void DSMGA2::backMixingE(Chromosome& source, list<int>& mask, Chromosome& des) { cout <<"_bme"; Chromosome trial(ell); trial = des; for (list<int>::iterator it = mask.begin(); it != mask.end(); ++it) trial.setVal(*it, source.getVal(*it)); if (trial.getFitness() > des.getFitness()) { pHash.erase(des.getKey()); pHash[trial.getKey()] = trial.getFitness(); EQ = false; //des.getIndex()++; des = trial; return; } if (trial.getFitness() >= des.getFitness()) { pHash.erase(des.getKey()); pHash[trial.getKey()] = trial.getFitness(); des = trial; return; } }
bool DSMGA2::restrictedMixing(Chromosome& ch, list<int>& mask) { cout << "_rmbool"<<endl; bool taken = false; size_t lastUB = 0; for (size_t ub = 1; ub <= mask.size(); ++ub) { size_t size = 1; Chromosome trial(ell); trial = ch; for (list<int>::iterator it = mask.begin(); it != mask.end(); ++it) { trial.flip(*it); ++size; if (size > ub) break; } if (isInP(trial)) continue; if (trial.getFitness() >= ch.getFitness()) { pHash.erase(ch.getKey()); pHash[trial.getKey()] = trial.getFitness(); taken = true; ch = trial; } if (taken) { lastUB = ub; break; } } if (lastUB != 0) { while (mask.size() > lastUB) mask.pop_back(); } return taken; }
inline bool DSMGA2::isInP(const Chromosome& ch) const { unordered_map<unsigned long, double>::const_iterator it = pHash.find(ch.getKey()); return (it != pHash.end()); }