對於種群優化演算法來說,最著名的為粒子群演算法、遺傳演算法及差分進化演算法,在前面的部落格中實現了其中基本型。應在用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維引數向量表示,計算損失函式,區域性最優方法,引入退火的概念,從向量集中獲取...