2011-07-12 46 views
1

我有一個適應度函數可以評估爲負值或正值的GA。對於這個問題的緣故,讓我們假設功能遺傳算法中的線性適應縮放產生負的適應值

u = 5 - (x^2 + y^2) 

其中

x in [-5.12 .. 5.12] 
y in [-5.12 .. 5.12] 

Example fitness function

現在在GA的selection phase我使用simple roulette wheel。由於能夠使用simple roulette wheel我的適應度函數必須對某個人羣中的具體病例有效,所以我開始尋找縮放解決方案。最自然的似乎是linear fitness scaling。它應該是非常簡單的,例如看this implementation。但是,即使在線性縮放之後,我的也會變爲負值。

例如,對於上面提到的功能,而這些適應值:

-9.734897 -7.479017 -22.834280 -9.868979 -13.180669 4.898595 

線性縮放後我非但沒有這些價值觀

-9.6766040 -11.1755111 -0.9727897 -9.5875139 -7.3870793 -19.3997490 

,我想將它們擴展到正值,所以我可以在下一階段做輪盤選擇。

我必須在這裏做一些根本性的錯誤。我應該如何處理這個問題?

+2

u = 5 - (2 * 5.12^2)的最小可能值。爲什麼不把這個添加到你的u? – Hyperboreus

+0

據我瞭解,通過這樣做會破壞羣體內的適應度分佈,並且在不同的/錯誤的染色體中會被挑選出來用於下一代。 從我的帖子中的鏈接:「我們想保持人口中最大適應度個體與平均人口適應度之間的某種關係。」 –

+0

您是否完全使用鏈接到的頁面中的代碼?如果仔細閱讀,他們會聲明這段代碼的確會產生負值,而您仍然需要通過f'_min的調整來進行調整。 – Frank

回答

1

你的最小的可能值U = 5 - (2 * 5.12^2)。爲什麼不把這個添加到你的u?

4

主要的錯誤是,線性縮放的輸入必須已經是正數(根據定義),而我也是取其負值。

關於負值的討論不是關於算法的輸入,而是關於算法的輸出(比例值)。檢查是處理這種情況,然後糾正它,以免產生負面的縮放值。

if(p->min > (p->scaleFactor * p->avg - p->max)/ 
    (p->scaleFactor - 1.0)) { /* if nonnegative smin */ 
    d = p->max - p->avg; 
    p->scaleConstA = (p->scaleFactor - 1.0) * p->avg/d; 
    p->scaleConstB = p->avg * (p->max - (p->scaleFactor * p->avg))/d; 
    } else { /* if smin becomes negative on scaling */ 
    d = p->avg - p->min; 
    p->scaleConstA = p->avg/d; 
    p->scaleConstB = -p->min * p->avg/d; 
    } 

在下圖中,如果f'min是負數,請轉到else子句並處理這種情況。

那麼解決方案是然後預測上述功能,所以它只給出正值。作爲Hyperboreus建議,這可以通過添加最小的可能值來實現

u = 5 - (2*5.12^2) 

這是最好的,如果我們分開真正的健身值,我們正試圖從最大規模的健身值被輸入到的selection phase GA。

enter image description here

1

我同意上一個答案。線性縮放本身會嘗試保留平均適應度值,因此如果函數爲負值,則需要進行偏移。有關更多詳細信息,請參閱Goldberg的遺傳算法手冊(1989年),第7章,第76-79頁。