您好,登錄后才能下訂單哦!
這篇“R語(yǔ)言怎么實(shí)現(xiàn)遺傳算法”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“R語(yǔ)言怎么實(shí)現(xiàn)遺傳算法”文章吧。
什么是遺傳算法?
遺傳算法的實(shí)現(xiàn)
1、編碼
遺傳算法的編碼有浮點(diǎn)編碼和二進(jìn)制編碼兩種,我們介紹二進(jìn)制編碼規(guī)則(因?yàn)槎M(jìn)制編碼方便染色體進(jìn)行遺傳、變異和突變等操作)。設(shè)某個(gè)參數(shù)的取值范圍為 (L,U),使用長(zhǎng)度為k的二進(jìn)制編碼表示該參數(shù),則此時(shí)的對(duì)應(yīng)關(guān)系為:
2、解碼
解碼的目的是為了將不直觀的二進(jìn)制數(shù)據(jù)還原成十進(jìn)制。個(gè)體的二進(jìn)制編碼對(duì)應(yīng)的解碼公式如下所示
遺傳算法的編碼和解碼過(guò)程在宏觀上可以對(duì)應(yīng)生物的基因型和表現(xiàn)型,微觀上可以對(duì)應(yīng)基因的轉(zhuǎn)錄和翻譯。
3、交配
“交配運(yùn)算”是使用單點(diǎn)或多點(diǎn)進(jìn)行交叉的算子。首先隨機(jī)產(chǎn)生一個(gè)或多個(gè)交配點(diǎn)的位置,然后兩個(gè)個(gè)體在交配點(diǎn)互換部分基因編碼從而形成子個(gè)體。例如,染色體S1=0100101和染色體S2=1010010交換后三位的基因,則會(huì)形成兩個(gè)子個(gè)體S3=0100010和S4=1010101
4、突變
“突變運(yùn)算”是使用基本的位運(yùn)算進(jìn)行基因突變。為了避免算法在迭代過(guò)程中種群過(guò)早收斂,對(duì)于二進(jìn)制的基因編碼組成的個(gè)體種群,實(shí)行基因碼的小幾率翻轉(zhuǎn)。例如染色體S=1101101,將其第四位上的1變成0得到S’=1100101,S’可以看做原染色體通過(guò)變異產(chǎn)生的子染色體。
進(jìn)化論中的適應(yīng)度,是表示某一個(gè)體對(duì)環(huán)境的適應(yīng)能力,也表示該個(gè)體繁殖后代的能力。遺傳算法的適應(yīng)度函數(shù)也叫評(píng)價(jià)函數(shù),是用來(lái)判斷群體中的個(gè)體的優(yōu)劣程度的指標(biāo),它是根據(jù)所求問(wèn)題的目標(biāo)函數(shù)來(lái)進(jìn)行評(píng)估的。
遺傳算法在搜索進(jìn)化過(guò)程中一般不需要其他外部信息,僅用評(píng)估函數(shù)來(lái)評(píng)估個(gè)體或解的優(yōu)劣,并作為以后進(jìn)行遺傳操作的依據(jù)。由于遺傳算法中,適應(yīng)度函數(shù)要比較排序并在此基礎(chǔ)上計(jì)算選擇該利率,所以適應(yīng)度函數(shù)的值要取正值。
6、復(fù)制
若個(gè)體適應(yīng)度高,則被選取的幾率大,它的基因在種群中擴(kuò)散的概率就會(huì)比較大。個(gè)體復(fù)制幾率比較小的個(gè)體,在遺傳的過(guò)程中會(huì)逐漸被淘汰。
偽代碼實(shí)現(xiàn):
#染色體的類
class Chrom:
chrom = []
fitness = 0
def showChrom(self):
print(self.chrom)
def showFitness(self):
print(self.fitness)
#基礎(chǔ)參數(shù)
N = 200 #種群內(nèi)個(gè)體數(shù)目
mut = 0.2 #突變概率
acr = 0.2 #交叉概率
pop = {} #存儲(chǔ)染色體的字典
for i in range(N):
pop['chrom'+str(i)] = Chrom()
chromNodes = 2 #染色體節(jié)點(diǎn)數(shù)(變量個(gè)數(shù))
iterNum = 10000 #迭代次數(shù)
chromRange = [[0, 10], [0, 10]] #染色體范圍
aveFitnessList = [] #平均適應(yīng)度
bestFitnessList = [] #最優(yōu)適應(yīng)度
#初始染色體
pop = Genetic.initialize(pop, chromNodes, chromRange)
pop = Fitness.calFitness(pop) #計(jì)算適應(yīng)度
bestChrom = Genetic.findBest(pop) #尋找最優(yōu)染色體
bestFitnessList.append(bestChrom[1]) #將當(dāng)前最優(yōu)適應(yīng)度壓入列表中
aveFitnessList.append(Genetic.calAveFitness(pop, N)) #計(jì)算并存儲(chǔ)平均適應(yīng)度
#開(kāi)始迭代
for t in range(iterNum):
#染色體突變
pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange)
#染色體交換
pop = Genetic.acrChrom(pop, acr, chromNodes)
#尋找最優(yōu)
nowBestChrom = Genetic.findBest(pop)
#比較前一個(gè)時(shí)間的最優(yōu)和現(xiàn)在的最優(yōu)
bestChrom = Genetic.compareChrom(nowBestChrom, bestChrom)
#尋找與替換最劣
worseChrom = Genetic.findWorse(pop)
pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy()
pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness
#存儲(chǔ)最優(yōu)與平均
bestFitnessList.append(bestChrom[1])
aveFitnessList.append(Genetic.calAveFitness(pop, N))
以上就是關(guān)于“R語(yǔ)言怎么實(shí)現(xiàn)遺傳算法”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。