I'm currently trying to realize a very simple example of genetic algorithms.
At one point, you have to do a "Cross-Over" (biology) with two numbers (parents) to get a "child".
You can find an explanation of Cross-Over here:
(The second illustration, the easier "one-point" Cross-Over is the one I'm trying to do.)
The chromosomes (parents and child) are numbers but the "Cross-Over" will be a bit operation.
I found a solution for one of the "chromosomes", which is the following :
- Move the bits X amount to the right (
- and then move the bits again X positions but this time to the left (
So this would keep the end of one of the chromosomes and fill the beginning with 0s.
But I don't really know how to solve the problem of the other chromosome and then also do the Cross-Over.
(Probably a XOR once I kept the beginning / end of the chromosomes and filled the rest with 0s.)
Or should I even approach this problem from another angle?
preguntado el 29 de julio de 12 a las 01:07
If the fraction of the Cross-Over is p (e.g., p = .25), then this should work:
mask1 = ((0xffff >> 16*p) << 16*p) mask2 = 0xffff ^ mask1 output1 = (input1 & mask1) ^ (input2 & mask2) output2 = (input1 & mask2) ^ (input2 & mask1)
Un par de notas:
- This is just pseudocode. You might want some casts in there.
- This treats p differently than you treat it in your comment above. (Just replace p with 1-p to get to your definition of p.)
A naive approach would be to use 4 local variables:
int chromatid1Start; int chromatid1End; int chromatid2Start; int chromatid2End;
Then, assign the incoming
chromatid1 to the first two variables and
chromatid2 to the last two variables.
chromatid1Start = chromatid1; chromatid1End = chromatid1; chromatid2Start = chromatid2; chromatid2End = chromatid2;
Perform a right-shift on the
Start chromatid variables up to the crossover point, then left-shift the exact same amount. On the
End chromatid variables, left-shift up to the crossover point, then right-shift the exact same amount.
chromatid1Start = (chromatid1Start >> 16 * crossoverPercent) << 16 * crossoverPercent; chromatid1End = (chromatid1End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent); chromatid2Start = (chromatid2Start >> 16 * crossoverPercent) << 16 * crossoverPercent; chromatid2End = (chromatid2End << 16 * (1 - crossoverPercent)) >> 16 * (1 - crossoverPercent);
With that, you can cross the start of one with the end of the other:
int daughterChromatid1 = chromatid1Start + chromatid2End; int daughterChromatid2 = chromatid2Start + chromatid1End;