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

news2025/1/18 6:58:54
**长文预警**

介绍

在自然界中,狼群的社会结构和捕猎策略展现了高度的智能和协调性,灰狼优化算法(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 population
    dim = 2; % Example: learning rate, number of conv layers
    lb = [1e-4, 1]; % Lower bounds for the parameters
    ub = [1e-2, 5]; % Upper bounds for the parameters
    
    wolves = 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_iter
        for i = 1:n_wolves
            % Calculate fitness for each wolf
            fitness = evaluate_cnn(wolves(i, :), train_data, train_labels, val_data, val_labels);
            
            % Update alpha, beta, delta wolves
            if fitness < alpha
                delta = beta; delta_pos = beta_pos;
                beta = alpha; beta_pos = alpha_pos;
                alpha = fitness; alpha_pos = wolves(i, :);
            elseif fitness < beta
                delta = beta; delta_pos = beta_pos;
                beta = fitness; beta_pos = wolves(i, :);
            elseif fitness < delta
                delta = fitness; delta_pos = wolves(i, :);
            end
        end
        
        % Update positions
        a = 2 - iter * (2 / max_iter);
        for i = 1:n_wolves
            for j = 1:dim
                A1 = 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;
            end
        end
    end
    
    best_params = alpha_pos;
end

function fitness = evaluate_cnn(params, train_data, train_labels, val_data, val_labels)
    % Extract parameters
    learning_rate = params(1);
    num_conv_layers = round(params(2));
    
    % Create CNN
    layers = [
        imageInputLayer([28 28 1]);
        ];
    
    for i = 1:num_conv_layers
        layers = [layers;
            convolution2dLayer(3, 8 * i, 'Padding', 'same');
            batchNormalizationLayer();
            reluLayer();
            maxPooling2dLayer(2, 'Stride', 2);
            ];
    end
    
    layers = [layers;
        fullyConnectedLayer(10); % The output size should match the number of classes (10 for MNIST)
        softmaxLayer();
        classificationLayer()];
    
    % Training options
    options = 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 network
    net = trainNetwork(train_data, train_labels, layers, options);
    
    % Evaluate the network
    predicted_labels = classify(net, val_data);
    accuracy = sum(predicted_labels == val_labels) / numel(val_labels);
    
    % Fitness is defined as 1 - accuracy to minimize the fitness
    fitness = 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.coloradmin.cn/o/1802139.html

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

相关文章

MySQL数据库(详解)

目录 前言 一、数据库的基本概念 1.数据(Data) 2.表 3.数据库 4.数据库管理系统(DBMS) 5.数据库系统 二、数据库系统发展史 1.第一代数据库 2.第二代数据库 3.第三代数据库 三、当今主流数据库介绍 1.SQL Server (微软公司产品) 2.Oracle (甲骨文公司产品) 3.DB…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形&#xff1f;Excel是我们常用的办公软件&#xff0c;当我们使用Excel拉动单元格时表头不变形&#xff0c;该如何操作呢&#xff0c;下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

[word] 在Word中插入分页符 #经验分享#经验分享#笔记

在Word中插入分页符 在 Word中插入分页符&#xff1f;教大家如何在正文中快速的插入分页符。 ? ? ?1、在正文中选择我们要分页的位置。 ? ? ?2、点击插入&#xff0c;选择分页功能里面的“分页符”功能&#xff0c;即可成功在我们选择的位置进行分页。 ? ? ? ?以上…

存在d盘里的数据突然没有了?别担心,恢复方案在此

在数字化时代&#xff0c;数据存储的重要性不言而喻。然而&#xff0c;有时候我们会遭遇一些意想不到的困扰&#xff0c;比如存储在D盘的数据突然消失。这不仅可能导致重要文件的丢失&#xff0c;还可能影响我们的工作和生活。本文将探讨D盘数据消失的可能原因&#xff0c;提供…

这10个python库,下载都超过5亿

python的库数不胜数。哪些库使用得最多呢。今天分享10个下载都超过5亿的python库。从高到低排序 第一名&#xff1a;Urllib3 下载次数&#xff1a;8.93亿次 介绍&#xff1a;Urllib3是一个功能强大且用户友好的HTTP客户端库&#xff0c;提供了许多Python标准库中没有的特性&…

Golang | Leetcode Golang题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) int {a, b : 0, 0for _, num : range nums {b (b ^ num) &^ aa (a ^ num) &^ b}return b }

Linux卸载残留MySQL【带图文命令巨详细】

Linux卸载残留MySQL 1、检查残留mysql2、检查并删除残留mysql依赖3、检查是否自带mariadb库 1、检查残留mysql 如果残留mysql组件&#xff0c;使用命令 rpm -e --nodeps 残留组件名 按顺序进行移除操作 #检查系统是否残留过mysql rpm -qa | grep mysql2、检查并删除残留mysql…

