我目前正在尝试实现一个非常简单的遗传算法示例。
有一次,你必须用两个数字( parent )做一个“交叉”(生物学)来得到一个“ child ”。
您可以在此处找到对 Cross-Over 的解释:
How to "crossover" two strings (1234 & abcd -> 12cd & ab34)
(第二个例子,更简单的“一点”交叉是我正在尝试做的。)
染色体( parent 和 child )是数字,但“交叉”将是位操作。
我找到了一个“染色体”的解决方案,如下所示:
- 向右移动 X 位(
>>>
运算符) - 然后再次将位移动 X 个位置,但这次向左移动(
<<
运算符)
所以这将保留其中一条染色体的末尾并用 0 填充开头。
但我真的不知道如何解决另一条染色体的问题,然后也做Cross-Over。
(一旦我保留了染色体的开头/结尾并用 0 填充其余部分,可能是 XOR。)
或者我是否应该从另一个 Angular 来解决这个问题?
最佳答案
如果交叉的分数是 p(例如,p = .25),那么这应该有效:
mask1 = ((0xffff >> 16*p) << 16*p)
mask2 = 0xffff ^ mask1
output1 = (input1 & mask1) ^ (input2 & mask2)
output2 = (input1 & mask2) ^ (input2 & mask1)
一些注意事项:
- 这只是伪代码。您可能需要一些类型转换。
- 这与您在上面的评论中对待 p 的方式不同。 (只需将 p 替换为 1-p 即可得到您对 p 的定义。)
关于javascript - 按位交叉两个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11705830/