2012-04-20 49 views
2

在看遺傳編程的論文時,我覺得測試用例的數量總是固定的。然而,大多數突變應該(?)在執行的每個階段都是非常有害的,即在一個測試用例中明確表示突變的程序比前一個更糟糕。如果你一開始只嘗試很少的(一個)測試用例,看看這個變種是否有意義,會發生什麼?遺傳編程中測試用例的動態數量?

這可能是因爲不同的測試用例測試瞭解決方案的不同特性,而且一個突變可能只會改進其中一個功能?

+0

你是什麼意思的「測試案例」?你的意思是「健身功能」? – Kiril 2012-06-18 15:19:46

回答

0

我不知道我是否同意你的假設,即大多數突變應該是非常有害的,但即使它們是,你也不應該在意。您的目標不是優化個人,而是優化人羣。因此,試圖確定「突變是否有意義」正是遺傳編程應該做的事:即消除「無意義」的突變。您對算法的唯一「指導」應該通過適應度函數。

0

我也不確定你的意思是「測試用例」,但對我來說,這聽起來像你正在尋找與多目標優化(MOO)有關的東西。這意味着您嘗試針對問題的不同方面優化解決方案 - 因此您不需要針對特定​​測試案例對羣體進行變異/評估,而是需要找到多目標適應度函數。 「MOO中的主要想法是帕累託優勢的概念」(http://www.gp-field-guide.org.uk

0

我認爲這是一個理論上的好主意,但很難付諸實踐。我不記得以前看到過這種方法,但是如果有的話我不會感到驚訝。

我認爲你這樣做的動機是提高應用健身功能的效率 - 如果測試看起來像他們將要做的那樣,你可以儘早停止評估並丟棄個體(或者將健身設置爲0)可怕。

一個挑戰是決定應用多少測試用例;在一個隨機測試用例之後丟棄一個人肯定不是一個好主意,因爲測試用例可能是一個真正的異常值。也許50%的測試案例終止評估,如果個人的適應度是< 10%的最好的可能不會丟棄任何非常好的個人;另一方面可能不值得,因爲很多人將會處於中等水平,並且很可能只會節省一小部分計算量。您可以調整數字,以便節省更多的工作量,但您嘗試更多的努力可以節省更多的機會,從而避免因意外丟棄真正優秀的個人。

在花費額外時間來編寫代碼和可能的錯誤等因素,我不應該認爲這樣做的好處是值得的(除非這是一個研究項目,在這種情況下,它可能會很有趣,試試看) 。

0

我認爲這是一個好主意。適應性評估是GP中計算量最大的過程,因此,爲了降低實際計算適應度的計算開銷,估計個體的適應度值可能是一個重要的優化。

你的想法是一種健身近似的形式,有時候它被稱爲懶惰評估(嘗試搜索這些詞,有一些研究論文)。

還有不同但有些重疊方案,例如:

  • 動態子集選擇(克里斯Gathercole,彼得羅斯)是選擇訓練數據集在其上的一個小的子集的方法實際執行GP算法;
  • 基於分段的遺傳程序設計(Nailah Al-Madi,Simone Ludwig)是一種通過將數據集劃分爲多個段並在健身評估過程中使用這些段來縮短GP的執行時間的技術。

PS還在母巢重組交叉(Tackett)子程序通常在有限數量的測試用例上進行評估以加速交叉。