可能重复:
浮点到二进制值(C++)
目前我正在为我的论文研究一种遗传算法,并且我正在尝试优化一个问题,该问题需要三个双精度才能成为特定解决方案的基因组。对于这些双打的繁殖,我想使用这些双打的二进制表示,为此我必须将双打转换为它们的二进制表示。我已经搜索过这个,但不幸的是找不到明确的解决方案。
这个怎么做?是否有一个库函数来执行此操作,就像在 Java 中一样?任何帮助是极大的赞赏。
可能重复:
浮点到二进制值(C++)
目前我正在为我的论文研究一种遗传算法,并且我正在尝试优化一个问题,该问题需要三个双精度才能成为特定解决方案的基因组。对于这些双打的繁殖,我想使用这些双打的二进制表示,为此我必须将双打转换为它们的二进制表示。我已经搜索过这个,但不幸的是找不到明确的解决方案。
这个怎么做?是否有一个库函数来执行此操作,就像在 Java 中一样?任何帮助是极大的赞赏。
关于什么:
double d = 1234;
unsigned char *b = (unsigned char *)&d;
假设双精度由 8 个字节组成,您可以使用 b[0] ... b[7]。
另一种可能是:
long long x = *(long long *)&d;
为什么要使用二进制表示?仅仅因为某些东西更受欢迎,并不意味着它是您特定问题的解决方案。
有一种称为real的已知基因组表示,您可以使用它来解决您的问题,而无需提交二进制表示的几个问题,例如汉明悬崖和不同的突变值。
请注意,我不是在谈论尖端的实验性东西。这篇 1991 年的论文已经描述了我正在谈论的问题。如果您说西班牙语或葡萄牙语,我可以向您推荐我关于 GA 的个人书籍,但有一些英文参考资料很好,例如Melanie Mitchell或Eiben的书籍可以更深入地描述这个问题。
要记住的重要一点是,您需要根据您的问题定制遗传算法,而不是修改您的需求以便能够使用特定类型的 GA。
我不会将其转换为数组。我想如果你做遗传的东西,它应该是高性能的。如果我是你,我会使用整数类型(如无关紧要的建议),然后使用 int 操作进行突变和交叉。
如果你不这样做,你总是在来回转换它。对于交叉,您必须遍历 64 个元素。
这是一个交叉的例子:
__int64 crossover(__int64 a, __int64 b, int x) {
__int64 mask1 = ...; // left most x bits
__int64 mask2 = ...; // right most 64-x bits
return (a & mask1) + (b & mask2);
}
对于选择,您可以将其转换回双倍。
您可以使用一个int
(或其变体)。
float
诀窍是将 a of编码12.34
为int
of 1234
。
因此,您只需要在适应度函数期间转换为浮点数并除以 100,然后对整数进行所有突变和交叉。
陷阱:
你可以这样做:
// Assuming a DOUBLE is 64bits
double d = 42.0; // just a random double
char* bits = (char*)&d; // access my double byte-by-byte
int array[64]; // result
for (int i = 0, k = 63; i < 8; ++i) // for each byte of my double
for (char j = 0; j < 8; ++j, --k) // for each bit of each byte of my double
array[k] = (bits[i] >> j) & 1; // is the Jth bit of the current byte 1?
祝你好运
从基因组的二进制表示开始,然后使用一点或两点交叉运算符,或者,如果您想为您的 GA 使用真实编码,请使用模拟二进制交叉(SBX)运算符进行交叉。大多数现代 GA 实现使用真实编码表示和相应的交叉和变异算子。