【小白专用24.6.8】C#Lambda表达式

Lambda表达式可以采用以下任意一种形式的表达式&#xff1a; 1.表达式Lambda&#xff0c;表达式为其主体&#xff1a; (input-parameters) > expression 1 2.语句Lambda&#xff0c;语句块作为其主体&#xff1a; (input-parameters) > {<sequence-of-statements>…

数据结构之初识泛型

目录&#xff1a; 一.什么是泛型 二.引出泛型 三.泛型语法及&#xff0c;泛型类的使用和裸类型(Raw Type) 的了解 . 四.泛型的编译&#xff1a; 五.泛型的上界 六.泛型方法 注意&#xff1a;在看泛型之前可以&#xff0c;回顾一下&#xff0c;包装类&#xff0c;包装类就是服务…

Mac保姆级配置jdk环境

1.找到下载的jdk环境 通常是这个。留作备用 /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin 然后新开一个终端下执行以下命令 sudo vim ~/.bash_profile 进入编辑模式后 按 i 开始添加内容结束编辑模式按 ESC结束后保存输入 :wq!不保存输入 :q! 注意…

Elastic Platform 8.14:ES|QL 正式发布、静态加密和向量搜索优化

作者&#xff1a;来自 Elastic Gilad Gal, Tyler Perkins, Alex Chalkias, Trevor Blackford, Ninoslav Miskovic, Fabio Busatto, Aris Papadopoulos Elastic Platform 8.14 提供了 Elasticsearch 查询语言 (ES|QL) 的正式发行版 (GA) — Elastic 中数据探索和操作的未来。它还…

编写一个程序,提示用户输入三个点 p0、p1 和 p2,显示 p2 是否在从 p0 到 p1 的线段左侧、右侧,或者在该直线上。

(几何:点的位置)给定一个从点 p0(x0&#xff0c;y0)到pl(xl&#xff0c;pl)的有向线段&#xff0c;可以使用下面的条件来确定点 p2(x2&#xff0c;y2)是在线段的左侧、右侧&#xff0c;或者在该直线上(见下图): 编写一个程序&#xff0c;提示用户输入三个点 p0、p1 和 p2&#…

力扣78. 子集

给你一个整数数组nums&#xff0c;数组中的元素互不相同。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集。你可以按任意顺序返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],[1,3…

spring源码解析-(1)关于Bean

什么是Bean&#xff1f; 是spring对所有注入到IoC容器中的类的统称。 我们要注册进入spirng的bean千奇百怪&#xff0c;所以spring必须需要使用一个统一的定义来标识bean&#xff0c;就有了接下来的BeandDefinition&#xff0c;通过名称我们就可以知道&#xff0c;他是对bean…

Apache IoTDB 分布式架构三部曲(三)副本与共识算法

IoTDB 首创并应用的共识协议统一框架&#xff0c;为用户提供了灵活选择不同共识算法的可能性。 对于一个分布式集群而言&#xff0c;为了使得海量数据场景下集群能够横向扩展&#xff0c;集群需要按照一定的规则将全部数据分成多个子集存储在不同的节点上&#xff0c;从而能够更…

【C/C++】——小白初步了解——内存管理

目录 1. C/C内存分布 代码区&#xff08;Code Segment&#xff09;&#xff1a; 数据区&#xff08;Data Segment&#xff09;&#xff1a; 堆区&#xff08;Heap&#xff09;&#xff1a; 栈区&#xff08;Stack&#xff09;&#xff1a; 常量区&#xff08;Constant Seg…

spring boot 2.1 集成activiti 6.0.0和activiti-modeler 5.23.0可视化编辑器(随记)

先上pom&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.or…

AI高考大战,揭秘五大热门模型谁能问鼎数学之巅?

在高考前&#xff0c;我就有想法了&#xff0c;这一次让AI来做做高考题。就用国内的大模型&#xff0c;看哪家的大模型解题最厉害。 第一天考完&#xff0c;就拿到了2024高考数学2卷的电子版&#xff0c;这也是重庆市采用的高考试卷 这次选了5个AI工具&#xff0c;分别是天工&a…

【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析&#xff1a;使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…

hot100 -- 二分查找

目录 前言 &#x1f382;搜索插入位置 &#x1f33c;搜索二维矩阵 &#x1f33c;排序数组元素第一和最后一个位置 &#x1f33c;旋转排序数组 &#x1f4aa;旋转排序数组中的最小值 &#x1f4aa;两个正序数组的中位数 前言 二分算法学习_时间超限ac:0%-CSDN博客 &#…