7 selFitPropOp = (SelFitnessProportionalOpP)(
new SelFitnessProportionalOp);
8 selBestOp = (SelBestOpP)(
new SelBestOp);
9 selRandomOp = (SelRandomOpP)(
new SelRandomOp);
14 registerParameter(state,
"crxprob", (voidP)
new double(0.5), ECF::DOUBLE,
"crossover rate");
16 "selection pressure: how much is the best individual 'better' than the worst");
17 registerParameter(state,
"inv.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"inversion rate");
18 registerParameter(state,
"erc.inv.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"ERC inversion rate");
19 registerParameter(state,
"trans.is.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"IS transposition rate");
20 registerParameter(state,
"trans.ris.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"RIS transposition rate");
21 registerParameter(state,
"trans.gene.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"gene transposition rate");
22 registerParameter(state,
"trans.erc.prob", (voidP)
new double(0.1), ECF::DOUBLE,
"ERC transposition rate");
23 registerParameter(state,
"trans.max.length", (voidP)
new double(3), ECF::DOUBLE,
"maximum length of the transposition sequence");
24 registerParameter(state,
"inv.max.length", (voidP)
new double(3), ECF::DOUBLE,
"maximum length of the inversion sequence");
29 selFitPropOp->initialize(state);
30 selFitPropOp->setSelPressure(10);
31 selBestOp->initialize(state);
32 selRandomOp->initialize(state);
35 crxRate_ = *((
double*)crRateP.get());
42 invRate_ = *((
double*)invRateP.get());
66 if (state->getGenotypes()[0]->getName() != gen->getName()){
67 ECF_LOG_ERROR(state,
"Error: this algorithm accepts only a single GEPChromosome genotype.");
77 IndividualP best = selBestOp->select(*deme);
81 std::vector<IndividualP> wheel;
82 wheel = selFitPropOp->selectMany(*deme, (uint)deme->size());
85 for (uint i = 0; i < wheel.size(); ++i)
86 wheel[i] =
copy(wheel[i]);
89 for (uint i = 0; i < deme->size(); i++)
92 ECF_LOG(state, 5,
"Selected individuals:");
93 for (uint i = 0; i < deme->size(); i++){
94 ECF_LOG(state, 5, dbl2str(deme->at(i)->fitness->getValue()));
98 uint noCrx = (int)(deme->size() *
crxRate_ / 2);
101 for (uint i = 0; i < noCrx; i++){
104 IndividualP parent1 = selRandomOp->select(*deme);
105 IndividualP parent2 = selRandomOp->select(*deme);
106 ECF_LOG(state, 5,
"Parents: " + dbl2str(parent1->fitness->getValue()) +
", " + dbl2str(parent2->fitness->getValue()));
109 IndividualP child1 =
copy(parent1);
110 IndividualP child2 =
copy(parent2);
113 mate(parent1, parent2, child1);
114 mate(parent1, parent2, child2);
125 invert(state, *deme);
126 invertDc(state, *deme);
128 transpose(state, *deme);
130 for (uint i = 0; i < deme->size(); i++)
131 if (!deme->at(i)->fitness->isValid()) {
136 IndividualP random = selRandomOp->select(*deme);
137 if (best->fitness->isBetterThan(random->fitness))
143void AlgGEP::invert(StateP state,
const std::vector<IndividualP>& pool)
145 for (uint i = 0; i < pool.size(); i++) {
146 if (state_->getRandomizer()->getRandomDouble() <=
invRate_) {
148 ECF_LOG(state, 5,
"Inverting individual: \n" + pool.at(i)->toString());
150 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
151 pool.at(i)->fitness->setInvalid();
152 uint invGene = state_->getRandomizer()->getRandomInteger(individual->genes);
153 uint geneOffset = invGene * (individual->geneLength);
156 uint bitInv = state_->getRandomizer()->getRandomInteger(individual->headLength);
157 uint bitInvSecond, tmp;
160 bitInvSecond = state_->getRandomizer()->getRandomInteger(individual->headLength);
161 }
while (bitInv == bitInvSecond);
163 if (bitInv>bitInvSecond)
166 bitInv = bitInvSecond;
174 ECF_LOG(state, 5,
"Inverting the sequence in gene ["+uint2str(invGene)+
"] from point (" + uint2str(bitInv) +
") to point (" + uint2str(bitInvSecond) +
")");
176 std::vector<Tree::NodeP> seq;
177 for (
int j = (geneOffset + bitInvSecond); j >= (int) (geneOffset + bitInv); j--){
178 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
182 for (uint j = (geneOffset + bitInv); j <= (geneOffset + bitInvSecond); j++){
183 individual->at(j) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
185 ECF_LOG(state, 5,
"Inverted individual: \n" + pool[i]->toString());
191void AlgGEP::invertDc(StateP state,
const std::vector<IndividualP>& pool)
194 GEPChromosomeP test = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(0)->getGenotype());
195 if (test->dcLength < 1){
196 ECF_LOG(state, 5,
"ERCs not used in the cromosome. Dc inversion aborted.");
199 for (uint i = 0; i < pool.size(); i++) {
200 if (state_->getRandomizer()->getRandomDouble() <=
invDcRate_) {
202 pool.at(i)->fitness->setInvalid();
203 ECF_LOG(state, 5,
"Inverting ERCs of individual: \n" + pool.at(i)->toString());
205 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
206 uint invGene = state_->getRandomizer()->getRandomInteger(individual->genes);
207 uint geneOffset = invGene * (individual->geneLength);
208 uint dcStart = geneOffset + individual->headLength + individual->tailLength;
211 uint bitInv = state_->getRandomizer()->getRandomInteger(individual->dcLength);
212 uint bitInvSecond, tmp;
215 bitInvSecond = state_->getRandomizer()->getRandomInteger(individual->dcLength);
216 }
while (bitInv == bitInvSecond);
218 if (bitInv>bitInvSecond)
221 bitInv = bitInvSecond;
229 ECF_LOG(state, 5,
"Inverting the sequence in gene [" + uint2str(invGene) +
"] from point (" + uint2str(bitInv) +
") to point (" + uint2str(bitInvSecond) +
")");
231 std::vector<Tree::NodeP> seq;
232 for (
int j = (dcStart + bitInvSecond); j >= (int)(dcStart + bitInv); j--){
233 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
237 for (uint j = (dcStart + bitInv); j <= (dcStart + bitInvSecond); j++){
238 individual->at(j) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
240 ECF_LOG(state, 5,
"Inverted individual: \n" + pool[i]->toString());
246void AlgGEP::transpose(StateP state,
const std::vector<IndividualP>& pool)
255void AlgGEP::transposeIS(StateP state,
const std::vector<IndividualP>& pool)
257 for (uint i = 0; i < pool.size(); i++) {
258 if (state_->getRandomizer()->getRandomDouble() <=
transISRate_) {
259 ECF_LOG(state, 5,
"Transposing individual using IS transposition: \n" + pool.at(i)->toString());
260 pool.at(i)->fitness->setInvalid();
262 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
263 uint invGene = state_->getRandomizer()->getRandomInteger(individual->genes);
264 uint geneOffset = invGene * (individual->geneLength);
267 uint bitSeq = state_->getRandomizer()->getRandomInteger(individual->headLength+individual->tailLength);
268 uint bitSeqSecond, tmp;
271 bitSeqSecond = state_->getRandomizer()->getRandomInteger(individual->headLength+individual->tailLength);
272 }
while (bitSeq == bitSeqSecond);
274 if (bitSeq > bitSeqSecond)
277 bitSeq = bitSeqSecond;
288 uint bitPos = state_->getRandomizer()->getRandomInteger(1, individual->headLength - 1);
289 ECF_LOG(state, 5,
"Transposing the sequence in gene [" + uint2str(invGene) +
"] from point (" + uint2str(bitSeq) +
") to point (" + uint2str(bitSeqSecond) +
") into position (" + uint2str(bitPos) +
")");
292 std::vector<Tree::NodeP> seq;
293 for (uint j = geneOffset; j < (geneOffset + individual->headLength + individual->tailLength); j++){
294 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
297 uint seqIdx = bitSeq;
299 for (r = (geneOffset+bitPos); r <= (geneOffset+bitPos+bitSeqSecond-bitSeq) && r < (geneOffset+individual->headLength); r++){
300 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
304 for (; r < (geneOffset+individual->headLength); r++){
305 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
307 ECF_LOG(state, 5,
"Transposed individual: \n" + pool[i]->toString());
312void AlgGEP::transposeRIS(StateP state,
const std::vector<IndividualP>& pool)
314 for (uint i = 0; i < pool.size(); i++) {
315 if (state_->getRandomizer()->getRandomDouble() <=
transRISRate_) {
316 ECF_LOG(state, 5,
"Transposing individual using RIS transposition: \n" + pool.at(i)->toString());
318 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
319 uint invGene = state_->getRandomizer()->getRandomInteger(individual->genes);
320 uint geneOffset = invGene * (individual->geneLength);
323 uint bitSeq = state_->getRandomizer()->getRandomInteger(1, individual->headLength-1);
324 while (bitSeq < individual->headLength && !(individual->primitiveSet_->getFunctionByName(individual->at(bitSeq)->primitive_->getName()))){
328 if (bitSeq >= individual->headLength){
329 ECF_LOG(state, 5,
"No function nodes found. Transposition aborted.");
332 pool.at(i)->fitness->setInvalid();
334 uint bitSeqSecond, tmp;
337 bitSeqSecond = state_->getRandomizer()->getRandomInteger(bitSeq,individual->headLength+individual->tailLength - 1);
338 }
while (bitSeq == bitSeqSecond);
340 if (bitSeq > bitSeqSecond)
343 bitSeq = bitSeqSecond;
353 ECF_LOG(state, 5,
"Transposing the sequence in gene [" + uint2str(invGene) +
"] from point (" + uint2str(bitSeq) +
") to point (" + uint2str(bitSeqSecond) +
") into root");
356 std::vector<Tree::NodeP> seq;
357 for (uint j = geneOffset; j < (geneOffset + individual->headLength + individual->tailLength); j++){
358 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
361 uint seqIdx = bitSeq;
363 for (r = geneOffset; r <= (geneOffset + bitSeqSecond - bitSeq) && r < (geneOffset + individual->headLength); r++){
364 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
368 for (; r < (geneOffset + individual->headLength); r++){
369 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
371 ECF_LOG(state, 5,
"Transposed individual: \n" + pool[i]->toString());
376void AlgGEP::transposeGene(StateP state,
const std::vector<IndividualP>& pool)
378 for (uint i = 0; i < pool.size(); i++) {
379 if (state_->getRandomizer()->getRandomDouble() <=
transGeneRate_) {
380 ECF_LOG(state, 5,
"Transposing individual using gene transposition: \n" + pool.at(i)->toString());
382 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
383 if (individual->genes == 1){
384 ECF_LOG(state, 5,
"Gene transposition failed: genotype consists of one gene");
387 pool.at(i)->fitness->setInvalid();
388 uint invGene = state_->getRandomizer()->getRandomInteger(1,individual->genes-1);
389 uint geneOffset = invGene * (individual->geneLength);
391 ECF_LOG(state, 5,
"Transposing gene (" + uint2str(invGene)+
") to head");
394 std::vector<Tree::NodeP> seq,
copy;
395 for (uint j = 0; j < individual->size(); j++){
396 if (j >= geneOffset && j < (geneOffset + individual->geneLength))
397 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
399 copy.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
404 for (uint r = 0; r < seq.size(); r++){
405 individual->push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(r))));
408 for (uint r = 0; r <
copy.size(); r++){
409 individual->push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(
copy.at(r))));
411 ECF_LOG(state, 5,
"Transposed individual: \n" + pool[i]->toString());
417void AlgGEP::transposeDc(StateP state,
const std::vector<IndividualP>& pool)
420 GEPChromosomeP test = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(0)->getGenotype());
421 if (test->dcLength < 1){
422 ECF_LOG(state, 5,
"ERCs not used in the chromosome. Dc transposition aborted.");
425 for (uint i = 0; i < pool.size(); i++) {
426 if (state_->getRandomizer()->getRandomDouble() <=
transDcRate_) {
427 pool.at(i)->fitness->setInvalid();
428 ECF_LOG(state, 5,
"Transposing the constant domain: \n" + pool.at(i)->toString());
430 GEPChromosomeP individual = std::static_pointer_cast<GEP::GEPChromosome> (pool.at(i)->getGenotype());
431 uint invGene = state_->getRandomizer()->getRandomInteger(individual->genes);
432 uint geneOffset = invGene * (individual->geneLength);
433 uint dcStart = geneOffset + individual->headLength + individual->tailLength;
435 uint bitSeq = state_->getRandomizer()->getRandomInteger(individual->dcLength);
436 uint bitSeqSecond, tmp;
439 bitSeqSecond = state_->getRandomizer()->getRandomInteger(individual->dcLength);
440 }
while (bitSeq == bitSeqSecond);
442 if (bitSeq > bitSeqSecond)
445 bitSeq = bitSeqSecond;
455 uint bitPos = state_->getRandomizer()->getRandomInteger(individual->dcLength);
456 ECF_LOG(state, 5,
"Transposing the sequence in gene [" + uint2str(invGene) +
"] from point (" + uint2str(bitSeq) +
") to point (" + uint2str(bitSeqSecond) +
") into position (" + uint2str(bitPos) +
")");
459 std::vector<Tree::NodeP> seq;
460 for (uint j = dcStart; j < (dcStart + individual->dcLength); j++){
461 seq.push_back(
static_cast<Tree::NodeP
>(
new Tree::Node(individual->at(j))));
464 uint seqIdx = bitSeq;
466 for (r = (dcStart + bitPos); r <= (dcStart + bitPos + bitSeqSecond - bitSeq) && r < (dcStart + individual->dcLength); r++){
467 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
471 for (; r < (dcStart + individual->dcLength); r++){
472 individual->at(r) =
static_cast<Tree::NodeP
>(
new Tree::Node(seq.at(seqIdx++)));
474 ECF_LOG(state, 5,
"Transposed individual: \n" + pool[i]->toString());
void registerParameters(StateP state)
Register algorithm's parameters (if any).
bool advanceGeneration(StateP state, DemeP deme)
Perform a single generation on a single deme.
double crxRate_
crossover rate
double transRISRate_
RIS transposition rate.
double transGeneRate_
gene transposition rate
double invRate_
inversion rate
double invMaxLength_
inversion maximum sequence length
double invDcRate_
Constant domain inversion rate.
bool initialize(StateP state)
Initialize the algorithm, read parameters from the system, do a sanity check.
double transMaxLength_
maximum sequence transposition length
double selPressure_
selection pressure
double transDcRate_
constant domain transposition rate
double transISRate_
IS transposition rate.
uint mutate(const std::vector< IndividualP > &pool)
Helper function: send a vector of individuals to mutation.
IndividualP copy(IndividualP source)
Helper function: make a copy of an individual.
std::string name_
algorithm name
bool registerParameter(StateP state, std::string name, voidP value, enum ECF::type T, std::string description="")
Helper function: register a single parameter with the system.
voidP getParameterValue(StateP state, std::string name)
Helper function: get parameter value from the system.
bool mate(IndividualP p1, IndividualP p2, IndividualP child)
Helper function: crossover two individuals.
void replaceWith(IndividualP oldInd, IndividualP newInd)
Helper function: replace an individual in current deme.
void evaluate(IndividualP ind)
Helper function: evaluate an individual.
GEPChromosome class - implements genotype as a Gene Expression Programming chromosome.