灰狼优化算法(Grey Wolf Optimizer)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法引言

灰狼算法(Grey Wolf Optimizer, GWO)是一种受自然界灰狼行为启发的优化算法。它模拟了灰狼的社会层次和狩猎策略,其中灰狼被分为四种角色:狼首领(Alpha)、狼副手(Beta)、狈顾问(Delta)和打工狼(Omega)。这种层次结构帮助灰狼以高效的方式组织狩猎和资源分配。

在这个算法中,首领Alpha代表最优解,而Beta和Delta则分别代表次优解和第三优解。Omega灰狼则遵循这些领导者的指引,探索搜索空间。算法的运行过程就像灰狼群体协作狩猎一样,通过追踪、包围、攻击猎物的方式逐步逼近最优解。

这种策略在许多领域都很有用,特别是在需要找到最佳路径或最优配置的问题中,就像在策略游戏中寻找获取资源的最佳路线一样。玩家需要考虑不同的策略和路径,以最高效的方式获取资源。在这个过程中,就像灰狼算法一样,需要不断调整和优化策略,以达到最佳效果。

总的来说,灰狼算法通过模拟自然界灰狼的社会结构和狩猎行为,提供了一个强大的工具来解决复杂的优化问题。它不仅能够有效地找到解决方案,还能在多种条件下保持稳定和适应性。

算法应用

灰狼算法(Grey Wolf Optimizer, GWO)由于其独特的搜索机制和高效的全局探索能力,在生活中有多种应用场景。以下是一些常见的应用实例:

  1. 工程优化:在工程设计和建筑领域,灰狼算法被用来优化结构设计,比如桥梁或建筑物的稳定性和耐久性。它通过模拟不同设计参数,帮助找到成本效益最高的解决方案。
  2. 能源管理:在能源行业,该算法用于优化电网的运行,比如在可再生能源系统中平衡供需,或者优化电池存储系统的管理。
  3. 交通系统优化:灰狼算法可以应用于交通网络设计,比如优化道路布局或交通信号灯的调度,以减少拥堵和提高交通效率。
  4. 机器学习:在机器学习领域,灰狼算法被用来选择或优化特征,增强学习模型的准确性和效率。
  5. 调度问题:在制造业和物流领域,该算法用于优化生产线的调度,比如确定最优的作业顺序或运输路线,以提高效率和降低成本。
  6. 环境管理:灰狼算法还被用于环境科学领域,比如优化水资源管理或评估环境影响。

这些应用展示了灰狼算法在解决实际问题时的灵活性和有效性。它适用于各种需要复杂决策和优化的场景,尤其在处理多变量和多目标的问题时表现出色。

算法计算流程

1. 初始化群体
– 生成初始群体:随机生成包含 N 个搜索代理(灰狼)的群体。每个灰狼代表解空间中的一个可能解。
– 初始化参数:设置算法的迭代次数、搜索代理的数量等。
2. 确定Alpha、Beta和Delta
– 评估适应度:计算每个搜索代理(灰狼)的适应度。
– 选择领导者: 根据适应度,选择前三名最优秀的灰狼作为Alpha(最优解)、Beta(次优解) 和Delta (第三优解)。

3. 迭代优化过程:
– 对于每次迭代:
– 根据Alpha、Beta和Delta的位置,更新每个打工狼X的位置,公式如下。

3.1 距离计算:
– 这一步是计算当前灰狼与Alpha、Beta、Delta之间的距离。这些距离用于模拟打工狼与狼首领,副手和军师之间的相对位置。距离的计算公式如下:

                                                  D_{\alpha}=|C_1\cdot X_\alpha-X|\\D_{\beta}=|C_2\cdot X_\beta-X|\\D_{\delta}=|C_3\cdot X_\delta-X|


– 其中,X_\alpha,X_\beta,X_\delta分别表示Alpha、Beta、Delta的位置, X 是当前打工狼的位置,C_1,C_2,C_3 是随机系数向量,用于模拟灰狼在猎物附近移动的随机性。这种随机性模拟了灰狼群在追踪猎物时可能的不确定和变化行为。 C 的值通常在0到2之间随机生成,这有助于探索解空间的不同区域,避免算法过早陷入局部最优解。

