差分進化演算法

2021-09-25 17:48:49 字數 1823 閱讀 3062

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

差分進化演算法是演化演算法的一種,它的思想和遺傳演算法比較像,演算法分為以下幾個流程:

我利用python實現該演算法並進行測試。**如下:

import numpy as np

import matplotlib.pyplot as plt

def de(fobj, bounds, mut=0.8, crossp=0.7, popsize=20, its=1000):

dimensions = len(bounds)

pop = np.random.rand(popsize, dimensions)

min_b, max_b = np.asarray(bounds).t

diff = np.fabs(min_b - max_b)

pop_denorm = min_b + pop * diff

fitness = np.asarray([fobj(ind) for ind in pop_denorm])

best_idx = np.argmin(fitness)

best = pop_denorm[best_idx]

for i in range(its):

for j in range(popsize):

idxs = [idx for idx in range(popsize) if idx != j]

a, b, c = pop[np.random.choice(idxs, 3, replace = false)]

mutant = np.clip(a + mut * (b - c), 0, 1)

cross_points = np.random.rand(dimensions) < crossp

if not np.any(cross_points):

cross_points[np.random.randint(0, dimensions)] = true

trial = np.where(cross_points, mutant, pop[j])

trial_denorm = min_b + trial * diff

f = fobj(trial_denorm)

if f < fitness[j]:

fitness[j] = f

pop[j] = trial

if f < fitness[best_idx]:

best_idx = j

best = trial_denorm

yield best, fitness[best_idx]

def fitness(x):

return np.sum(x**2)/len(x)

bound=[(-100,100)]*20

results=de(fitness,bound)

x,f=zip(*results)

plt.plot(f)

plt.show()

上述**參考自這位大佬,他的**寫的很簡潔,我沒有改動就直接拿上來了。

最後的效果如下:

一般而言,當問題的維度比較小時,大概幾十維的時候,演化演算法的效果還是很可以的;當問題的維度變得很大,一般是幾百維甚至上千維德時候,演化演算法的效果就變得比較差了,需要較多的迭代次數才能得到乙個較好的解,這也是"維數災難"的一種體現。

差分進化演算法

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

差分進化演算法

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

差分進化演算法

是一種基於差分變異模式的進化演算法,在每一代的演算法迭代過程中,對於當前群體的每乙個個體,首先選擇兩個互不相同的個體,相減計算差分向量,差分向量乘以乙個縮放因子f,再隨機選擇第三個個體相加等到變異個體,變異個體經過與目標個體的交叉和選擇操作生成乙個新的進入下一代。圖1 de演算法 公式一 xi表示種...