2009-05-25 46 views
1

我正面臨一個參數選擇問題,我想用遺傳算法(GA)來解決這個問題。我應該從3000個可能的參數中選擇不超過4個參數。使用二元染色體表示看起來像是一個自然的選擇。評估函數會懲罰太多的「選定」屬性,如果屬性的數量可以接受,則評估選擇。使用遺傳算法選擇稀疏參數

問題是,在這些稀疏的條件下,遺傳算法難以改善人口。幾代人的平均適應成本和「最差」個體的適應度都沒有提高。我所看到的只是最好的個人得分的輕微(甚至是微小的)提高,我想這是隨機抽樣的結果。

使用參數索引對問題進行編碼也不起作用。這很可能是因爲染色體是定向的,而選擇問題不是(即染色體[1,2,3,4]; [4,3,2,1]; [3,2, 4,1]等都是相同的)

你會建議什麼樣的問題表示?

P.S如果這個問題,我使用PyEvolve

+0

你將需要更加具體。模型選擇(即您的參數選擇問題)非常困難。你的第二段和第三段表明你認爲你沒有看到充分的混合(即探索參數空間)。是這樣嗎? – leif 2009-05-25 16:05:58

+0

是的,這正是我想 – 2009-05-25 19:23:26

回答

2

我不熟悉與PyEvolve,但是從我記得大約遺傳算法,你所關心的4個步驟,

  1. Chormosome Evalutation(你可能已經有這個想通了)
  2. 染色體初始化
  3. 染色體交叉
  4. 染色體突變

我想你可以d這與列表很好。你需要重載一些操作符,但它看起來像PyEvolve lets you do this一個簡單的事情就是保持列表的表示,只是在你返回染色體之前按數字排序它們。

我需要知道更多關於您的問題,但這裏是我的建議。由於參數個數可變,因此您需要針對染色體中的參數數量提出某種概率分佈。我會在1,2,3,4這裏假設一個統一的隨機數,但如果你更喜歡這個,你可以嘗試其他的東西。我打算稱這個分配P_n。

  1. 初始化。用(至少)3000條染色體對種羣進行種子處理。調用這些c_1,...,c_3000。從P_n中繪製n_j。把j放入c_j。從其餘參數中選擇剩餘的n_j - 1個參數,並使用統一的隨機分佈。
  2. 交叉。假設我們有兩條染色體。 C_1和C_2。我們將創建(並返回)染色體C_3。從{n_1,n_2}中以概率1/2選擇n_3。現在將C_1和C_2的參數放在一個列表中(並且它們是唯一的,所以如果均爲 C_1和C_2包含參數1,則它只在列表中出現一次)。從聯合列表中繪製n_3個參數並將它們放入染色體C_3。
  3. 突變。給定染色體C_1,從P_n中繪製n_1 *。如果n_1 *爲< n_1,則從C_1中隨機刪除元素,直到具有n_1 *個元素。如果n_1 * = n_1從C_1中隨機選擇1個元素並將其替換爲從不在C_1中的元素中隨機選擇的參數。如果n_1 *> n_1將元素隨機添加到C_1,直到尺寸爲n_1 *。

現在,有很多方法可以做到這一點,所以做什麼纔是最有意義的問題。