這篇“Python遺傳算法中適值函數(shù)的標(biāo)定方法是什么”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python遺傳算法中適值函數(shù)的標(biāo)定方法是什么”文章吧。
站在用戶的角度思考問題,與客戶深入溝通,找到平和網(wǎng)站設(shè)計與平和網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋平和地區(qū)。
一般情況下,直接拿目標(biāo)函數(shù)作為適值函數(shù)十分的方便,但是很多情況下卻不能這么做,例如對于求最小值問題,我們必須將目標(biāo)函數(shù)取反才能作為適值函數(shù)(這是最簡單的情況)。
當(dāng)我們遺傳算法中不同個體適值函數(shù)的值相對差別很小的時候,我們根據(jù)適應(yīng)度值的大小進(jìn)行個體選擇的選擇壓力(Selective pressure)就會變小,選優(yōu)的能力弱化,這個時候我們需要對原始的適值函數(shù)進(jìn)行標(biāo)定(Scaling)是的他們相對差別增大,進(jìn)而增大選擇壓力,增強(qiáng)算法的選優(yōu)能力。
對目標(biāo)函數(shù)的標(biāo)定方法一般有:線性標(biāo)定、動態(tài)線性標(biāo)定、冪律標(biāo)定、對數(shù)標(biāo)定等
對于求目標(biāo)函數(shù)的最大值的時候, 即 arg max f(x)
我們?nèi)=1,b=?fmin+ξ, 其中ξ是一個較小的數(shù),目的是使得種群中最差個體也有被選中的機(jī)會,不然自身減掉f?fmin=0, ξ的存在可以增加種群的多樣性。
由于適值函數(shù)標(biāo)定并不針對某個目標(biāo)函數(shù),我便想通過裝飾器的方式來方便給任何自定義的fitness函數(shù)進(jìn)行標(biāo)定。對于基本的線性標(biāo)定,我在GAEngine中添加了個帶參數(shù)的裝飾器:
Python
def linear_scaling(self, target='max', ksi=0.5): ''' A decorator constructor for fitness function linear scaling. :param target: The optimization target, maximization or minimization. :type target: str, 'max' or 'min' :param ksi: Selective pressure adjustment value. :type ksi: float Linear Scaling: 1. arg max f(x), then f' = f - min{f(x)} + ksi; 2. arg min f(x), then f' = max{f(x)} - f(x) + ksi; ''' def _linear_scaling(fn): # For original fitness calculation. self.ori_fitness = fn @wraps(fn) def _fn_with_linear_scaling(indv): # Original fitness value. f = fn(indv) # Determine the value of a and b. if target == 'max': f_prime = f - self.ori_fmin + ksi elif target == 'min': f_prime = self.ori_fmax - f + ksi else: raise ValueError('Invalid target type({})'.format(target)) return f_prime return _fn_with_linear_scaling return _linear_scaling |
這個時候如果我們在定義了一個自己的目標(biāo)函數(shù)以后,想對其進(jìn)行線性標(biāo)定便可以使用engine的這個裝飾器對函數(shù)進(jìn)行修飾即可, 像下面這樣:
Python
# Create a GA engine... # 先標(biāo)定,后注冊到引擎中 @engine.fitness_register @engine.linear_scaling(target='min', ksi=0.5) def fitness(indv): x, = indv.variants return x + 10*sin(5*x) + 7*cos(4*x) |
其中裝飾器中的參數(shù)分別為:
target: 優(yōu)化目標(biāo)函數(shù)到最小值還是最大值,值可以是:'max'或者'min'
ksi: 即公式中ξξ
動態(tài)線性標(biāo)定中的ξk作用同線性標(biāo)定中的ξ為選擇壓力調(diào)節(jié)值, 它的存在使得種群中最壞的個體仍有被選中的機(jī)會,但是動態(tài)標(biāo)定中的ξkξk的值會隨著kk增大而減小。
ξkξk的取值: ξ0=M,ξk=ξk?1?r,r∈[0.9,0.999], 我們通過調(diào)節(jié)M和r來調(diào)節(jié)ξk
通過可以動態(tài)變化的ξk,我們可以使廣域搜索范圍寬保持種群的多樣性,局部搜索保持收斂性,即,開始時希望選擇小,迭代到后面希望選擇壓力逐漸變大.
6
其他標(biāo)定方法
函數(shù)表達(dá)式: f′=aLnf+b
作用: 縮小目標(biāo)函數(shù)之間的差別
函數(shù)表達(dá)式: f′=af?fw
fw為前W代中的目標(biāo)函數(shù)最小值,他考慮了各代fmin的波動,這樣fw具有記憶性
通常采取比較種群中所有個體的適應(yīng)度值的平均值favg與最大值fmax的接近程度來判斷,如果最大值與平均值越接近說明個體就越集中。
密集因子α: 決定大變異操作在整個過程中所占的比重,其數(shù)值約接近0.5,大變異操作越頻繁
大變異概率: 概率越大,大變異算法的穩(wěn)定性就越好,但是收斂速度可能會降低,當(dāng)大變異概率的數(shù)值為0.5的時候,大變異操作就近似退化為隨機(jī)搜索
以上就是關(guān)于“Python遺傳算法中適值函數(shù)的標(biāo)定方法是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。