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

news2024/12/23 17:42:28

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

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

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

来看一下启发式算法的定义,摘自百度百科:启发式算法(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 plt

class GWO:
    def __init__(self):
        self.wolf_num = 15
        self.max_iter = 150
        self.dim = 30
        self.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.inf
        self.beta_score = np.inf
        self.delta_score = np.inf
        self.convergence_curve = np.zeros((self.max_iter,))
        self.position = np.zeros((self.wolf_num,self.dim))

    def run(self):
        count = 0
        self.init_pos()
        while count < self.max_iter:
            for i in range(self.wolf_num):
                flag_ub = self.position[i,:] > self.ub
                flag_lb = self.position[i,:] < self.lb
                self.position[i,:] = self.position[i,:]*(~(flag_lb+flag_ub))+flag_ub*self.ub+flag_lb*self.lb
                fitness = self.func(self.position[i,:])
                if fitness < self.alpha_score:
                    self.alpha_score = fitness
                    self.alpha_pos = self.position[i,:]
                elif fitness < self.beta_score:
                    self.beta_score = fitness
                    self.beta_pos = self.position[i,:]
                elif fitness < self.delta_score:
                    self.delta_score = fitness
                    self.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 += 1
            self.convergence_curve[count-1] = self.alpha_score
        self.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]

    @staticmethod
    def update_pos(v1,v2,a):
        A = 2*np.random.rand()*a-a
        C = 2*np.random.rand()
        temp = np.abs(C*v1-v2)
        return v1 - A*temp

    def 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()

    @staticmethod
    def func(x):
        dim, s = 30, 0
        for i in range(len(x)-1):
            s += 100*(x[i+1]-x[i]**2)**2+(x[i]-1)**2
        return s

if __name__ == "__main__":
    gwo = GWO()
    gwo.run()

参考资料

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

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

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

相关文章

快速批量改名文件!随机字母命名,让文件名更有创意!

想要让文件名更加有创意和个性化吗&#xff1f;不妨尝试使用随机字母来批量改名文件&#xff01;无论是照片、文档还是其他文件&#xff0c;只需要简单的几个步骤&#xff0c;您就可以为它们赋予一个独特的随机字母命名。这不仅可以帮助您整理文件&#xff0c;还能增加一些乐趣…

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…

SpringBoot整合SpringCloudStream3.1+版本的Kafka死信队列

SpringBoot整合SpringCloudStream3.1版本的Kafka死信队列 上一篇直通车 SpringBoot整合SpringCloudStream3.1版本Kafka 实现死信队列步骤 添加死信队列配置文件&#xff0c;添加对应channel通道绑定配置对应的channel位置添加重试配置 结果 配置文件 Kafka基本配置&#…

Python机器学习、数据统计分析在医疗中的应用

Python机器学习在医疗诊断领域的应用 随着人工智能技术的不断发展&#xff0c;机器学习已经在医疗领域的诊断治疗、预防等方面展现出强大的潜力。Python 作为一种广泛应用于机器学习的语言&#xff0c;在医疗领域也已经被广泛使用。本文将探讨 Python 机器学习在医疗领域的应用…

mysql 第五章

目录 1.order by 排序 2.区间判断 3.group by 分组 4.limit 5.别名 6.通配符 like 7.总结 1.order by 排序 2.区间判断 3.group by 分组 4.limit 5.别名 6.通配符 like 7.总结 对 mysql 数据库的查询&#xff0c;除了基本的查询外&#xff0c;有时候需要对查…

nginx官网与下载

官网 nginx: download 下载 解压 conf配置文件

[高通平台][WLAN] IEEE802.11mc 介绍

IEEE802.11mcWi-Fi协议(即Wi-FiRound-Trip-Time,RTT),利用此项技术及可以进行室内定位,因此为了使用此项技术,只有在硬件支持的设备上,应用才可以使用最新的RTT API以测量附近具有RTT功能的Wi-FiAP。 单面RTT :  距离是通过发送的分组和接收到的ACK之间的时间差来计算的…

SPSS中级统计--S05-5多个样本率的卡方检验及两两比较

小伙伴们&#xff0c;今天我们学习SPSS中级统计--多个样本率的卡方检验及两两比较。 例1、2 C列联表资料 上期我们学习了双向无序RC表资料&#xff08;c2&#xff09;的检验&#xff0c;案例如下&#xff0c;比较不同污染地区的动物畸形率是否有差异&#xff1f; H0&#xff…

哈医大一院电力监控系统 安科瑞 许敏

