700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 启发式算法/灰狼优化算法

启发式算法/灰狼优化算法

时间:2020-06-22 15:32:21

相关推荐

启发式算法/灰狼优化算法

原理

介绍

灰狼是群居动物,每个群体大约有5~12只,群体内部有严格的等级结构,它们的集体狩猎过程令人惊叹

灰狼等级结构

介绍

α\alphaα是狼群的头狼,类似一国之王。它负责群体的重要决策事务(狩猎目标,食物分配,睡觉时间和地点)β\betaβ是头狼的辅佐狼,类似军师和大将军。它负责收集下级信息为王的决策提供依据,向下级传递上级的决策信息,必要时弑君自立δ\deltaδ是头狼策略的执行者,类似将领。它负责让底层狼执行头狼的决策,负责狼群的具体事务(侦查,放哨,看护)ω\omegaω是狼群的底层听命于执行者,类似于士兵。它负责听命于执行者。

灰狼狩猎过程

狩猎过程:

构建灰狼等级结构狩猎过程中头狼负责寻找最好的猎物并接收其他狼的汇报信息其他狼负责向头狼靠近并通过叫声汇报猎物位置

超参数:

A⃗=2a⃗⋅r⃗1−a⃗C⃗=2⋅r⃗2\begin{aligned} \vec{A}=2\vec{a}\cdot\vec{r}_1-\vec{a} \\ \vec{C}=2\cdot\vec{r}_2 \end{aligned} A=2a⋅r1​−aC=2⋅r2​​

a⃗\vec{a}a是收敛因子,随着迭代次数从2线性减小到0∣r⃗1∣∈random[0,1]and∣r⃗2∣∈random[0,1]|\vec{r}_1|\in random[0,1]\ and\ |\vec{r}_2|\in random[0,1]∣r1​∣∈random[0,1]and∣r2​∣∈random[0,1]A⃗\vec{A}A是随机范围,随着迭代次数从[-2,2]到[-1,1]再到[0,0]

狩猎过程中每只狼向α,β,δ\alpha, \beta, \deltaα,β,δ狼靠近的过程:

