双/二元突变

Double/binary mutation

本文关键字:二元 突变      更新时间:2023-10-16

对于我试图创建的遗传算法,我实现了一个突变机制,但它相当粗糙:

for (int j = 0; j < number_of_variables - 1; j++)
{
    std::uniform_int_distribution<int> mutation(0, 20);
    int mutation_outcome = mutation(rng);
        if (mutation_outcome == 1)
        {
            new_individuals[k].chromosomes[0].at(j) = dist(rng);
        }
}

它有效地创造了20%的机会突变我个人的一个"基因",这些基因都是双倍的。

它工作得很好,但我真正想做的是能够变异底层的部分。

例如,我有一个具有双值-6.57885的基因,一个转换网站告诉我它是比特的0000000011000000000110100101000010111110000011011110110100101000

要翻转一个随机位,从1开始,左移0到63之间的随机数,然后将其与double进行异或:

正如Mark B所指出的,编译的例子,根据不能对双精度进行异或的事实进行了调整:

#include <stdlib.h>
double mutate(double input)
{
    long double_as_long = *(long*)&input;
    int bit_index = rand() % 63;  //you must call srand(seed) somewhere first
    long mutator = 1 << bit_index;
    long output = double_as_long ^ mutator;
    return *(double*)&output;
}

根据所需的突变程度,你可以在一个循环中称之为随机次数。

我希望这能有所帮助。

编辑:我用rand()作为例子来获得比特索引,但我强烈建议您使用更好的随机数生成器。

另一个编辑:

位运算符说明:

左移运算符(<<)将数字中的所有位向左移动指定次数:

1 << 3
0001 becomes 1000

XOR运算符,也称为异或,(^)"翻转"设置为1的位:

1001 ^ 0100 = 1101
0010 ^ 0011 = 0001