摘要&#xff1a;本文介绍基于Acrel-3000电力监控软件和电力监控仪表&#xff0c;设计并实现了一套分散式采集和集中控制管理的自动化报警系统。系统实现远程精细化及时性报警&#xff0c;避免因停电造成医疗事故&#xff0c;提高了供电质量和管理水平&#xff0c;具有简明实用…

怎么把高版本CAD转换成低版本?CAD版本转换方法分享

某些情况下&#xff0c;较新的CAD软件版本可能不被较旧的CAD软件版本所支持。如果你需要与使用较旧版本CAD的人进行交流、共享或协作&#xff0c;将高版本CAD转换为低版本可以确保文件能够顺利打开和编辑。那么问题来了&#xff0c;怎么将高版本CAD转换成低版本呢&#xff1f;教…

29,stack容器

29.1stack基本概念 概念&#xff1a;stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口 栈容器 符合先进后出 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为 栈可以判断容器为空与否(empty) 栈可以返回元素个数(…

【SQL】计算每个人的完成率

目录 前提任务的完成率前三名拓展&#xff1a;达梦如何去实现除法有余数拓展&#xff1a;MySQL 任务的完成率前三名 前提 达梦数据库&#xff1a; select 1/3; # 0不要求四舍五入 任务的完成率前三名 # nick_name 人名 # finishNum 当前这个人的任务完成数 # total 当前这…

Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识 package mainimport ("fmt""sync""time" )func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end") }func listenMusci() {defer wg.Done()fmt.Println(&qu…

【lesson2】Linux基本指令1

文章目录 touch创建文件更新文件最新修改时间 lslsls -lls -als -i pwd...cdcd 路径法一&#xff1a;cd 绝对路径法二&#xff1a;cd 相对路径 cd - stattreemkdirmkdir创建一个目录mkdir -p创建一串路径目录 ~/rmdirrmrmrm -frm -rrm -i mancpcpcp -r mvnaocatcatcat -n ta…

错过后悔!!!Java岗秋招最全面试攻略!!

这里给大家整理了完整的Java完整的架构面试核心知识体系。按照这样的一个脉络&#xff0c;只要大家能够掌握这里面的绝大部分内容&#xff0c;并且有过相应的一些实践&#xff0c;那么就可以去面试自己心仪的工作了。 这份笔记总结都是作者近几年结合众多牛客的面经分享&#…

【完整版】zabbix企业级监控(概念、简单操作、页面优化、监控主机自己、监控linux、监控Win10)

第三阶段基础 时 间&#xff1a;2023年7月19日 参加人&#xff1a;全班人员 内 容&#xff1a; zabbix企业级监控 目录 一、Zabbix概述 &#xff08;一&#xff09;Zabbix简介 &#xff08;二&#xff09;Zabbix运行条件&#xff1a; &#xff08;三&#xff09;Zab…

【面试笔试避坑指南】一

从这篇文章开始 进行笔试的训练环节&#xff0c;我会在 本专栏详细介绍笔试的易错点&#xff0c;帮助大家精准避坑。 1.有如下一段代码&#xff08;unit16_t为2字节无符号整数&#xff0c;unit8_t位1字节无符号整数&#xff09;&#xff1b; 请问x.z.n在大字节序和小字节序机器…

MySQL第五章、索引事务

目录 一、索引 1.1 概念 1.2 作用 1.3 使用场景 1.4 使用 1.5 案例 二、索引背后的数据结构 2.1 B-树&#xff08;B树&#xff09; 2.2 B树&#xff08;MySQL背后数据结构&#xff09; 三、事务 3.1 为什么使用事务 3.2 事务的概念 3.3 使用 3.4并发执行事务产生…

《Java黑皮书基础篇第10版》 第12章【习题】

Java语言程序设计 习题第十二章 12.2章节习题 12.1 使用异常处理的优势是什么? 如果没有异常处理&#xff0c;方法执行(called method)出错时&#xff0c;调用者(caller)没有办法进行处理&#xff08;比如方法所在的类被封装&#xff0c;调用者无法访问&#xff09;&#xf…

ubuntu版本Linux操作系统上安装键盘中文输入法

要在ubuntu版本Linux操作系统上安装键盘中文输入法 可以按照以下步骤进行操作&#xff1a; 1、Linux终端输入&#xff1a;sudo apt-get install ibus-pinyin 这将安装一个常用的中文输入法 “ibus-pinyin”。 2、重新启动系统&#xff1a;为了使输入法生效&#xff0c;需要…