【启发式算法】灰狼优化算法【附python实现代码】

写在前面:
首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。

路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就一定能够把宏伟目标变为美好现实。

之前我对模型参数寻优喜欢使用网格搜索方法,后来发现大家都喜欢使用“花里胡哨”高大上的启发式算法进行参数寻优,最近也开始接触参数优化方法,见到过:蚁群算法、灰狼算法、秃鹰算法、布谷鸟算法、鱼群算法、蚁群优化、猴群算法,看到这些以动物命名的算法,我人都懵逼了。
在这里插入图片描述
这些算法听起来非常的接地气,实际上也确实很接地气,真是听君一席话,胜似一席话,废话文学在当前社会被发挥的淋漓尽致。言归正传,这些算法,都是学者通过观察动物们的行为得到的灵感,从而设计出来的精彩的算法。以动物命名的算法可远不止上面提到这些,比如还有蜂群算法、狼群算法、蝙蝠算法,萤火虫算法,白鲸算法等,而这些都可以统称为启发式算法

来看一下启发式算法的定义,摘自百度百科:启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有蚁群算法、模拟退火法、神经网络等。

今天,给大家介绍的一种启发式算法——灰狼优化算法(Grey Wolf Optimizer,GWO)是由自然界中灰狼群体的社会等级机制和捕猎行为而衍生出来的一种群体优化智能算法,目前已成功运用到生产调度、参数优化等领域中。

1.灰狼群的等级制度

灰狼隶属于群居生活的犬科动物,是食物链的顶级掠食者,它们严格遵守着一个社会支配等级关系。如图所示:

在这里插入图片描述
灰狼群通常分为4个等级:
处于第一等级的灰狼是领头狼,用α表示,它们主要负责各类决策,然后将决策下达至整个种群;
处于第二阶级的灰狼用β表示,称为从属狼,用于辅助α狼制定决策或其他种群活动;
处于第三阶段的灰狼用δ表示,侦察狼、守卫狼、老狼和捕食狼都是这一类;
处于第四等级的灰狼用ω表示,它们在灰狼群中扮演了"替罪羊"的角色,同时它们必须要屈服于其他等级的狼。

2.数学模型

2.1 等级制度

依据上述灰狼等级制度,可以对灰狼的社会等级进行数学建模,认为最合适的解是α,那么第二和第三最优解分别表示为βδ,而剩余其他解都假定为ω。在GWO中,通过αβδ来导引捕食(优化),ω听从于这三种狼。

2.2 包围猎物

灰狼在捜索猎物时会逐渐地接近猎物并包围它,包围猎物的数学模型如下:

在这里插入图片描述
式(1)表示个体与猎物间的距离,式(2)是灰狼的位置更新公式。其中, t 是目前的迭代代数;Xp和X分别是猎物的位置向量和灰狼的位置向量;A,C是系数向量,它们的计算公式如下:

在这里插入图片描述
上式中,a是收敛因子,初始值为2随着迭代次数增大线性减小到0,r1和r2的模取[0,1]之间的随机数。

2.3 狩猎

灰狼具有识别潜在猎物(最优解)位置的能力,但很多问题的空间特征是未知的,因此灰狼无法确定猎物(最优解)的精确位置。为了模拟整个过程,这里假设α、β和δ识别潜在猎物位置的能力较强,所以,在每一次的迭代过程中,将保留当前种群中的最好三只灰狼(αβδ),然后再根据它们的位置信息来更新其它搜索代理(包括ω)的位置。

在这里插入图片描述

灰狼个体跟踪猎物位置的数学模型描述如下:

在这里插入图片描述

这三个式子分别表示了αβδ与其他个体之间的距离,Xα,Xβ和Xδ分布表示了这三匹狼当前的位置,C1,C2和C3是随机向量,X表示当前灰狼的位置。

在这里插入图片描述

X1,X2和X3计算的是狼群中ω狼向αβδ前进的步长以及方向,式(7)定义的是ω的最终位置。

2.4 攻击猎物

当猎物停止移动时,灰狼通过攻击来完成整个狩猎过程。为了模拟逼近猎物,a值的减少会引起A的值也随之波动,也就是说,在a由2收敛至0的过程中,A在区间[-a,a]内变化。

在这里插入图片描述

如上图,当A的值位于区间内时,灰狼的下一位置可以位于其当前位置和猎物位置之间的任意位置。当|A|<1时,狼群向猎物发起攻击(陷入局部最优),当|A|>1时,灰狼与猎物分离,希望找到更合适的猎物(全局最优)。

2.5 寻找猎物

