智能优化算法——灰狼优化算法(PythonMatlab实现)

目录

1 灰狼优化算法基本思想

2 灰狼捕食猎物过程

2.1 社会等级分层

2.2 包围猎物

2.3 狩猎

2.4 攻击猎物

2.5 寻找猎物

3 实现步骤及程序框图

3.1 步骤

3.2 程序框图

4 Python代码实现

5 Matlab实现


1 灰狼优化算法基本思想

灰狼优化算法是一种群智能优化算法,它的独特之处在于一小部分拥有绝对话语权的灰狼带领一群灰狼向猎物前进。在了解灰狼优化算法的特点之前,我们有必要了解灰狼群中的等级制度

灰狼群一般分为4个等级:处于第一等级的灰狼用α表示,处于第二阶级的灰狼用β表示,处于第三阶段的灰狼用δ表示,处于第四等级的灰狼用ω表示。按照上述等级的划分,灰狼α对灰狼β、δ和ω有绝对的支配权;灰狼ω对灰狼δ和ω有绝对的支配权;灰狼δ对灰狼ω有绝对的支配权

2 灰狼捕食猎物过程

GWO 优化过程包含了灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤,其步骤具体情况如下所示。

2.1 社会等级分层

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 = numpy.zeros(dim)  # 位置.形成30的列表Alpha_score = float("inf")  # 这个是表示“正负无穷”,所有数都比 +inf 小;正无穷:float("inf"); 负无穷:float("-inf")Beta_pos = numpy.zeros(dim)Beta_score = float("inf")Delta_pos = numpy.zeros(dim)Delta_score = float("inf")  # float() 函数用于将整数和字符串转换成浮点数。#====list列表类型=============if not isinstance(lb, list):  # 作用:来判断一个对象是否是一个已知的类型。 其第一个参数(object)为对象,第二个参数(type)为类型名,若对象的类型与参数二的类型相同则返回Truelb = [lb] * dim  # 生成[100,100,.....100]30个if not isinstance(ub, list):ub = [ub] * dim#========初始化所有狼的位置===================Positions = numpy.zeros((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)-100Convergence_curve = numpy.zeros(Max_iter)#========迭代寻优=====================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这个函数将将数组中的元素限制在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线性减少到0for 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)]);  # 每一次的迭代结果#========函数==========
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_iterfor 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 Deltaif fitness<Alpha_score Alpha_score=fitness; % Update alphaAlpha_pos=Positions(i,:);endif fitness>Alpha_score && fitness<Beta_score Beta_score=fitness; % Update betaBeta_pos=Positions(i,:);endif fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score Delta_score=fitness; % Update deltaDelta_pos=Positions(i,:);endenda=2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0%% 更新搜索代理的位置,包括omegasfor i=1:size(Positions,1)for j=1:size(Positions,2)     r1=rand(); % r1 is a random number in [0,1]r2=rand(); % r2 is a random number in [0,1]A1=2*a*r1-a; % Equation (3.3)C1=2*r2; % Equation (3.4)D_alpha=abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1X1=Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1r1=rand();r2=rand();A2=2*a*r1-a; % Equation (3.3)C2=2*r2; % Equation (3.4)D_beta=abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2X2=Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2       r1=rand();r2=rand(); A3=2*a*r1-a; % Equation (3.3)C3=2*r2; % Equation (3.4)D_delta=abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3X3=Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3             Positions(i,j)=(X1+X2+X3)/3;% Equation (3.7)endendConvergence_curve(l)=Alpha_score;disp(['Iteration = ' num2str(l)  ', Evaluations = ' num2str(Alpha_score)]);end
%========可视化==============
figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none')
%% 目标空间
subplot(1,2,1);
x = -5:0.1:5;y=x;
L=length(x);
f=zeros(L,L);
for i=1:Lfor j=1:Lf(i,j) = x(i)^2+y(j)^2;end
end
surfc(x,y,f,'LineStyle','none');
xlabel('x_1');
ylabel('x_2');
zlabel('F')
title('Objective space')
%% 狼群算法 
subplot(1,2,2);
semilogy(Convergence_curve,'Color','r','linewidth',1.5)
title('Convergence_curve')
xlabel('Iteration');
ylabel('Best score obtained so far');axis tight
grid on
box on
legend('GWO')
display(['The best solution obtained by GWO is : ', num2str(Alpha_pos)]);
display(['The best optimal value of the objective funciton found by GWO is : ', num2str(Alpha_score)]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT:探索人工智能语言模型的前沿技术

一、ChatGPT的背景和原理 ChatGPT是由OpenAI开发的基于GPT-3.5架构的语言模型。它通过大规模的预训练和微调过程&#xff0c;学习了海量的文本数据&#xff0c;并能够生成连贯、有逻辑的回答。ChatGPT使用了自注意力机制和深度神经网络&#xff0c;能够对上下文进行理解和生成有…

C++学习笔记1

Hello World程序的组成部分 可以分为两部分&#xff1a; &#xff08;1&#xff09;以#开头的是预处理器编译指令 &#xff08;2&#xff09;int main() 开头的是程序的主体 预处理编译指令#include 定义&#xff1a;预处理器是一个在编译前运行的工具 #include 是让预处理器获…

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

linux shell脚本操作日期记录

最近碰到个需求&#xff0c;按日导出每日的数据&#xff0c;然后导入另一个数据库。需要写个日期相关的脚本。这里总结下 #!/bin/bashfunction dateFunc(){echo "从${2}到${3}" nextdate -d "$2" %sstart${2}e…

mysql取24小时数据

MySQL是一种常用的关系型数据库管理系统。在进行实时数据处理时&#xff0c;我们常常需要查询最近24小时的数据来进行分析和处理。下面我们将介绍如何使用MySQL查询最近24小时的数据。 SELECT * FROM table_name WHERE timestamp_column > DATE_SUB(NOW(), INTERVAL 24 HOU…

cocos creator Richtext点击事件

组件如图 添加ts自定义脚本&#xff0c;定义onClickFunc点击方法&#xff1a; import { Component, _decorator} from "cc";const { ccclass } _decorator; ccclass(RichTextComponent) export class RichTextComponent extends Component{public onClickFunc(even…

二十七、数据可视化

一、数据可视化是什么 借助图形来清晰有效表达信息的方式成为可视化&#xff0c;可视化可以帮助我们更好地传递信息。 二、数据可视化的基本流程 1、整理数据 数据可视化的基础还是数据&#xff0c;要将数据图表化&#xff0c;首先要整理数据&#xff0c;明确要把哪些数据图…

ffmpeg分离左右声道到多音轨

早期的视频文件将多语言放在了左右声道&#xff0c;手机上播放时&#xff0c;很多播放器并没有切换声道的功能&#xff0c;所以需要做分离 导出单声道视频 ffmpeg -i 01.rmvb -c:v h264 -af pan"stereo| c0FR | c1FR" -acodec aac 01.mp4 这里的FR是右声道&#x…

C++入门学习(2)

思维导图&#xff1a; 一&#xff0c;缺省参数 如何理解缺省参数呢&#xff1f;简单来说&#xff0c;缺省参数就是一个会找备胎的参数&#xff01;为什么这样子说呢&#xff1f;来看一个缺省参数就知道了&#xff01;代码如下&#xff1a; #include<iostream> using std…

【个人笔记】linux命令之ls

目录 Linux中一切皆文件ls命令常用参数常用命令lscpu lspci Linux中一切皆文件 理解参考&#xff1a;为什么说&#xff1a;Linux中一切皆文件&#xff1f; ls命令 ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容…

实现大文件传输的几种方法,并实现不同电脑间大文件传输

随着网络技术的快速发展&#xff0c;大文件的传输需求越来越多&#xff0c;如何在不同的电脑之间实现大文件的快速传输&#xff0c;是一个挑战&#xff0c;下面介绍几种常用的方法可以解决这个问题。 1、利用局域网传输&#xff1a;把两台电脑接入同一个网络环境&#xff0c;通…

每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户

文章目录 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户每日语录第26题 中级题: 活跃时长的均值1. 需求列表思路分析 答案获取加技术群讨论附表文末SQL小技巧 后记 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户 大家好&#xff0c;我是Maynor。…

【Android 】Prebuilt预编译

Android提供了Perbuilt编译方式&#xff0c;处理已经编译好的库或配置文件 Perbuilt:针对独立文件的操作。 Multi_Perbuilt:针对多个文件&#xff0c;对多个文件进行判断&#xff0c;调用Prebuilt依次处理。 上面的就是copy usb_modeswitch.conf 文件到 OUT 下面的 etc目录&am…

AtCoder Beginner Contest 310-D - Peaceful Teams(DFS)

Problem Statement There are N sports players. Among them, there are M incompatible pairs. The i-th incompatible pair (1≤i≤M) is the Ai​-th and Bi​-th players. You will divide the players into T teams. Every player must belong to exactly one team, an…

Neo4j开发

原生API 待补充。。。 SpringBoot整合Neo4j 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-Neo4j</artifactId> </dependency> 配置 spring:data:neo4j:uri: bolt://127.0.0.1…

Web3.0:重新定义数字资产的所有权和交易方式

随着区块链技术的发展和应用&#xff0c;数字资产的概念已经逐渐深入人心。数字资产不仅包括加密货币&#xff0c;还包括数字艺术品、虚拟土地、游戏道具等各种形式的数字物品。然而&#xff0c;在传统的互联网环境下&#xff0c;数字资产的所有权和交易方式往往受到限制和约束…

SQL中为何时常见到 where 1=1?

你是否曾在 SELECT 查询中看到过 WHERE 11 条件。我在许多不同的查询和许多 SQL 引擎中都有看过。这条件显然意味着 WHERE TRUE&#xff0c;所以它只是返回与没有 WHERE 子句时相同的查询结果。此外&#xff0c;由于查询优化器几乎肯定会删除它&#xff0c;因此对查询执行时间没…

猿创征文|一文带你了解前端开发者工具

前端开发者工具目录 一、前言二、前端开发者工具——编译器&#xff08;含插件&#xff09;1、VS Code2、VS Code 必备插件3、WebStorm 三、前端开发者工具——UI 框架工具1、Element2、Vant 四、前端开发者工具——API 调试工具1、ApiPost 五、写在最后&#xff08;总结&#…

微服务sleuth+zipkin---链路追踪+nacos配置中心

目录 1.分布式链路追踪 1.1.链路追踪Sleuth介绍 1.2.如何完成sleuth 1.3.zipkin服务器 2.配置中心 2.1.常见配置中心组件 2.2.微服务集群共享一个配置文件 2.2.1实时刷新--配置中心数据 2.2.2.手动写一个实时刷新的配置类 ----刷新配置文件 2.3.多个微服务公用一个配…

【最新教程】树莓派安装系统及VNC远程桌面连接

大家好&#xff0c;今天就不给大家介绍PYTHONL ,今天我作为一个刚入坑树莓派的小白&#xff0c;整理了一下自己安装树莓派的整个过程&#xff0c;分享给大家。 目录 树莓派 准备工作&#xff1a; 树莓派远程ssh失败access denied 原因&#xff1a; 树莓派系统安装 1、下载…