3.2 位置更新:
– 打工狼的位置更新是基于它们与Alpha、Beta、Delta的距离。这个更新模拟了灰狼在狩猎过程中对猎物位置的估计和相应的移动。位置更新的公式如下:

                                                   \begin{aligned} &X_1=X_\alpha-A_1\cdot D_\alpha \\ &X_2=X_\beta-A_2\cdot D_\beta \\ &X_3=X_\delta-A_3\cdot D_\delta \\ &X_\text{new }=\frac{X_1+X_2+X_3}3 \end{aligned}


– 这里,X_{\mathrm{new}} 是灰狼的新位置。A_1,A_2,A_3是另一组动态系数,它们决定灰狼向猎物移动的强度和方向。这些系数的值影响灰狼包围猎物的紧密程度,从而影响搜索行为的探索性 (探索新区域) 和开发性 (利用已知区域)。A 通常从2开始,在迭代过程中逐渐减小到0 。这个减小过程模拟了狩猎过程中灰狼群逐渐逼近猎物的行为。当 A 的值接近于0时,灰狼群更倾向于细致地搜索周围区域,寻找最优解。当 A 的值较大时,灰狼群可能在解空间中进行更广泛的搜索。

3.3 更新

Alpha、Beta和Delta的位置

  • 打工狼更新位置结果后,最优的三只打工狼分别评估成为新的Alpha、Beta和Delta。

4. 最终解

最终解的确定有多种方式。例如,达到最大迭代次数后,Alpha代表的解被认为是最佳解。也可以综合考虑狼首领,副手和军事的决策,即\frac{X_\alpha+X_\beta+X_\delta}3.

GWO的这种设计有效地平衡了探索(Exploration,即搜索新区域)和开发(Exploitation,即在已发现的有希望区域内寻找最优解)的需求。这种平衡是许多优化问题中取得成功的关键。另外,由于灰狼算法在搜索过程中综合考虑了多个领导者(Alpha、Beta和Delta)的信息,它可以适应解空间的多样性,对于不同类型的优化问题都有良好的适应性和鲁棒性。

算法实例讲解

让我们通过求解函数f(x,y)=x^2+y^2的老例子,演示一下一次迭代的过程

1. 初始化

假设我们初始化一个包含 4 个灰狼 (搜索代理) 的群体。每个灰狼的位置是一个 (x,y)坐标对,随机生成。例如:
– 灰狼1: X_1=(x_1,y_1)=(2,-3)
– 灰狼2: X_2=(x_2,y_2)=(-1.5,2)
– 灰狼3:X_3=(x_3,y_3)=(1,1)
– 灰狼4: X_4=(x_4,y_4)=(-2,-1)


2. 评估适应度

计算每个灰狼的适应度(即函数值):
\begin{aligned}&-f\left(X_1\right)=2^2+(-3)^2=4+9=13\\&-f\left(X_2\right)=(-1.5)^2+2^2=2.25+4=6.25\\&-f\left(X_3\right)=1^2+1^2=1+1=2\\&-f\left(X_4\right)=(-2)^2+(-1)^2=4+1=5\end{aligned}

3. 确定Alpha、Beta和Delta

根据适应度,我们有:
– Alpha (最优) :X_3=(1,1)\text{ with }f\left(X_3\right)=2
– Beta (次优) : X_4=(-2,-1)\text{ with }f\left(X_4\right)=5
– Delta (第三优) : X_2=(-1.5,2)\mathrm{~with~}f\left(X_2\right)=6.25

– 打工狼X :X_1=(2,3)\text{ with }f\left(X_1\right)=13