灰狼主要依据α,β和δ的位置信息来寻找猎物,它们开始会分散地去搜索猎物位置信息,然后集中起来攻击猎物。基于数学模型的散度,可以通过|A|>1迫使捜索代理远离猎物,这种方式使得灰狼优化算法可以在全局寻找最优解。同时,GWO 算法中的另一个搜索系数是C。从式(4)可知,C是[0,2]之间的随机值,此系数表示灰狼当前位置对猎物影响的随机权重,C>1是增加,反之减少。这有助于 GWO 在优化过程中展示出随机搜索行为,避免算法陷入局部最优。

3.算法流程

简单的讲,狼群中有αβδ三只灰狼做头狼,α是狼王,βδ分别排第二第三,β要听老大α的,δ要听αβ的。这三头狼指导着狼群里其他的狼寻找猎物,狼群寻找猎物的过程就是我们寻找最优解的过程。

具体的算法流程如下图:

在这里插入图片描述

4.算法优缺点

4.1 优点

1.算法操作简单
2.参数设置少
3.鲁棒性强
4.收敛速度相对同类算法更快
5.精确度较高

4.2 缺点

1.种群多样性差
2.后期收敛速度慢
3.易陷入局部最优

5.总结

目前有很多研究者,针对灰狼优化算法的不足之处提出了对应的改进算法,也发表一些论文,比如通过反向学习策略优化初始化种群分布以此增加全局搜索能力,还有学者通过引入混沌算子、设置算法参数更新控制变量,以应对灰狼优化算法后期收敛速度慢、可能陷入局部最优解的缺点。

6. 代码

