- Timestamp:
- 07/11/24 17:41:01 (4 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/genetics/genman.cpp
r1316 r1317 380 380 char *g2n = strdup(g2.getGenes().c_str()); //copy for crossover 381 381 chg1 = chg2 = 0; 382 bool swap_parents = rndUint(2) == 0; //some implementations of crossover may be not entirely symmetric (f0 is an example). This is not ideal, because crossover(p1,p2) may demonstrate slightly different characteristics or biases than crossover(p2,p1) - maybe extremely rarely, maybe in corner or error cases, but still. Since we assume that "the order of parents should not matter for crossover", here we randomize the order of parents passed to crossover to balance the characteristics. 383 if (swap_parents) std::swap(g1n, g2n); 382 384 if (gf->crossOver(g1n, g2n, chg1, chg2) == GENOPER_OK) 383 385 { 386 if (swap_parents) { std::swap(g1n, g2n); std::swap(chg1, chg2); } //gf->crossOver() got swapped parents, but we want to keep referring children and change fractions to the original parent order, so we restore the original order in the outcomes of gf->crossOver(). g1n and g2n are now children (or could be one child if gf->crossOver() provided only one). 384 387 char *gn; 385 388 if (g1n[0] && g2n[0]) if (rndUint(2) == 0) g1n[0] = 0; else g2n[0] = 0; //both provided? we want only one
Note: See TracChangeset
for help on using the changeset viewer.