4. 更新打工狼X1的位置
4.1计算目前打工狼X1到狼首领,副手和军师之间的距离:-D_{\alpha1}=|1.5\cdot(1,1)-(2,-3)|=|(1.5,1.5)-(2,-3)|=|(-0.5,4.5)|\\-D_{\beta1}=|1.5\cdot(-2,-1)-(2,-3)|=|(-3,-1.5)-(2,-3)|=|(-5,1.5)|\\-D_{\delta1}=|1.5\cdot(-1.5,2)-(2,-3)|=|(-2.25,3)-(2,-3)|=|(-4.25,6)|
4.2 根据4.1的结果,更新打工狼X1位置:

-X_{11}=(1,1)-1.5\cdot(-0.5,4.5)=(1,1)+(0.75,-6.75)=(1.75,-5.75)

-X_{21}=(-2,-1)-1.5\cdot(-5,1.5)=(-2,-1)+(7.5,-2.25)=(5.5,-3.25)\\-X_{31}=(-1.5,2)-1.5\cdot(-4.25,6)=(-1.5,2)+(6.375,-9)=(4.875,-7)\\X_{\mathrm{new~1}}=\frac{(1.75,-5.75)+(5.5,-3.25)+(4.875,-7)}3=\frac{(12.125,-16)}3=(4.042,-5.333)

这个过程需要重复进行,以更新每个灰狼的位置。由于计算过程比较繁琐,通常在实际应用中会使用计算机程序来执行这些计算。在迭代的每一步中,我们还需要重新评估和更新Alpha、Beta和Delta的位置,因为灰狼群体的动态会根据新的位置变化。

此外,注意实际算法中的 A 和 C 值是动态变化的,通常是随机生成的,以帮助算法有效地探索解空间并避免陷入局部最优。这个示例使用固定的值是为了简化计算和演示算法的基本原理。

在实际的应用场景中,迭代将继续进行,直到达到预定的迭代次数或其他停止条件,比如解的改进小于一个预设的阈值。随着迭代的进行,灰狼群体应逐渐靠近全局最优解的位置。

示例代码实现

编写python脚本求解函数f(x,y)=x^2+y^2的代码如下所示:

import numpy as np
# 定义目标函数
def objective_function(position):
    x, y = position
    return x**2 + y**2
# 灰狼优化器类
class GreyWolfOptimizer:
    def __init__(self, alpha_pos, beta_pos, delta_pos, wolf_count, dim, max_iter):
        self.alpha_pos = np.array(alpha_pos)
        self.beta_pos = np.array(beta_pos)
        self.delta_pos = np.array(delta_pos)
        self.wolf_count = wolf_count
        self.dim = dim
        self.max_iter = max_iter
        self.wolves = np.random.rand(wolf_count, dim) * 10 - 5  # 初始化位置
    def optimize(self):
        for _ in range(self.max_iter):
            # 计算每个灰狼的适应度
            fitness = np.array([objective_function(pos) for pos in self.wolves])
            # 更新Alpha、Beta和Delta的位置
            best_wolves = self.wolves[np.argsort(fitness)[:3]]
            self.alpha_pos, self.beta_pos, self.delta_pos = best_wolves
            a = 2 - _ * (2 / self.max_iter)  # 系数a逐渐减小
            # 更新所有灰狼的位置
            for i in range(self.wolf_count):
                for j in range(self.dim):
                    A1, A2, A3 = a * (2 * np.random.rand() - 1), a * (2 * np.random.rand() - 1), a * (2 * np.random.rand() - 1)
                    C1, C2, C3 = 2 * np.random.rand(), 2 * np.random.rand(), 2 * np.random.rand()
                    D_alpha = abs(C1 * self.alpha_pos[j] - self.wolves[i][j])
                    D_beta = abs(C2 * self.beta_pos[j] - self.wolves[i][j])
                    D_delta = abs(C3 * self.delta_pos[j] - self.wolves[i][j])
                    X1 = self.alpha_pos[j] - A1 * D_alpha
                    X2 = self.beta_pos[j] - A2 * D_beta
                    X3 = self.delta_pos[j] - A3 * D_delta
                    self.wolves[i][j] = (X1 + X2 + X3) / 3
        return self.alpha_pos
