差分進化演算法python L單目標差分進化演算法

2021-10-11 21:55:06 字數 2971 閱讀 6380

# -*- coding: utf-8 -*-

import geatpy as ea # 匯入geatpy庫

import numpy as np

from sys import path as paths

from os import path

class soea_de_targettobest_1_l_templet(ea.soeaalgorithm):

soea_de_targettobest_1_l_templet : class - 差分進化de/target-to-best/1/l演算法模板

演算法描述:

本模板實現的是經典的de/target-to-best/1/l單目標差分進化演算法。演算法流程如下:

1) 初始化候選解種群。

2) 若滿足停止條件則停止,否則繼續執行。

3) 對當前種群進行統計分析,比如記錄其最優個體、平均適應度等等。

4) 採用target-to-best的方法選擇差分變異的基向量,對當前種群進行差分變異,得到變異個體。

5) 將當前種群和變異個體合併,採用指數交叉方法得到試驗種群。

6) 在當前種群和實驗種群之間採用一對一生存者選擇方法得到新一代種群。

7) 回到第2步。

參考文獻:

[1] price, k.v., storn, r.n. and lampinen, j.a.. differential evolution:

def __init__(self, problem, population):

ea.soeaalgorithm.__init__(self, problem, population) # 先呼叫父類構造方法

if population.chromnum != 1:

raise runtimeerror('傳入的種群物件必須是單染色體的種群型別。')

self.name = 'de/target-to-best/1/bin'

self.k = 0.5 # target-to-best中的引數k

if population.encoding == 'ri':

self.mutoper = ea.mutde(f=[self.k, 0.5]) # 生成差分變異運算元物件

self.recoper = ea.xovexp(xovr=0.5, half_n=true) # 生成指數交叉運算元物件,這裡的xovr即為de中的cr

else:

raise runtimeerror('編碼方式必須為''ri''.')

def run(self, prophetpop=none): # prophetpop為先知種群(即包含先驗知識的種群)

# *************************=初始化配置*************************==

population = self.population

nind = population.sizes

self.initialization() # 初始化演算法模板的一些動態引數

# *************************==準備進化*************************===

population.initchrom(nind) # 初始化種群染色體矩陣

self.call_aimfunc(population) # 計算種群的目標函式值

# 插入先驗知識(注意:這裡不會對先知種**rophetpop的合法性進行檢查,故應確保prophetpop是乙個種群類且擁有合法的chrom、objv、phen等屬性)

if prophetpop is not none:

population = (prophetpop + population)[:nind] # 插入先知種群

population.fitnv = ea.scaling(population.objv, population.cv, self.problem.maxormins) # 計算適應度

# *************************==開始進化*************************===

while self.terminated(population) == false:

# 進行差分進化操作

r_best = ea.selecting('ecs', population.fitnv, nind) # 執行'ecs'精英複製選擇

i = np.arange(nind)

experimentpop = ea.population(population.encoding, population.field, nind) # 儲存試驗個體

experimentpop.chrom = self.mutoper.do(population.encoding, population.chrom, experimentpop.field,

[i, r_best, i, none, none]) # 變異

temppop = population + experimentpop # 當代種群個體與變異個體進行合併(為的是後面用於重組)

experimentpop.chrom = self.recoper.do(temppop.chrom) # 重組

self.call_aimfunc(experimentpop) # 計算目標函式值

temppop = population + experimentpop # 臨時合併,以呼叫otos進行一對一生存者選擇

temppop.fitnv = ea.scaling(temppop.objv, temppop.cv, self.problem.maxormins) # 計算適應度

population = temppop[ea.selecting('otos', temppop.fitnv, nind)] # 採用one-to-one survivor選擇,產生新一代種群

return self.finishing(population) # 呼叫finishing完成後續工作並返回結果返回列表差分進化演算法差分進化演算法的步驟

差分進化演算法

差分進化演算法在 1997 年日本召開的第一屆國際進化優化計算競賽 iceo 表現突出,已成為進化演算法 ea 的乙個重要分支,很多學者開始研究 de 演算法,並取得了大量成果 2006年 cec 國際會議將其作為專題討論,由此可見 de 演算法已成為學者的研究熱點,具有很大的發展空間.每個個體的優...

差分進化演算法

最近在學習演化演算法 evolutionary algorithm 粒子群演算法和遺傳演算法已經很熟悉了,而差分進化演算法我還沒認真研究過,趁著暑期實訓的機會打算把差分進化演算法做個總結,最後再將這三種演算法做個比較。差分進化演算法是演化演算法的一種,它的思想和遺傳演算法比較像,演算法分為以下幾個流...

差分進化演算法

差分進化演算法是一種全域性最優化的演算法,隨機搜尋,通過引數向量集的隨機擾動實現平行計算,本身輸入遺傳類演算法,借用了一種n m的演算法有點,損失函式有d個引數,他用d 1個頂點的多面體定義目前的搜尋空間,每個頂點 由乙個d維引數向量表示,計算損失函式,區域性最優方法,引入退火的概念,從向量集中獲取...