群体优化算法---灰狼优化算法学习介绍以及在卷积神经网络训练上的应用

**长文预警**

介绍

在自然界中,狼群的社会结构和捕猎策略展现了高度的智能和协调性,灰狼优化算法(Grey Wolf Optimizer, GWO)正是受此启发提出的一种群体智能优化算法。GWO主要模拟了灰狼的社会等级制度和捕猎行为,其核心在于利用灰狼群的捕猎策略来搜索全局最优解

灰狼的社会等级与行为

1. 社会等级
灰狼的社会结构主要分为四个等级:
α狼:群体的领导者,负责做出决策,如捕猎、睡觉地点的选择等。
β狼:辅助α狼管理狼群,通常是次级领导者。
δ狼:地位较低的成员,服从α和β狼。
ω狼:最低等级的狼,主要负责跟随和服从群体。

2. 捕猎行为
灰狼的捕猎过程大致可分为三个阶段:
围捕(Encircling):狼群包围猎物。
追踪与骚扰(Hunting and Harassment):通过不断接近和干扰猎物,逐步削弱其体力。
攻击(Attacking):最终发起攻击捕获猎物。

灰狼优化算法的基本原理

1.初始种群的生成
GWO从一组随机生成的灰狼个体开始。每个个体对应一个候选解,在解空间中进行搜索。种群大小一般固定为n。

2. 社会等级的划分
在GWO中,α、β、δ狼分别代表当前搜索到的最优解、次优解和第三优解,其余的狼则作为ω狼。通过不断迭代更新,狼群中的个体逐渐靠近全局最优解。

3. 模拟围捕行为
围捕行为通过数学公式进行模拟:
在这里插入图片描述

4. 位置更新
灰狼的位置更新不仅仅依赖于单一的α狼,而是通过α、β、δ狼的位置来共同决定,这样可以避免陷入局部最优。位置更新公式如下:
在这里插入图片描述

灰狼优化算法步骤

1.初始化:设定种群大小、最大迭代次数,并初始化灰狼种群的位置。
2.适应度评价:计算每个个体的适应度值,并确定α、β、δ狼的位置。
3.位置更新:根据围捕、追踪与骚扰行为更新灰狼的位置。
4.迭代:重复适应度评价和位置更新步骤,直到达到最大迭代次数或收敛条件。
5.输出最优解。

应用领域

GWO因其简洁性和高效性,广泛应用于各类优化问题,包括但不限于:

函数优化:如多峰函数的全局优化。
工程优化:如结构设计优化、调度问题等。
机器学习:如神经网络的参数优化。
图像处理:如图像分割、特征选择等

优势与局限性

优势
简洁性:算法实现简单,不需要复杂的参数设置。
全局搜索能力强:通过模拟灰狼的捕猎行为,有效避免陷入局部最优。
适应性强:适用于连续和离散优化问题,具有广泛的应用前景。
局限性
参数依赖性:虽然参数较少,但参数的设置对算法性能有一定影响。
收敛速度:在某些复杂问题上,收敛速度可能不够理想,需要结合其他优化方法

改进与发展

为了提升GWO的性能,研究者提出了多种改进算法,如:

混合算法:将GWO与其他优化算法(如遗传算法、粒子群优化)结合,增强搜索能力。
动态参数调整:根据迭代过程中的反馈信息,动态调整算法参数,提高适应性。
多种群协作:利用多个种群协同搜索,提高全局搜索能力和收敛速度

代码

由于本文示例涉及到的代码有三个脚本,所以建议在matlab新建一个文件夹,命名随意
gwo_optimize.cnn.m