{D⃗α=∣C⃗1⋅X⃗α−X⃗∣D⃗β=∣C⃗2⋅X⃗β−X⃗∣D⃗δ=∣C⃗3⋅X⃗δ−X⃗∣{X⃗1=X⃗α−A⃗1⋅D⃗αX⃗2=X⃗β−A⃗2⋅D⃗βX⃗3=X⃗δ−A⃗3⋅D⃗δX⃗t+1=X⃗1+X⃗2+X⃗33\begin{cases} \vec{D}_{\alpha}=|\vec{C}_{1}\cdot\vec{X}_{\alpha}-\vec{X}| \\ \vec{D}_{\beta}=|\vec{C}_{2}\cdot\vec{X}_{\beta}-\vec{X}| \\ \vec{D}_{\delta}=|\vec{C}_{3}\cdot\vec{X}_{\delta}-\vec{X}| \end{cases} \\ \begin{cases} \vec{X}_1=\vec{X}_{\alpha}-\vec{A}_1\cdot\vec{D}_{\alpha} \\ \vec{X}_2=\vec{X}_{\beta}-\vec{A}_2\cdot\vec{D}_{\beta} \\ \vec{X}_3=\vec{X}_{\delta}-\vec{A}_3\cdot\vec{D}_{\delta} \end{cases} \\ \vec{X}_{t+1}=\frac{\vec{X}_{1}+\vec{X}_{2}+\vec{X}_{3}}{3} ⎩⎪⎨⎪⎧​Dα​=∣C1​⋅Xα​−X∣Dβ​=∣C2​⋅Xβ​−X∣Dδ​=∣C3​⋅Xδ​−X∣​⎩⎪⎨⎪⎧​X1​=Xα​−A1​⋅Dα​X2​=Xβ​−A2​⋅Dβ​X3​=Xδ​−A3​⋅Dδ​​Xt+1​=3X1​+X2​+X3​​

D⃗α,D⃗β,D⃗δ\vec{D}_{\alpha},\vec{D}_{\beta},\vec{D}_{\delta}Dα​,Dβ​,Dδ​分别表示,α,β,δ\alpha, \beta, \deltaα,β,δ与其它个体间的距离X⃗α,X⃗β,X⃗δ\vec{X}_{\alpha}, \vec{X}_{\beta}, \vec{X}_{\delta}Xα​,Xβ​,Xδ​分别代表,α,β,δ\alpha, \beta, \deltaα,β,δ的当前位置C⃗1,C⃗2,C⃗2\vec{C}_1, \vec{C}_2, \vec{C}_2C1​,C2​,C2​是随机向量,它的计算公式上面已经给出X⃗1,X⃗2,X⃗3\vec{X}_1, \vec{X}_2, \vec{X}_3X1​,X2​,X3​分别代表,每只狼向α,β,δ\alpha, \beta, \deltaα,β,δ狼靠近的过程X⃗t+1\vec{X}_{t+1}Xt+1​表示这只狼下次迭代的初始位置

总述

计算求解者

在解空间所得解在目标函数中的适应度

计算求解者在解空间所得解在目标空间中的适应度

计算灰狼在狩猎场所在位置与目标猎物的距离

注意

适应度函数选择

本文选择目标函数F1作为适应度函数,因此适应度越小越好头狼应该记录适应度小的位置,适应度小的解

一次迭代后记录适应度最大还是最小解

由于目标函数F1且头狼记录适应度小的位置,因此一次迭代后记录适应度最小的解

代码

步骤:

构建灰狼等级结构根据适应度更新头狼(α,β,δ\alpha, \beta, \deltaα,β,δ)的位置根据所有狼与头狼(α,β,δ\alpha, \beta, \deltaα,β,δ)的距离更新所有狼的位置

import numpy as npimport matplotlibimport matplotlib.pyplot as pltmatplotlib.rcParams['font.family'] = 'STSong'matplotlib.rcParams['font.size'] = 10def F1(x):"""对目标函数F1的适应度计算解对目标函数的适应度计算求解者在解空间所得解在目标函数中的适应度:param x: positions[i, :],某一只狼的搜索结果 一只狼一个解 一个解20维:return: 适应度"""return np.sum(x ** 2)class GreyWolfOptimization(object):"""灰狼优化器"""def __init__(self, iter_num, fitness_end, lb, ub, dim, grey_wolf_num):"""初始化函数 构建解空间和求解者:param iter_num: 迭代次数:param fitness_end: 截止适应度:param lb: 解空间下界:param ub: 解空间上界:param dim: 一只狼一个解 解的维度:param grey_wolf_num: 灰狼数量"""# 迭代次数self.iter_num = iter_numself.fitness_end = fitness_end# 解空间上下界 生成[100,100,.....100]30维self.lb = [lb] * dimself.ub = [ub] * dim# 求解者 灰狼数量self.grey_wolf_num = grey_wolf_num# 解维数 一只狼一个解self.dim = dim# 解空间 初始化所有狼的位置 形成positions.shape=(5,30) 元素值在[-100,100)以内self.positions = np.zeros((self.grey_wolf_num, self.dim))for i in range(self.dim):# np.random.uniform(0, 1, self.grey_wolf_num) 形成shape=(5,1)的符合统一分布的元素值在[0,1)的向量self.positions[:, i] = np.random.uniform(0, 1, self.grey_wolf_num) * (self.ub[i] - self.lb[i]) + self.lb[i]def build_hierarchy(self, dim):"""构建灰狼等级结构alpha>beta>delta 等级越来越低 搜索解的适应度越来越小:param dim: 一只狼一个解 解的维数:return: void"""# 初始化头狼:alpha,beta,delta的位置和适应度self.alpha_pos = np.zeros(dim)## inf正无穷,-inf负无穷self.alpha_fitness = float("inf")self.beta_pos = np.zeros(dim)self.beta_fitness = float("inf")self.delta_pos = np.zeros(dim)self.delta_fitness = float("inf")def hunt(self):"""狩猎1. 根据适应度更新头狼(alpha, beta, delta)的位置2. 根据候选狼与头狼的距离更新候选狼位置参数1. a是收敛因子,随着迭代次数从2线性减少到02. A1是随机范围,随着迭代次数从[-2,2]到[-1,1]再到[0,0]:return: 每次迭代的最佳适应度"""# 保存最佳适应度fitness_list = []# 迭代寻优for num in range(0, self.iter_num):# 根据适应度更新头狼的位置for i in range(0, self.grey_wolf_num):# 保证狼的搜索范围不超过解空间的边界for j in range(self.dim):# np.clip:限制数组元素在[-100,100],大于100使它等于100,小于-100使它等于-100self.positions[i, j] = np.clip(self.positions[i, j], self.lb[j], self.ub[j])# 计算求解者在解空间所得解在目标函数中的适应度fitness = F1(self.positions[i, :])# 根据解的适应度更新alpha, beta, delta头领灰狼的适应度# 初始alpha_fitness=inf=正无穷if fitness < self.alpha_fitness:self.alpha_fitness = fitnessself.alpha_pos = self.positions[i, :].copy()if (fitness > self.alpha_fitness and fitness < self.beta_fitness):self.beta_fitness = fitnessself.beta_pos = self.positions[i, :].copy()if (fitness > self.alpha_fitness and fitness > self.beta_fitness and fitness < self.delta_fitness):self.delta_fitness = fitnessself.delta_pos = self.positions[i, :].copy()# a是收敛因子 要求a随迭代次数从2线性减少到0,num当前迭代次数a = 2 - num * ((2) / self.iter_num)# 根据所有狼与候选狼的距离更新候选狼位置for i in range(0, self.grey_wolf_num):# 更新候选狼解的每个维度for j in range(0, self.dim):# r1属于[0,1)的浮点数r1 = np.random.rand()r2 = np.random.rand()# A1是随机范围,随着迭代次数从[-2,2]到[-1,1]再到[0,0]A1 = 2 * a * r1 - aC1 = 2 * r2# D_alpha:候选狼与alpha狼的距离# abs()绝对值函数,alpha_pos[j]表示alpha狼位置,positions[i,j])候选灰狼位置D_alpha = abs(C1 * self.alpha_pos[j] - self.positions[i, j])# X1表示根据alpha狼得出的下一代灰狼位置向量X1 = self.alpha_pos[j] - A1 * D_alphar1 = np.random.rand()r2 = np.random.rand()A2 = 2 * a * r1 - aC2 = 2 * r2D_beta = abs(C2 * self.beta_pos[j] - self.positions[i, j])X2 = self.beta_pos[j] - A2 * D_betar1 = np.random.rand()r2 = np.random.rand()A3 = 2 * a * r1 - aC3 = 2 * r2D_delta = abs(C3 * self.delta_pos[j] - self.positions[i, j])X3 = self.delta_pos[j] - A3 * D_delta# 根据alpha、beta、delta头领狼得出候选狼的下一代灰狼位置self.positions[i, j] = (X1 + X2 + X3) / 3# 将alpha狼的适应度记录下来,每次迭代记录alpha狼的适应度,alpha狼的适应度是最好的fitness_list.append(self.alpha_fitness)# 打印迭代结果print('第', num + 1, '迭代的最佳适应度:', self.alpha_fitness)if self.alpha_fitness < self.fitness_end:breakreturn self.alpha_pos, fitness_list;def show(self, best_position, fitness_list):"""展示迭代过程:param best_position: 最优位置:param fitness_list: 每次迭代适应度值:return:"""print("最优位置:", str(best_position))print("最优解:", str(fitness_list[-1]))plt.title("迭代过程")plt.xlabel("迭代次数")plt.ylabel("适应度")x = range(1, len(fitness_list) + 1)y = fitness_listplt.plot(x, y, label="GWO")plt.legend()plt.show()if __name__ == '__main__':gwo = GreyWolfOptimization(100, 1e-4, -100, 100, 50, 5)gwo.build_hierarchy(gwo.dim)best_position, fitness_list = gwo.hunt()gwo.show(best_position, fitness_list)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。