# 初始化参数
dim = 2  # 问题维度
wolf_count = 4  # 灰狼数量
max_iter = 20  # 最大迭代次数
# 随机初始化Alpha、Beta和Delta的位置
alpha_pos = np.random.rand(dim) * 10 - 5
beta_pos = np.random.rand(dim) * 10 - 5
delta_pos = np.random.rand(dim) * 10 - 5
# 创建GWO实例
gwo = GreyWolfOptimizer(alpha_pos, beta_pos, delta_pos, wolf_count, dim, max_iter)
# 运行优化
optimal_position = gwo.optimize()
optimal_position, objective_function(optimal_position)

最后,我创建了两个三维图来可视化函数f(x,y)=x^2+y^2 以及灰狼们的初始状态和训练后的状态。来体现算法的优化结果,如下所示:

图片[1]-灰狼优化算法(Grey Wolf Optimizer)-VenusAI

  • 在第一个图(左侧)中,红色点表示灰狼们的初始位置。
  • 在第二个图(右侧)中,蓝色点表示训练(优化)后灰狼们的位置。

从这两个图中可以看出,经过优化算法的迭代,灰狼群体已经从初始位置移向了函数的最小值附近,这表明算法成功地引导灰狼群体接近目标函数的最小值。这个过程展示了灰狼优化算法在寻找函数最小值方面的有效性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS实现初始化、动态点击切换激活样式

食用须知&#xff0c;不懂得把代码交给AI解释一下&#xff0c;明白流程就会用了&#xff0c;本文只有js与html&#xff0c;样式代码一概没有&#xff1a; 效果展示 1、点击显示的盒子代码 <div data-v-e1dd37c4"" class"news-container main-width-contain…

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

通义千问2.5中文能力地表最强

随着人工智能技术的不断进步&#xff0c;智能问答系统已成为人们日常生活中不可或缺的一部分。阿里巴巴集团作为全球领先的科技公司&#xff0c;一直致力于AI领域的研发和创新。最近&#xff0c;阿里巴巴发布了其最新的智能问答系统——通义千问2.5。 通义千问2.5在AI问答领域…

抖音新店怎么对接达人?对接达人秘籍流程分享,让你学会找达人

大家好&#xff0c;我是电商花花。 新手怎么对接达人带货&#xff1f;这是我们新手商家 要考虑的问题。 很多新手抱怨自己新店铺不出单&#xff0c;没有销量&#xff0c;对接达人又怕达人看不上&#xff0c;没有达人愿意帮我带货&#xff0c;在面临这样的情况下不知道该怎么办…

基于自我对弈框架的偏好优化算法SPPO

传统的从人类反馈中进行强化学习&#xff08;RLHF&#xff09;的方法仰赖如Bradley-Terry模型等参数模型,但这样的模型难以充分捕捉人类偏好中的非递移性和非理性。最新的研究进展显示,直接使用偏好机率可以更准确地反映人类偏好,从而实现更灵活、更精确的语言模型对齐。本文提…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击&#xff08;Session Hijacking&#xff09;是一种网络攻击方式&#xff0c;攻击者通过某种手段获取到用户的会话标识&#xff08;Session ID&#xff09;&#xff0c;然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

Go语言系统学习笔记(一):基础篇

1. 写在前面 公司的新业务开发需要用到go语言&#xff0c;虽然之前没接触过这门语言&#xff0c;但在大模型的帮助下&#xff0c;边看项目边写代码也能进行go的项目开发&#xff0c;不过&#xff0c;写了一段时间代码之后&#xff0c;总感觉对go语言本身&#xff0c;我的知识体…

Python尝试安装 pyaudio 时遇到的错误信息表示安装过程失败,原因是找不到 Python.h 头文件

环境&#xff1a; Python 3.8.10 WSL2 问题描述&#xff1a; 尝试安装 pyaudio 时遇到的错误信息表示安装过程失败&#xff0c;原因是找不到 Python.h 头文件 error: subprocess-exited-with-error Building wheel for pyaudio (pyproject.toml) did not run successfully…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

Ubuntu 安装 samba 实现文件共享