function best_params = gwo_optimize_cnn(train_data, train_labels, val_data, val_labels, max_iter, n_wolves)% Initialize the populationdim = 2; % Example: learning rate, number of conv layerslb = [1e-4, 1]; % Lower bounds for the parametersub = [1e-2, 5]; % Upper bounds for the parameterswolves = repmat(lb, n_wolves, 1) + rand(n_wolves, dim) .* (repmat(ub, n_wolves, 1) - repmat(lb, n_wolves, 1));alpha = inf; beta = inf; delta = inf;alpha_pos = zeros(1, dim); beta_pos = zeros(1, dim); delta_pos = zeros(1, dim);for iter = 1:max_iterfor i = 1:n_wolves% Calculate fitness for each wolffitness = evaluate_cnn(wolves(i, :), train_data, train_labels, val_data, val_labels);% Update alpha, beta, delta wolvesif fitness < alphadelta = beta; delta_pos = beta_pos;beta = alpha; beta_pos = alpha_pos;alpha = fitness; alpha_pos = wolves(i, :);elseif fitness < betadelta = beta; delta_pos = beta_pos;beta = fitness; beta_pos = wolves(i, :);elseif fitness < deltadelta = fitness; delta_pos = wolves(i, :);endend% Update positionsa = 2 - iter * (2 / max_iter);for i = 1:n_wolvesfor j = 1:dimA1 = 2 * a * rand() - a; C1 = 2 * rand();D_alpha = abs(C1 * alpha_pos(j) - wolves(i, j));X1 = alpha_pos(j) - A1 * D_alpha;A2 = 2 * a * rand() - a; C2 = 2 * rand();D_beta = abs(C2 * beta_pos(j) - wolves(i, j));X2 = beta_pos(j) - A2 * D_beta;A3 = 2 * a * rand() - a; C3 = 2 * rand();D_delta = abs(C3 * delta_pos(j) - wolves(i, j));X3 = delta_pos(j) - A3 * D_delta;wolves(i, j) = (X1 + X2 + X3) / 3;endendendbest_params = alpha_pos;
endfunction fitness = evaluate_cnn(params, train_data, train_labels, val_data, val_labels)% Extract parameterslearning_rate = params(1);num_conv_layers = round(params(2));% Create CNNlayers = [imageInputLayer([28 28 1]);];for i = 1:num_conv_layerslayers = [layers;convolution2dLayer(3, 8 * i, 'Padding', 'same');batchNormalizationLayer();reluLayer();maxPooling2dLayer(2, 'Stride', 2);];endlayers = [layers;fullyConnectedLayer(10); % The output size should match the number of classes (10 for MNIST)softmaxLayer();classificationLayer()];% Training optionsoptions = trainingOptions('sgdm', ...'InitialLearnRate', learning_rate, ...'MaxEpochs', 10, ...'MiniBatchSize', 64, ...'Shuffle', 'every-epoch', ...'ValidationData', {val_data, val_labels}, ...'ValidationFrequency', 30, ...'Verbose', false, ...'Plots', 'training-progress');% Train the networknet = trainNetwork(train_data, train_labels, layers, options);% Evaluate the networkpredicted_labels = classify(net, val_data);accuracy = sum(predicted_labels == val_labels) / numel(val_labels);% Fitness is defined as 1 - accuracy to minimize the fitnessfitness = 1 - accuracy;
end

load_dataset.m

function [train_data, train_labels, val_data, val_labels] = load_dataset()% 加载MNIST数据集作为示例% 这里假设数据已经预处理为[28 28 1]大小的灰度图像% 你可以使用MATLAB提供的内置函数加载MNIST数据集[XTrain, YTrain] = digitTrain4DArrayData;[XValidation, YValidation] = digitTest4DArrayData;% 转换标签格式train_data = XTrain;train_labels = YTrain;val_data = XValidation;val_labels = YValidation;
end

main.m

% main.m% 加载数据
[train_data, train_labels, val_data, val_labels] = load_dataset();% 设置GWO参数
max_iter = 20;
n_wolves = 10;% 运行GWO优化
best_params = gwo_optimize_cnn(train_data, train_labels, val_data, val_labels, max_iter, n_wolves);% 显示最佳参数
disp('最佳参数:');
disp(['学习率: ', num2str(best_params(1))]);
disp(['卷积层数: ', num2str(round(best_params(2)))]);

在命令行窗口使用cd命令进入刚创建的文件夹,然后执行 run(‘main.m’)

说明

GWO核心算法:通过不断迭代更新狼群的位置,模拟灰狼围捕猎物的行为,最终找到最优解。
CNN架构定义与训练:根据GWO优化的参数(如学习率、卷积层数、全连接层数),定义CNN的架构并进行训练。
适应度计算:在每次迭代中,通过计算验证集上的准确率,评估当前参数的优劣,并更新狼群位置。

效果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

深度学习 - 激活函数

深度学习 - 激活函数 激活函数&#xff08;Activation Function&#xff09;是神经网络中的关键组件&#xff0c;用于引入非线性&#xff0c;使得网络能够学习和表示复杂的模式和关系。以下是几种常见的激活函数及其详细解释&#xff1a; 1. Sigmoid&#xff08;S型激活函数&…

Playwright框架入门

自从2023年底playwright框架火起来之后,很多小伙伴咨询我们这个框架,甚至问我们什么时候出这个课程. 这步这个课程在我们千呼万唤中出来了.具体的课程大纲和试听可以联系下方二维码获取. 今天给大家分享一下playwright的安装和一些常用API,为后续的学习做好准备工作. Playwrig…

Unit9

Unit9 gene 基因&#xff0c;生产&#xff0c;类型 genetic genius ingenious generate generation degenerate genuine generous generosity gender genre homogeneous time 时间 time timely timer first-timer temporary temporarily tempo contemporary dra 戏剧…

欧智通恒玄BES2600W基于Openharmony v3.0的分布式软总线测试过程记录

恒玄BES2600W SoC 的欧智通的单板基于Openharmony v3.0的底座&#xff0c;其测试的样例代码是基于恒玄公司开发的轻量带屏显示产品样例代码&#xff0c;主要包括图形、软总线等特性产品的开发。 基础介绍&#xff1a; ​ L0的系统基于Liteos-m的m内核&#xff0c;网络使用lwi…

