优化算法笔记|灰狼算法理解及Python实现
灰狼優(yōu)化算法的理解和應(yīng)用
- 一、背景介紹
- 二、算法原理
- 三、構(gòu)建算法數(shù)學(xué)模型
- 四、Python實(shí)現(xiàn)GWO
- 五、算法分析
一、背景介紹
灰狼優(yōu)化算法(Grey Wolf Optimizer,GWO)由澳大利亞格里菲斯大學(xué)學(xué)者 Mirjalili 等人于2014年提出來(lái)的一種群智能優(yōu)化算法。該算法受到了灰狼捕食獵物活動(dòng)的啟發(fā)而開(kāi)發(fā)的一種優(yōu)化搜索方法,它具有較強(qiáng)的收斂性能、參數(shù)少、易實(shí)現(xiàn)等特點(diǎn)。近年來(lái)受到了學(xué)者的廣泛關(guān)注,它己被成功地應(yīng)用到了車(chē)間調(diào)度、參數(shù)優(yōu)化、圖像分類(lèi)等領(lǐng)域中。
二、算法原理
狼群中有α、β、γ三只狼做頭狼,其中α是狼王,β、γ分別排第二、第三,β、γ都要聽(tīng)α的,γ要聽(tīng)β的。這三匹狼指導(dǎo)者其他的狼尋找獵物。狼群尋找獵物的過(guò)程就是我們尋找最優(yōu)解的過(guò)程。
GWO具體優(yōu)化過(guò)程包含了社會(huì)等級(jí)分層、跟蹤、包圍和攻擊獵物和尋找獵物。
但其核心行為只有捕獵。
為了模擬灰狼的搜索行為,假設(shè)α、β、γ具有較強(qiáng)識(shí)別潛在獵物的能力,因此,在每次迭代過(guò)程中,保留當(dāng)前種群中最好的三只狼(α、β、γ),然后根據(jù)他們的位置信息來(lái)更新其他搜索代理的位置。
三、構(gòu)建算法數(shù)學(xué)模型
1)社會(huì)等級(jí)分層
GWO的優(yōu)化過(guò)程主要有每代種群中的最好三匹狼(具體構(gòu)建時(shí)表示為三個(gè)最好的解)來(lái)指導(dǎo)完成。
2)包圍獵物
灰狼捜索獵物時(shí)會(huì)逐漸地接近獵物并包圍它,該行為的數(shù)學(xué)模型如下:
3)狩獵行為的數(shù)學(xué)模型
4)攻擊獵物
5)尋找獵物
更多關(guān)于灰狼算法原理的詳細(xì)內(nèi)容
四、Python實(shí)現(xiàn)GWO
import random import numpydef GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter):# 初始化 alpha, beta, and delta_posAlpha_pos = numpy.zeros(dim) # 位置.形成30的列表Alpha_score = float("inf") # 這個(gè)是表示“正負(fù)無(wú)窮”,所有數(shù)都比 +inf 小;正無(wú)窮:float("inf"); 負(fù)無(wú)窮:float("-inf")Beta_pos = numpy.zeros(dim)Beta_score = float("inf")Delta_pos = numpy.zeros(dim)Delta_score = float("inf") # float() 函數(shù)用于將整數(shù)和字符串轉(zhuǎn)換成浮點(diǎn)數(shù)。# list列表類(lèi)型if not isinstance(lb, list): # 作用:來(lái)判斷一個(gè)對(duì)象是否是一個(gè)已知的類(lèi)型。 其第一個(gè)參數(shù)(object)為對(duì)象,第二個(gè)參數(shù)(type)為類(lèi)型名,若對(duì)象的類(lèi)型與參數(shù)二的類(lèi)型相同則返回Truelb = [lb] * dim # 生成[100,100,.....100]30個(gè)if not isinstance(ub, list):ub = [ub] * dim# Initialize the positions of search agents初始化所有狼的位置Positions = numpy.zeros((SearchAgents_no, dim))for i in range(dim): # 形成5*30個(gè)數(shù)[-100,100)以?xún)?nèi)Positions[:, i] = numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[i] # 形成[5個(gè)0-1的數(shù)]*100-(-100)-100Convergence_curve = numpy.zeros(Max_iter)#迭代尋優(yōu)for l in range(0, Max_iter): # 迭代1000for i in range(0, SearchAgents_no): # 5# 返回超出搜索空間邊界的搜索代理for j in range(dim): # 30Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[j]) # clip這個(gè)函數(shù)將將數(shù)組中的元素限制在a_min(-100), a_max(100)之間,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。# 計(jì)算每個(gè)搜索代理的目標(biāo)函數(shù)fitness = objf(Positions[i, :]) # 把某行數(shù)據(jù)帶入函數(shù)計(jì)算# print("經(jīng)過(guò)計(jì)算得到:",fitness)# Update Alpha, Beta, and Deltaif fitness < Alpha_score:Alpha_score = fitness # Update alphaAlpha_pos = Positions[i, :].copy()if (fitness > Alpha_score and fitness < Beta_score):Beta_score = fitness # Update betaBeta_pos = Positions[i, :].copy()if (fitness > Alpha_score and fitness > Beta_score and fitness < Delta_score):Delta_score = fitness # Update deltaDelta_pos = Positions[i, :].copy()# 以上的循環(huán)里,Alpha、Beta、Deltaa = 2 - l * ((2) / Max_iter); # a從2線(xiàn)性減少到0for i in range(0, SearchAgents_no):for j in range(0, dim):r1 = random.random() # r1 is a random number in [0,1]主要生成一個(gè)0-1的隨機(jī)浮點(diǎn)數(shù)。r2 = random.random() # r2 is a random number in [0,1]A1 = 2 * a * r1 - a; # Equation (3.3)C1 = 2 * r2; # Equation (3.4)# D_alpha表示候選狼與Alpha狼的距離D_alpha = abs(C1 * Alpha_pos[j] - Positions[i, j]); # abs() 函數(shù)返回?cái)?shù)字的絕對(duì)值。Alpha_pos[j]表示Alpha位置,Positions[i,j])候選灰狼所在位置X1 = Alpha_pos[j] - A1 * D_alpha; # X1表示根據(jù)alpha得出的下一代灰狼位置向量r1 = random.random()r2 = random.random()A2 = 2 * a * r1 - a; #C2 = 2 * r2;D_beta = abs(C2 * Beta_pos[j] - Positions[i, j]);X2 = Beta_pos[j] - A2 * D_beta;r1 = random.random()r2 = random.random()A3 = 2 * a * r1 - a;C3 = 2 * r2;D_delta = abs(C3 * Delta_pos[j] - Positions[i, j]);X3 = Delta_pos[j] - A3 * D_delta;Positions[i, j] = (X1 + X2 + X3) / 3 # 候選狼的位置更新為根據(jù)Alpha、Beta、Delta得出的下一代灰狼地址。Convergence_curve[l] = Alpha_score;if (l % 1 == 0):print(['迭代次數(shù)為' + str(l) + ' 的迭代結(jié)果' + str(Alpha_score)]); # 每一次的迭代結(jié)果#函數(shù) def F1(x):s=numpy.sum(x**2);return s#主程序 func_details = ['F1', -100, 100, 30] function_name = func_details[0] Max_iter = 1000#迭代次數(shù) lb = -100#下界 ub = 100#上屆 dim = 30#狼的尋值范圍 SearchAgents_no = 5#尋值的狼的數(shù)量 x = GWO(F1, lb, ub, dim, SearchAgents_no, Max_iter)運(yùn)行結(jié)果截圖:
五、算法分析
灰狼優(yōu)化算法的位置更新方程存在開(kāi)發(fā)能力強(qiáng)而探索能力弱的缺點(diǎn).
灰狼算法的全局搜索能力強(qiáng)、精度稍差。
參考鏈接:
https://blog.csdn.net/haha0332/article/details/88805910
https://www.it610.com/article/1288128297732976640.htm
推薦閱讀:
https://www.jianshu.com/p/97206c3fc51f
總結(jié)
以上是生活随笔為你收集整理的优化算法笔记|灰狼算法理解及Python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mySQL(关系型数据库管理系统)编辑
- 下一篇: KDE应用如何在GNOME环境下运行?