双/二元突变
Double/binary mutation
对于我试图创建的遗传算法,我实现了一个突变机制,但它相当粗糙:
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
相关文章:
- 如何防止引用返回的私有结构的突变
- 重写派生类中的二元运算符
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 与C++中的空字符串相比,突变仍然存在?
- 最小值/最大值二元运算符
- C++中基本二元数学运算符的名称
- 有人可以给我提供二维二元索引树的算法吗?
- 在两棵二元树中计数相等的节点
- 生成多二元数组而不是 COUT
- 二元运算符声明的'static'关键字
- 泛型突变器/访问器函数
- 分配两个二元数组
- 如何声明C 变量应突变
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 私下声明的对象变量的突变器/访问器方法
- 类 arrray [3][3] 中的访问器和突变器 c++ 方法
- 在C 中,有一种惯用方法来防止运行一系列动作的情况导致该集合被突变
- C 操作员&gt;&gt;与突变器过载
- 链表C++ 使用突变器更新头部的下一个时不保存
- 双/二元突变