0

可能重复:
浮点到二进制值(C++)

目前我正在为我的论文研究一种遗传算法,并且我正在尝试优化一个问题,该问题需要三个双精度才能成为特定解决方案的基因组。对于这些双打的繁殖,我想使用这些双打的二进制表示,为此我必须将双打转换为它们的二进制表示。我已经搜索过这个,但不幸的是找不到明确的解决方案。

这个怎么做?是否有一个库函数来执行此操作,就像在 Java 中一样?任何帮助是极大的赞赏。

4

7 回答 7

2

关于什么:

double d = 1234;
unsigned char *b = (unsigned char *)&d;

假设双精度由 8 个字节组成,您可以使用 b[0] ... b[7]。

另一种可能是:

long long x = *(long long *)&d;
于 2013-01-01T11:21:53.167 回答
2
于 2013-01-01T12:17:58.510 回答
1

为什么要使用二进制表示?仅仅因为某些东西更受欢迎,并不意味着它是您特定问题的解决方案。

有一种称为real的已知基因组表示,您可以使用它来解决您的问题,而无需提交二进制表示的几个问题,例如汉明悬崖和不同的突变值。

请注意,我不是在谈论尖端的实验性东西。这篇 1991 年的论文已经描述了我正在谈论的问题。如果您说西班牙语或葡萄牙语,我可以向您推荐我关于 GA 的个人书籍,但有一些英文参考资料很好,例如Melanie MitchellEiben的书籍可以更深入地描述这个问题。

要记住的重要一点是,您需要根据您的问题定制遗传算法,而不是修改您的需求以便能够使用特定类型的 GA。

于 2013-01-01T19:59:50.437 回答
0

我不会将其转换为数组。我想如果你做遗传的东西,它应该是高性能的。如果我是你,我会使用整数类型(如无关紧要的建议),然后使用 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);
}

对于选择,您可以将其转换回双倍。

于 2013-01-01T11:23:11.093 回答
0

您可以使用一个int(或其变体)。

float诀窍是将 a of编码12.34intof 1234

因此,您只需要在适应度函数期间转换为浮点数并除以 100,然后对整数进行所有突变和交叉。

陷阱:

  • 如果您确实需要第 n 位,请注意精度损失。
  • 当心符号位。
  • 请注意浮点数和整数之间的范围差异。
于 2013-01-01T21:49:57.650 回答
0

你可以这样做:

// 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?

祝你好运

于 2013-01-01T12:12:06.123 回答
0

从基因组的二进制表示开始,然后使用一点或两点交叉运算符,或者,如果您想为您的 GA 使用真实编码,请使用模拟二进制交叉(SBX)运算符进行交叉。大多数现代 GA 实现使用真实编码表示和相应的交叉和变异算子。

于 2013-01-01T13:13:09.243 回答