智能优化算法——灰狼优化算法(PythonMatlab实现)
⽬录
1 灰狼优化算法基本思想
灰狼优化算法是⼀种智能优化算法,它的独特之处在于⼀⼩部分拥有绝对话语权的灰狼带领⼀灰狼向猎物前进。在了解灰狼优化算法的特点之前,我们有必要了解灰狼中的等级制度。
灰狼⼀般分为4个等级:处于第⼀等级的灰狼⽤α表⽰,处于第⼆阶级的灰狼⽤β表⽰,处于第三阶段的灰狼⽤δ表⽰,处于第四等级的灰狼⽤ω表⽰。按照上述等级的划分,灰狼α对灰狼β、δ和ω有绝对的⽀配权;灰狼ω对灰狼δ和ω有绝对的⽀配权;灰狼δ对灰狼ω有绝对的⽀配权。
2 灰狼捕⾷猎物过程
GWO 优化过程包含了灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤,其步骤具体情况如下所⽰。
2.1 社会等级分层
当设计 GWO 时,⾸先需构建灰狼社会等级层次模型。计算种每个个体的适应度,将狼中适应度最好的三匹灰狼依次标记为 、、⽽剩下的灰狼标记为 。也就是说,灰狼体中的社会等级从⾼往低排列依次为、、及
。GWO 的优化过程主要由每代种中的最好三个解(即  、、)来指导完成。
2.2 包围猎物
灰狼体通过以下⼏个公式逐渐接近并包围猎物:
式中,t是当前的迭代代数,A和C是系数向量,Xp和X分别是猎物的位置向量和灰狼的位置向量。A和C的计算公式如下:
式中,a是收敛因⼦,随着迭代次数从2线性减⼩到0,r1和r 2服从[ 0,1]之间的均匀分布。
2.3 狩猎
狼中其他灰狼个体Xi根据α、β和百的位置Xa、XB和Xo来更新各⾃的位置:
式中,Da,Dβ和D6分别表⽰a,β和5与其他个体间的距离;Xa,Xβ和X6分别代表a,β和5的当前位置;C1,C2,C3是随机向量,X是当前灰狼的位置。
灰狼个体的位置更新公式如下:
2.4 攻击猎物
构建攻击猎物模型的过程中,根据2)中的公式,a值的减少会引起 A 的值也随之波动。换句话说,A 是⼀个在区间[-a,a](备注:原作者的第⼀篇论⽂⾥这⾥是[-2a,2a],后⾯论⽂⾥纠正为[-a,a])上的随机向量,其中a在迭代过程中呈线性下降。当 A 在[-1,1]区间上时,则捜索代理(Search Agent)的下⼀时刻位置可以在当前灰狼与猎物之间的任何位置上。
2.5 寻猎物
灰狼主要依赖  、、 的信息来寻猎物。它们开始分散地去搜索猎物位置信息,然后集中起来攻击猎物。对于分散模型的建⽴,通过|A|>1使其捜索代理远离猎物,这种搜索⽅式使 GWO 能进⾏全局搜索。GWO 算法中的另⼀个搜索系数是C。从2.2中的公式可知,C向量是在区间范围[0,2]上的随机值构成的向量,此系数为猎物提供了随机权重,以便増加(|C|>1)或减少(|C|<1)。这有助于 GWO 在优化过程中展⽰出随机搜索⾏为,以避免算法陷⼊局部最优。值得注意的是,C并不是线性下降的,C在迭代过程中是随机值,该系数有利于算法跳出局部,特别是算法在迭代的后期显得尤为重要。
3 实现步骤及程序框图
3.1 步骤
Step1:种初始化:包括种数量N,最⼤迭代次数Maxlter,调控参数a,A,C.Step2:根据变量的上下界来随机初始化灰狼个体的位置X。Step3:计算每⼀头狼的适应度值,并将种中适应度值最优的狼的位置信息保存,将种中适应度值次优的狼的位置信息保存为,将种中适应度第三优的灰狼的位置信息保存为。
Step4:更新灰狼个体X的位置。
step5:更新参数a,A和C。
Step6:计算每⼀头灰狼的适应度值,并更新三匹头狼的最优位置。
Step7:判断是否到达最⼤迭代次数Maxlter,若满⾜则算法停⽌并返回Xa的值作为最终得到的最优解,否则转到Step4。
3.2 程序框图
4 Python代码实现
#=======导⼊线管库======
import random
import numpy
#完整代码见:电⼒系统与算法之美
#输⼊关键字:灰狼算法
def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter):
#===初始化 alpha, beta, and delta_pos=======
Alpha_pos = s(dim)  # 位置.形成30的列表
Alpha_score = float("inf")  # 这个是表⽰“正负⽆穷”,所有数都⽐ +inf ⼩;正⽆穷:float("inf"); 负⽆穷:float("-inf")
Beta_pos = s(dim)
Beta_score = float("inf")
Delta_pos = s(dim)
Delta_score = float("inf")  # float() 函数⽤于将整数和字符串转换成浮点数。
#====list列表类型=============
if not isinstance(lb, list):  # 作⽤:来判断⼀个对象是否是⼀个已知的类型。其第⼀个参数(object)为对象,第⼆个参数(type)为类型名,若对象的类型与参数⼆        lb = [lb] * dim  # ⽣成[100,100,.....100]30个
if not isinstance(ub, list):
ub = [ub] * dim
#========初始化所有狼的位置===================
Positions = s((SearchAgents_no, dim))
for i in range(dim):  # 形成5*30个数[-100,100)以内
Positions[:, i] = numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[
i]  # 形成[5个0-1的数]*100-(-100)-100
Convergence_curve = s(Max_iter)
#========迭代寻优=====================
for l in range(0, Max_iter):  # 迭代1000
for i in range(0, SearchAgents_no):  # 5
#====返回超出搜索空间边界的搜索代理====
for j in range(dim):  # 30
Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[
j])  # clip这个函数将将数组中的元素限制在a_min(-100), a_max(100)之间,⼤于a_max的就使得它等于 a_max,⼩于a_min,的就使得它等于a_min。
#===========以上的循环⾥,Alpha、Beta、Delta===========
a = 2 - l * ((2) / Max_iter);  #  a从2线性减少到0
for i in range(0, SearchAgents_no):
for j in range(0, dim):
r1 = random.random()  # r1 is a random number in [0,1]主要⽣成⼀个0-1的随机浮点数。
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() 函数返回数字的绝对值。Alpha_pos[j]表⽰Alpha位置,Positions[i,j])候选灰狼所在位置
X1 = Alpha_pos[j] - A1 * D_alpha;  # X1表⽰根据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  # 候选狼的位置更新为根据Alpha、Beta、Delta得出的下⼀代灰狼地址。        Convergence_curve[l] = Alpha_score;
if (l % 1 == 0):
print(['迭代次数为' + str(l) + ' 的迭代结果' + str(Alpha_score)]);  # 每⼀次的迭代结果
快速排序python实现
#========函数==========
def F1(x):
s=numpy.sum(x**2);
return s
#===========主程序================
func_details = ['F1', -100, 100, 30]
function_name = func_details[0]
Max_iter = 1000#迭代次数
lb = -100#下界
ub = 100#上届
dim = 30#狼的寻值范围
SearchAgents_no = 5#寻值的狼的数量
x = GWO(F1, lb, ub, dim, SearchAgents_no, Max_iter)
5 Matlab实现
% 主程序 GWO
clear
close all
clc
%%完整代码见:电⼒系统与算法之美
%输⼊关键字:灰狼算法
SearchAgents_no = 30 ; % 种规模
dim = 10 ; % 粒⼦维度
Max_iter = 1000 ; % 迭代次数
ub = 5 ;
lb = -5 ;
%% 初始化三匹头狼的位置
Alpha_pos=zeros(1,dim);
Alpha_score=inf;
Beta_pos=zeros(1,dim);
Beta_score=inf;
Delta_pos=zeros(1,dim);
Delta_score=inf;
Convergence_curve = zeros(Max_iter,1);
%% 开始循环
for l=1:Max_iter
for i=1:size(Positions,1)
%% 返回超出搜索空间边界的搜索代理
Flag4ub=Positions(i,:)>ub;
Flag4lb=Positions(i,:)<lb;
Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
%% 计算每个搜索代理的⽬标函数
fitness=sum(Positions(i,:).^2);
%% 更新 Alpha, Beta, and Delta
if fitness<Alpha_score
Alpha_score=fitness; % Update alpha
Alpha_pos=Positions(i,:);
end
if fitness>Alpha_score && fitness<Beta_score
Beta_score=fitness; % Update beta
Beta_pos=Positions(i,:);
end
if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score
Delta_score=fitness; % Update delta
Delta_pos=Positions(i,:);
end
end
a=2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。