首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双/二进制变异

双/二进制变异
EN

Stack Overflow用户
提问于 2016-05-06 02:12:24
回答 1查看 175关注 0票数 2

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

代码语言:javascript
复制
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);
        }
}

它有效地创造了1/ 20的机会在我的个体中突变其中一个“基因”,这些基因都是双倍的。

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-05-06 02:21:15

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

像Mark B指出的那样,编译的示例,调整了不能对双精度进行异或的事实:

代码语言:javascript
复制
#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()作为示例来获取位索引,但我强烈建议您使用更好的随机数生成器。

另一个编辑:

位运算符说明:

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

代码语言:javascript
复制
1 << 3
0001 becomes 1000

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

代码语言:javascript
复制
1001 ^ 0100 = 1101
0010 ^ 0011 = 0001 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37057454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档