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;