目前我工作的一個遺傳算法對我的論文和我試圖優化一個需要三個雙打成爲特定解決方案的基因組的問題。爲了繁殖這些雙打,我想使用這些雙打的二進制表示,爲此我必須將雙打轉換爲它們的二進制表示。我已經搜索了這個,但不幸的是找不到明確的解決方案。
如何做到這一點?是否有像Java一樣的庫函數?任何幫助是極大的讚賞。
目前我工作的一個遺傳算法對我的論文和我試圖優化一個需要三個雙打成爲特定解決方案的基因組的問題。爲了繁殖這些雙打,我想使用這些雙打的二進制表示,爲此我必須將雙打轉換爲它們的二進制表示。我已經搜索了這個,但不幸的是找不到明確的解決方案。
如何做到這一點?是否有像Java一樣的庫函數?任何幫助是極大的讚賞。
什麼:
double d = 1234;
unsigned char *b = (unsigned char *)&d;
假設雙由8個字節你可以使用B [0] ... B [7]。
另一種可能性是:
long long x = *(long long *)&d;
,我不會把它轉換成一個陣列。我想如果你做基因的東西,它應該是高性能的。如果我是你,我會使用一個整數類型(就像從無關形象中提出的那樣),然後用int操作進行變異和交叉操作。
如果你不這樣做,你總是來回轉換它。而對於crossover,你必須遍歷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);
}
而且供選擇,你可以將它轉換回雙。
你可以做這樣的:
// 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)運算符用於交叉。大多數現代遺傳算法實現使用實數編碼表示和相應的交叉和變異算子。
爲什麼要使用二進制表示法?僅僅因爲某些東西比較流行,並不意味着它是解決具體問題的辦法。
有一個已知的基因組表示真實,你可以用它來解決你的問題,而不會被提交給二進制表示的幾個問題,如漢明懸崖和不同的突變值。
請注意,我不是在討論尖端的實驗性內容。 This 1991 paper已經描述了我正在談論的問題。如果你是西班牙語或葡萄牙語的話,我可以把你的個人書籍指向GA,但是有很多英文的參考文獻,例如Melanie Mitchell或Eiben的書籍可以更深入地描述這個問題。
要記住的重要一點是,您需要針對您的問題量身定製遺傳算法,而不是修改您的需求以便能夠使用特定類型的GA。
您可以使用int
(或其變體)。
訣竅是將float
的12.34
編碼爲int
的1234
。
因此,你只需要在適應度函數期間將一個浮點數&除以100,並且在一個整數上做所有的變異&交叉。
陷阱:
[浮點到二進制值(C++)](http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec)的可能的重複,但另請參閱http:// stackoverflow .com/questions/4328342/float-bits-and-strict-aliasing和鏈接問題 – Mat
不會使用'__int64'會更容易嗎? – irrelephant