GWO代码:

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 17 11:24:36 2023@author: zqq
"""import numpy as np
import matplotlib.pyplot as pltclass GWO:def __init__(self):self.wolf_num = 15self.max_iter = 150self.dim = 30self.lb = -30*np.ones((self.dim,))self.ub = 30*np.ones((self.dim,))self.alpha_pos = np.zeros((1,self.dim))self.beta_pos = np.zeros((1, self.dim))self.delta_pos = np.zeros((1, self.dim))self.alpha_score = np.infself.beta_score = np.infself.delta_score = np.infself.convergence_curve = np.zeros((self.max_iter,))self.position = np.zeros((self.wolf_num,self.dim))def run(self):count = 0self.init_pos()while count < self.max_iter:for i in range(self.wolf_num):flag_ub = self.position[i,:] > self.ubflag_lb = self.position[i,:] < self.lbself.position[i,:] = self.position[i,:]*(~(flag_lb+flag_ub))+flag_ub*self.ub+flag_lb*self.lbfitness = self.func(self.position[i,:])if fitness < self.alpha_score:self.alpha_score = fitnessself.alpha_pos = self.position[i,:]elif fitness < self.beta_score:self.beta_score = fitnessself.beta_pos = self.position[i,:]elif fitness < self.delta_score:self.delta_score = fitnessself.delta_pos = self.position[i,:]a = 2 - count*(2/self.max_iter)for i in range(self.wolf_num):for j in range(self.dim):alpha = self.update_pos(self.alpha_pos[j],self.position[i,j],a)beta = self.update_pos(self.beta_pos[j], self.position[i, j], a)delta = self.update_pos(self.delta_pos[j], self.position[i, j], a)self.position[i, j] = sum(np.array([alpha, beta, delta]) * np.array([1/3,1/3,1/3]))count += 1self.convergence_curve[count-1] = self.alpha_scoreself.plot_results()def init_pos(self):for i in range(self.wolf_num):for j in range(self.dim):self.position[i,j] = np.random.rand()*(self.ub[j]-self.lb[j])+self.lb[j]@staticmethoddef update_pos(v1,v2,a):A = 2*np.random.rand()*a-aC = 2*np.random.rand()temp = np.abs(C*v1-v2)return v1 - A*tempdef plot_results(self):plt.style.use('seaborn-darkgrid')plt.plot(range(1,self.max_iter+1),self.convergence_curve,'g.--')plt.xlabel('iteration')plt.ylabel('fitness')plt.title('GWO fitness curve')plt.show()@staticmethoddef func(x):dim, s = 30, 0for i in range(len(x)-1):s += 100*(x[i+1]-x[i]**2)**2+(x[i]-1)**2return sif __name__ == "__main__":gwo = GWO()gwo.run()

参考资料

https://mp.weixin.qq.com/s/wfCnGdQNqJuC8tQf_2tI7A

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

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

相关文章

江南大学轴承数据故障诊断(利用连续小波变换转换为二维图像,再利用CNN进行故障诊断)

1.江南大学轴承数据集介绍 采样频率&#xff1a;50khz&#xff0c;采样时间&#xff1a;10s 转速&#xff1a;600 800 1000/rpm 内圈&#xff1a;ib 外圈&#xff1a;ob 滚动体&#xff1a;tb 正常&#xff1a;N 以600转速下的内圈故障数据为例展示&#xff1a; 开始数据…

第46节:cesium 水面效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

C 知识积累 替换gets函数 Linux C 语法分析 switch和if else的比较

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 回车与换行一.知其然二.知其所以然 关键字&#xff0c;操…

怎样优雅地增删查改(五):按组织架构查询

文章目录 原理实现应用测试 之前我们实现了Employee&#xff0c;Alarm管理模块以及通用查询应用层。 Employee的集合查询业务&#xff0c;是通过重写CreateFilteredQueryAsync方法&#xff0c;来实现按组织架构查询的过滤条件。 我们将这段逻辑代码提取到通用查询应用层中&…

供应链管理系统有哪些?

1万字干货分享&#xff0c;国内外 20款 供应链管理软件都给你讲的明明白白。如果你还不知道怎么选择&#xff0c;一定要翻到第三大段&#xff0c;这里我将会通过8年的软件产品选型经验告诉你&#xff0c;怎么样才能快速选到适合自己的软件工具。 &#xff08;为防后续找不到&a…

IOS与Android APP开发的差异性

iPhone和 Android是全球最流行的两种移动平台&#xff0c;有许多不同的开发者开发了应用程序&#xff0c;并将它们发布到市场上。虽然大多数开发者都使用了这两个平台&#xff0c;但您仍然需要了解它们的差异。 虽然 iOS和 Android两个平台都是基于 Linux&#xff0c;但它们却…

(1)ADS-B接收机

文章目录 前言 1.1 所需硬件 1.2 连接到自动驾驶仪 1.3 设置 1.4 ADSB输出配置 1.5 启用载人飞行器避障功能 1.6 飞行器数据库 1.7 开发者信息包括模拟 前言 本文介绍了如何安装和配置 ADS-B 模块&#xff0c;以便你的飞机能够知道附近的其他飞机和空中交通管制&#x…

MyBatis 的架构

MyBatis 的架构 MyBatis 是一个基于 Java 的持久层框架&#xff0c;可以将 SQL 语句和 Java 代码进行分离&#xff0c;通过 XML 或注解的方式配置 SQL 语句并执行&#xff0c;从而实现数据访问的功能。MyBatis 的架构包括以下几个部分&#xff1a; SqlSessionFactory&#xff…

学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

opencv.js是什么 OpenCV.js 是 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库&#xff0c;提供了一系列功能强大的算法和工具&#xff0c;用于处理图像、视频、特征提取、对象识别等…

Storage、正则表达式

1 LocalStorage 2 SessionStorage 3 正则表达式的使用 4 正则表达式常见规则 5 正则练习-歌词解析 6 正则练习-日期格式化 Storage-Storage的基本操作 // storage基本使用// 1.token的操作let token localStorage.getItem("token")if (!token) {console.log(&q…

python开发项目基于语音识别的智能垃圾分类系统的设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

详解c++---特殊类设计

目录标题 设计一个不能被拷贝的类设计一个只能从堆上创建对象的类设计一个只能在栈上创建对象的类设计一个无法被继承的类什么是单例模式饿汉模式饿汉模式的缺点懒汉模式懒汉模式的优点懒汉模式的缺点特殊的懒汉 设计一个不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…

自学网络安全究竟该从何学起?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

未来驾驶新标配;CarLuncher车载开发塑造智能娱乐导航系统

车载开发在新能源汽车的快速市场占有率增长背景下具有广阔的前景。随着环境保护意识的增强和政府对清洁能源的支持&#xff0c;新能源汽车&#xff08;如电动汽车&#xff09;在全球范围内呈现出快速增长的趋势。这种趋势为车载开发提供了许多机会和潜在市场。 新能源汽车的普…

基于SpringBoot+微信小程序的医院预约叫号小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该项目是基于uniappWe…

【C++初阶】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 &#x1f4d6;默认成员函数 用户没有显式实现&#xff0c;编译器会自动生成的成员函数&#xff0c;称为默认成员函数。 构造函数&#xff1a;完成对象的初始化工作。析构函数&#xff…

【http-server】http-server的安装、前端使用http-server启动本地dist文件服务:

文章目录 一、http-server 简介:二、安装node.js:[https://nodejs.org/en](https://nodejs.org/en)三、安装http-server:[https://www.npmjs.com/package/http-server](https://www.npmjs.com/package/http-server)四、开启服务&#xff1a;五、http-server参数&#xff1a;【1…

Vscode配置grpc+c#+proto

首先是环境配置&#xff0c;用的dotnet5.0的sdk&#xff0c;所以Vscode的C#插件版本要选择1.24&#xff0c;然后需要配置C# Snippets、NuGget Package Manager、vscode-proto3、vscode-solution-extension&#xff08;可选&#xff09;。 以vscode-solution-extension为例新建A…