2009-11-07 107 views
1

我想用一個遺傳算法求解一個包含n個變量的n個線性方程組。如何使用遺傳算法求解線性方程組?

我很難定義交叉操作,因爲解決方案可能由浮點值組成。我如何繼續?這似乎是可能的,但這是我第一次遇到遺傳算法。

假設我們要解決

x + 2y = 1 
2x + 8y = 3 

的答案將是X = 1/2和y = 1/4。

我們如何建模問題?

更新:看看你是否可以解密紙上的任何東西http://www.masaumnet.com/archives/mjbas/volume1/issue2/mjbas010205.pdf

+0

你能更多*特定*? – Graviton 2009-11-07 08:28:11

+0

這是功課嗎?你爲什麼不使用更好的標準算法? – starblue 2009-11-07 11:13:24

+0

是的,它是功課。我選擇了這個作爲我的AI課程項目。沒有太多時間來決定。現在我必須在一週內編碼。所以我沒有足夠的時間來研究。 – 2009-11-07 11:38:12

回答

1

一條路線是選擇您自己的浮點表示形式,它可以根據需要隨意釋放值。當然,這使你負責實現算術運算。也許你可以找到一個你可以改變的bignum庫。

您還可以使用例如分解平臺本機浮點。 frexp在交叉步驟期間,然後在剔除期間重新組合它。

5

你根本就沒有。有很多不同的方法可以用來解決線性系統。但是「遺傳算法」不是想到的東西。您將使用遺傳算法來解決組合問題(從有限集中選取一個元素)。

您通常使用解決因式分解(QR,LU)或迭代算法(高斯 - 賽德爾,CG,...)線性系統

+0

也許這是一個家庭作業問題,所以他必須。 – Graviton 2009-11-07 08:34:52

+0

對,我選擇這個作爲AI的課程項目。我沒有太多時間來決定,現在我沒有太多時間來編寫代碼。 這是一篇相關論文 www.masaumnet.com/archives/mjbas/volume1/.../mjbas010205.pdf 但它沒有說明細節。 – 2009-11-07 10:42:00

+0

真的不可能嗎? – 2009-11-07 10:51:22

6

你的染色體可能是n個浮點數(雙打),或者你可以通過工會重新解釋爲位串:

const int n = 100; 

union Chromosome { 
    double val[n]; 
    unsigned char bits[n * sizeof(double)]; 
}; 

...那麼你可以使用雙值解/健身價值的解釋,並進行繁殖/交叉/變異的位。

祝你好運!

+0

是的,但必須考慮浮點表示。執行隨機比特的交叉會有什麼好處? – 2009-11-07 11:05:36

+0

你必須嘗試一下 - 我懷疑它會花費很長時間才能收斂,但最終會起作用。你可以讓你的健身功能基本上消滅包含真正極端值的染色體。 – 2009-11-07 11:44:23

+0

然而,你可以做交叉(和變異)。只是在浮點數之間交叉......有突變只是隨機化一個浮點數...... – Inverse 2009-11-22 22:10:28

1

您需要考慮使用真實編碼的遺傳算法,而不是您提到的論文中建議的二進制編碼的遺傳算法。事實上,如果你使用二進制編碼遺傳算法,那麼如果你的'x','y'可以取負值,你將無法找到方程的解。

因此,您需要使用真正的編碼遺傳算法。您可以自己編寫整個遺傳算法,也可以使用現有的RGA代碼來解決您的問題。你只需要根據你的需要定製健身功能。在這裏你可以使用文章中建議的那個。這很容易!

您可以考慮使用http://www.iitk.ac.in/kangal/codes.shtml的RGA實現。