Javascript 按位交叉两个整数
我目前正在尝试实现一个非常简单的遗传算法示例 在某一点上,你必须用两个数字(父母)进行“交叉”(生物学)才能得到一个“孩子” 你可以在这里找到交叉的解释: (第二个例子,更简单的“一点”交叉就是我要做的。) 染色体(父母和孩子)是数字,但“交叉”将是一个小运算 我找到了其中一条“染色体”的解决方案,如下所示:Javascript 按位交叉两个整数,javascript,bit-manipulation,genetic-algorithm,Javascript,Bit Manipulation,Genetic Algorithm,我目前正在尝试实现一个非常简单的遗传算法示例 在某一点上,你必须用两个数字(父母)进行“交叉”(生物学)才能得到一个“孩子” 你可以在这里找到交叉的解释: (第二个例子,更简单的“一点”交叉就是我要做的。) 染色体(父母和孩子)是数字,但“交叉”将是一个小运算 我找到了其中一条“染色体”的解决方案,如下所示: 向右移动位X值(>>运算符) 然后将位再次移动到X位置,但这次向左移动(如果交叉部分为p(例如,p=.25),则这应该可以: mask1 = ((0xffff >> 16*
- 向右移动位X值(
运算符)>>
- 然后将位再次移动到X位置,但这次向左移动(
如果交叉部分为p(例如,p=.25),则这应该可以:
mask1 = ((0xffff >> 16*p) << 16*p) mask2 = 0xffff ^ mask1 output1 = (input1 & mask1) ^ (input2 & mask2) output2 = (input1 & mask2) ^ (input2 & mask1)
mask1=((0xffff>>16*p)一种简单的方法是使用4个局部变量:
然后,将传入的int chromatid1Start; int chromatid1End; int chromatid2Start; int chromatid2End;
分配给前两个变量,将chromoid1
分配给后两个变量chromoid2
在chromatid1Start = chromatid1; chromatid1End = chromatid1; chromatid2Start = chromatid2; chromatid2End = chromatid2;
染色单体变量上向右移动到交叉点,然后向左移动完全相同的量。在开始
染色单体变量上,向左移动到交叉点,然后向右移动完全相同的量结束
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);
您是否总是知道您的两个输入作为数字(例如,16位整数)有多大?是的,它们始终是16位整数。可以修改的一件事是交叉百分比。例如,75%将保留父A的前4(25%)位,然后在这4位之后加上12(75%)来自父项B的位。哇,mind=blow!我需要一些时间来理解此代码。^^谢谢您的快速回答!好的,将0xffff模式向右然后向左移动与您在描述中所做的相同,因此如果您的p=0.5,则您的mask1将在右移后变成0xff,然后在左移后变成0xff00ft back。使用0xffff对其进行XORing可以获得mask2中未打开的所有位。感谢您的解释!int daughterChromatid1 = chromatid1Start + chromatid2End; int daughterChromatid2 = chromatid2Start + chromatid1End;