0

重複の可能性:
浮動小数点からバイナリ値へ (C++)

現在、私は論文の遺伝的アルゴリズムに取り組んでおり、特定の解のゲノムになるために 3 つの double が必要な問題を最適化しようとしています。これらの double の繁殖のために、これらの double のバイナリ表現を使用したいと思います。そのために、double をバイナリ表現に変換する必要があります。これを検索しましたが、残念ながら明確な解決策が見つかりません。

これを行う方法?Javaにあるように、これを行うためのライブラリ関数はありますか? どんな助けでも大歓迎です。

4

7 に答える 7

2

どうですか:

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

doubleが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

私はそれを配列に変換しません。あなたが遺伝的なことをするなら、それはパフォーマンスが良いはずだと思います。もし私があなたなら、整数型(irrelephantから提案されたような)を使用してから、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

ゲノムのバイナリ表現から始めて、1ポイントまたは2ポイントのクロスオーバー演算子を使用するか、GAに実際のエンコーディングを使用する場合は、クロスオーバーにシミュレートされたバイナリクロスオーバー(SBX)演算子を使用してください。最新のGA実装のほとんどは、実際のコード化された表現と、対応するクロスオーバーおよびミューテーション演算子を使用しています。

于 2013-01-01T13:13:09.243 に答える
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

int(またはその変形)を使用できます。

float秘訣は、 of を of12.34としてエンコードすることintです1234

したがって、float にキャストし、フィットネス関数中に 100 で除算し、すべての突然変異とクロスオーバーを整数で行う必要があります。

落とし穴:

  • 実際に n 番目のビットが必要な場合は、精度が失われることに注意してください。
  • 符号ビットに注意してください。
  • float と int の範囲の違いに注意してください。
于 2013-01-01T21:49:57.650 に答える