python 實現差分進化演算法

2021-08-31 13:35:33 字數 3683 閱讀 4765

對於種群優化演算法來說,最著名的為粒子群演算法、遺傳演算法及差分進化演算法,在前面的部落格中實現了其中基本型。應在用c語言編寫的執行速度快,但是python近年來越來越流行,所以蟒蛇實現差分進化演算法,通過函式測試執行很快速。主要是用到了numpy庫來實現,繪圖顯示使用的是matplotlib庫。

差分進化演算法總的有四步驟:

(1)種群初始化

(2)變異操作

(3)交叉操作

(4)貪婪選擇操作

# 產生種群

self.pop_pos=bound[1,:]+np.random.rand(n_pop,n_var)*(bound[0,:]-bound[1,:])

self.pop_fit=self.fit_func(self.pop_pos)

self.pop_best_fit=np.min(self.pop_fit)

self.pop_best_pos=self.pop_pos[np.argmin(self.pop_fit),:]

self.pop_cross=self.pop_pos.copy()

self.pop_cross_fit=self.pop_fit.copy()

self.pop_mutute=self.pop_pos.copy()

self.pop_mutute_fit=self.pop_fit.copy()

def mutute_pop(self):

rand1=np.random.choice(self.n_pop)

rand2=np.random.choice(self.n_pop)

rand3=np.random.choice(self.n_pop)

if (rand1==rand2)|(rand2==rand3)|(rand1==rand3):

rand1=np.random.choice(self.n_pop)

rand2=np.random.choice(self.n_pop)

rand3=np.random.choice(self.n_pop)

for i in range(self.n_pop):

self.pop_mutute[i,:]=self.pop_pos[rand1,:]+self.f*(self.pop_pos[rand2,:]-self.pop_pos[rand3,:])

index_up=self.pop_mutute[i,:]>self.bound[0,:]

self.pop_mutute[i,index_up]=self.bound[0,index_up].copy()

index_down=self.pop_mutute[i,:]self.bound[0,:]

self.pop_cross[i,index_up]=self.bound[0,index_up].copy()

index_down=self.pop_cross[i,:]

self.pop_cross[i,index_down]=self.bound[1,index_down].copy()

self.pop_cross_fit=self.fit_func(self.pop_cross)

def greedy_select(self):

index_x=self.pop_cross_fit

self.pop_pos[index_x,:]=self.pop_cross[index_x,:].copy()

self.pop_fit[index_x]=self.pop_cross_fit[index_x]

if np.min(self.pop_fit)

self.pop_best_pos=self.pop_pos[np.argmin(self.pop_fit),:].copy()

self.pop_best_fit=self.pop_fit[np.argmin(self.pop_fit)].copy()

def show_result(self):

plt.plot(range(self.max_iter),self.iter_fit,'-b')

plt.title('converage of process in de')

plt.xlabel('iter')

plt.ylabel('fitness')

plt.show()

def print_result(self):

print('the result is showing...')

print('best_fitness for min problem:',self.pop_best_fit)

print('best solution for result:',self.pop_best_pos)

def run(self):

for it in np.arange(0,self.max_iter):

self.mutute_pop()

self.cross_pop()

self.greedy_select()

self.iter_fit[it]=self.pop_best_fit.copy()

print('iter,iter_fit',(it,self.iter_fit[it]))

def fitness_fun(x):

result=np.sum(x*x,axis=1)

return result

def main():

max_iter=1000

var_num=100

pop=50

bound=np.zeros((2,var_num))

bound[0,:]=np.ones(var_num)*10 #上邊界,每個變數的上邊界可以不同

bound[1,:]=-np.ones(var_num)*10 #下邊界,每個變數的下邊界可以不同

cr=0.2

f=0.2

de_new=de(max_iter,var_num,cr,f,pop,bound,fitness_fun)

de_new.run()

de_new.show_result()

de_new.print_result()

if __name__=='__main__':

main()

差分進化演算法

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

差分進化演算法

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

差分進化演算法

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