计算机网络--传输层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 概述 1.1 传输层的意义 网络层可以把数据从一个主机传送到另一个主机&#xff0c;但是没有和进程建立联系。 传输层就是讲进程和…

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗&#xff1f;4.消息堆积如何解决&#xff1f; 总结 用redis也是比较久了&#xff0c;并且…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天&#xff0c;很高兴自己可以坚持&#xff0c;也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Feign是如何发送http请求的

1、接口定义 首先&#xff0c;开发者使用Feign提供的注解&#xff08;如FeignClient&#xff09;定义接口&#xff0c;并在接口中定义HTTP请求的方法&#xff0c;这些方法将映射到远程服务的具体HTTP请求。 2、动态代理 当应用启动时&#xff0c;Feign会通过动态代理和反射机…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构&#xff0c;用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作&#xff0c;使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法&#xff1a; select {case communica…

Python中的函数式编程特性深入探讨

Python中的函数式编程特性深入探讨 Python,作为一种多范式编程语言,不仅支持面向对象编程(OOP),同样也对函数式编程(FP)提供了良好的支持。函数式编程是一种编程范式,它将计算机程序看作是一系列函数的求值,并避免使用可变状态和共享状态。本文将深入探讨Python中的函…

数据赋能(112)——体系:监控数据采集——影响因素、直接作用、主要特征

影响因素 影响监控数据采集的主要影响因素如下&#xff1a; 采样率&#xff1a;采样率是指采集数据的频率。采样率决定了监控的实时性与精确度&#xff0c;一般来说&#xff0c;采样率越高&#xff0c;监控的实时性就越高&#xff0c;精确度也越高。但是&#xff0c;过高的采…

2024 cicsn SuperHeap

文章目录 参考沙箱存在protobuf逆向buy_booksee_bookreturn_bookedit_booksearch_book 思路exp 参考 https://hakuya.work/post/7 https://akaieurus.github.io/2024/05/20/2024%E5%9B%BD%E8%B5%9B%E5%88%9D%E8%B5%9Bpwn-wp/#SuperHeap https://blog.csdn.net/m0_63437215/art…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代&#xff0c;机房作为数据中心的核心设施&#xff0c;承载着重要的网络设备和数据存储设备&#xff0c;其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多&#xff0c;且运行过程中涉及大量的数据交换和传输。一旦发生安全事…

java 类加载器及双亲委派机制

1、 有哪些类加载器 还有自定义类加载器。最上面的为父加载器&#xff0c;加载类的路径是不一样的 2、 什么是双亲委派机制&#xff1a; 1. 加载时&#xff0c;先去找父类&#xff0c;父类无法加载时&#xff0c;在由儿子加载 3、 为什么用双亲委派&#xff1a; 沙箱安全&…

【devops】 Bytebase 一站式开源 数据库DevOps平台

初识 Bytebase 1、安装 安装地址 https://www.bytebase.com/docs/get-started/self-host/#docker 安装指令 docker run --init \--name bytebase \--publish 8080:8080 --pull always \--volume ~/.bytebase/data:/var/opt/bytebase \bytebase/bytebase:2.18.02、登录-dashboa…

OlSoul系统调校程序v2024.06.05

软件介绍 OlSoul是一款能够适配用于Win各个系统的系统调校软件&#xff0c;OlSoul内置有众多调校功能可以直接使用&#xff0c;如有启用无线网络功能、启用打印机功能、系统快速休眠与休眠开关、快捷方式小箭头去除功能等&#xff0c;具体的调校功能多达几十项&#xff0c;可自…

Android SplashActivity runs twice at launch on Android 13 API 33

运行写好的 Android App 到自己手机上&#xff08;显示Xiaomi 23013RK75C Android 13 API 33&#xff09;&#xff0c; 通过 Logcat 发现第一次安装运行时启动页面的 onCreate 被调用两次&#xff0c;第一次 onCreate 函数中的 savedInstanceState 值为空&#xff0c;第二次不…

【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常&#xff0c;通常在元素与当前页面的状态不同步时抛出&#xff0c;比如页面已经刷新或导航到另一个页面&#xff0c;但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…

RT-DETR 详解之 Efficient Hybrid Encoder

在先前的博文中&#xff0c;博主介绍了RT-DETR在官方代码与YOLOv8集成程序中的训练与推理过程&#xff0c;接下来&#xff0c;博主将通过代码调试的方式来梳理RT-DETR的整个过程。 整体结构 RT-DETR的代码调试大家可以参考博主这篇文章&#xff1a; 在梳理整个代码之前&…

几何关系运算处理

1. 判断点在线的左边还是右边 要判断一个坐标点在直线的左侧还是右侧&#xff0c;可以使用向量叉积。具体来说&#xff0c;对于给定的直线和点&#xff0c;我们可以计算点到直线的向量与直线的方向向量的叉积。叉积的符号可以用于判断点的位置关系&#xff1a; 如果叉积为正&…