1. samba的安装: sudo apt-get install samba sudo apt-get install smbfs2. 创建共享目录 mkdir /home/share sudo chmod -R 777 /home/share3. 创建Samba配置文件: 3.1 保存现有的配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak3.2 打开现有的文件 sudo…

基于小波交叉谱分析的地震波走时变化测量(MATLAB)

地震波在地球介质中传播&#xff0c;带来了丰富的地下介质物性的信息&#xff0c;为了解地球内部结构及运动变化提供了可能。地球内部地震波速度的差异是人们确定地球圈层结构和横向不均匀性的重要物理参数&#xff0c;地下介质应力的变化和积累是地震的孕育和发生的原因&#…

百面算法工程师 | 传统图像处理——OpenCV

本文给大家带来的百面算法工程师是传统图像处理的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将介绍一些集几何变换和图像平滑处理&#xff0c;并提供参考的回答及其理论基础&…

分布式与集群的区别

先说区别&#xff1a; 分布式是并联工作的&#xff0c;集群是串联工作的。 分布式中的每一个节点都可以做集群。而集群并不一定就是分布式的。 集群举例&#xff1a;比如新浪网&#xff0c;访问的人很多&#xff0c;他可以做一个集群&#xff0c;前面放一个相应的服务器&…

微软必应bing国内广告开户费用?如何开户投放?

当下搜索引擎广告无疑是企业触达潜在客户、提升品牌曝光度的重要途径之一&#xff0c;微软必应&#xff08;Bing&#xff09;作为全球第二大搜索引擎&#xff0c;尽管在国内市场份额上可能不敌某些本土巨头&#xff0c;但其独特的用户群体和国际影响力使其成为众多企业拓展市场…

【强化学习入门】基于DDPG的强化学习控制器设计

最近在看控制领域研究热门–强化学习相关的东西&#xff0c;跟着matlab官方强化学习教程一边看一边学&#xff0c;感觉入门门槛略高&#xff0c;需要补很多机器学习相关的知识&#xff0c;高数概率论那些&#xff0c;摸索了个把月感觉现在只大概会用&#xff0c;原理啥的还没搞…

git 常用命令 git怎么撤销命令 持续更新中!!!!

基本流程 # 拉取仓库 git clone 仓库地址 # 拉取最新版本 git pull # 本地提交 git add . git commit -m "本次提交信息&#xff01;" # 推送上云 git push分支 # 创建分支 git checkout -b cart # 删除本机的分支 git branch -d cart # 切换分支 本地切换到主分支…

热爱电子值得做的电子制作实验

加我zkhengyang&#xff0c;进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作&#xff0c;磁带随声听散件&#xff0c;黑白电视机散件制作&#xff0c;功放散件制作&#xff0c;闪光灯散件制作&#xff0c;声控灯散件&#xff0c;等等&#xff0c;可提高动手能…

postman常用功能超全使用教程

Postman 使用 一、Postman 简介 Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求(如:get/post/delete/put…等等),将请求数据发送至服务端,获取对应的响应结果。 二、Postman 功能简介 三、Postman 下载安装 Post…

多模态模型Mini-Gemini:代码模型数据均开源,MiniCPM小钢炮2.0全家桶四连发,可以在Android 手机端上运行的大模型,效果还不错

多模态模型Mini-Gemini&#xff1a;代码模型数据均开源&#xff0c;MiniCPM小钢炮2.0全家桶四连发&#xff0c;可以在Android 手机端上运行的大模型&#xff0c;效果还不错。 多模态模型Mini-Gemini&#xff1a;代码模型数据均开源 香港中文大学终身教授贾佳亚团队提出多模态模…

如何将手写数学公式识别?识别工具在这里

如何将手写数学公式识别&#xff1f;在日常学习中&#xff0c;将手写数学公式识别出来可以极大地提高我们的学习效率。通过这一技术&#xff0c;我们能够快速、准确地将手写公式转化为可编辑的文本&#xff0c;省去了繁琐的输入过程。这不仅节约了时间&#xff0c;还减少了因输…