基于人工蜂群算法的函数寻优算法

2023-11-08

一、理论基础

受到蜜蜂群体的有组织的觅食过程的启发,Karaboga提出了模拟蜜蜂群体觅食过程的人工蜂群(Artificial Bee Colony) 算法用于解决多维度多峰谷的优化问题。该算法创始之初被用来寻找SphereRosenbrockRastrigin函数的最小值。
首先对蜜蜂基于摇摆舞进行觅食的过程特征进行介绍。在图1中,存在两个已发现的食物源A和B。初始时,潜在工蜂以非雇佣蜂的身份进行搜索。它并不知道蜂房附近的任何蜜源的信息。因此,它有以下两个可能的选择:
(1)成为一个侦察蜂,秉着自身潜在动力或外在因素自发的搜索蜂房附近的区域(见图1中的S);
(2)在观看摆尾舞后,成为一个被招募者,并开始搜索蜜源(见图1中的R)。
在定位蜜源之后,该蜜蜂能够利用自身的能力来记住食物源的位置,并立刻对它进行探索。该蜜蜂现在成为了一个雇佣蜂。雇佣蜂采到蜂蜜后,从蜜源处返回蜂房并将蜂蜜卸载到蜜室中。在卸载完蜂蜜后,雇佣蜂有下列三个选择:
(1)放弃已经采集过的蜜源,成为一个受其他摇尾舞招募的跟随者(UF)。
(2)施展摇尾舞技,招募蜂房内的同伴,再次回到原先采集过的食物源(EF1)。
(3)不招募其它的蜜蜂,继续探索采集过的食物源(EF2)。
在这里插入图片描述

图1 蜜蜂觅食行为图

二、算法流程

人工蜂群算法由连续的四个阶段组成,分别是初始化阶段引领(雇佣)蜂阶段跟随蜂阶端侦察蜂阶段
人工蜂群算法中将人工蜂群分为引领蜂跟随蜂侦察蜂三类,每一次搜索过程中,引领蜂和跟随蜂是先后开采食物源,即寻找最优解,而侦察蜂是观察是否陷入局部最优,若陷入局部最优则随机地搜索其它可能的食物源。每个食物源代表问题一个可能解,食物源的花蜜量对应相应解的质量(适应度值 f i t fit fit)。
ABC算法流程图如图2所示。
在这里插入图片描述

图2 ABC算法流程图

1、初始化阶段

人工蜂群算法搜索过程中,首先需要初始化,其中包括种群数量、最大迭代次数、控制参数和确定搜索空间即解的范围,在搜索空间中随机生成初始解 x i ( i = 1 , 2 , 3 , … … , N P ) x_i(i=1,2,3,……,NP) xi(i=1,2,3,,NP) N P NP NP为食物源数量,每个解 x i x_i xi是一个 D D D维的向量, D D D是问题的维数。初始化之后,整个种群将进行引领蜂、跟随蜂和侦察蜂搜寻过程的重复循环,直到达到最大迭代次数或误差允许值。

2、引领蜂阶段

每个引领蜂由式(1)产生一个新解即新食物源, v i j = x i j + ϕ i j ( x i j − x k j ) (1) v_{ij}=x_{ij}+\phi_{ij}(x_{ij}-x_{kj})\tag{1} vij=xij+ϕij(xijxkj)(1)其中, k = 1 , 2 , . . . , N P , j = 1 , 2 , . . . , D k={1,2,...,NP},j={1,2,...,D} k=1,2,...,NP,j=1,2,...,D,且 k ≠ i k≠i k=i ϕ i j \phi_{ij} ϕij [ − 1 , 1 ] [-1,1] [1,1]之间的随机数。计算新解的 f i t i fit_i fiti并评价它,若新解的 f i t i fit_i fiti优于旧解,则引领蜂更新旧解为新解。反之,保留旧解。

3、跟随蜂阶段

在所有引领蜂完成搜寻过程之后,引领蜂会在招募区跳摇摆舞把解的信息与跟随蜂分享。跟随蜂根据式(2)(即轮盘赌法)计算每个解的选择概率, p i = f i t i ∑ k = 1 N P f i t k (2) p_i=\frac{fit_i}{\displaystyle\sum_{k=1}^{NP}fit_k}\tag{2} pi=k=1NPfitkfiti(2)然后在区间 [ 0 , 1 ] [0,1] [0,1]内随机产生一个数,如果解的概率值大于该随机数,则跟随蜂由式(1)产生一个新解,并检验新解的 f i t i fit_i fiti,若新解的 f i t i fit_i fiti比之前好,则跟随蜂更新旧解为新解;反之,保留旧解。

4、侦察蜂阶段

在所有跟随蜂完成搜寻过程之后,如果一个解经过探索限值 l i m i t limit limit次循环仍然没有被进一步更新,那么就认为此解陷入局部最优,该食物源就会被丢弃。设食物源 x i x_i xi被丢弃,则此食物源对应的引领蜂变成一个侦查蜂。侦察蜂由(3)式产生一个新的食物源代替它。 x i j = x j m i n + r i j ( x j m a x − x j m i n ) (3) x_{ij}=x_j^{min}+r_{ij}(x_j^{max}-x_j^{min})\tag{3} xij=xjmin+rij(xjmaxxjmin)(3)其中 i = 1 , 2 , ⋯   , N P , j = 1 , 2 , ⋯   , D i=1,2,\cdots,NP,j=1,2,\cdots,D i=1,2,,NP,j=1,2,,D x i j x_{ij} xij是第 i i i个解的第 j j j个维度, x j m a x x_j^{max} xjmax x j m i n x_j^{min} xjmin分别是问题第 j j j个维度的上限和下限, r i j r_{ij} rij是一个 [ 0 , 1 ] [0,1] [0,1]之间的随机数。然后返回引领蜂搜索过程,开始重复循环。

5、食物源

在食物源初始化或者每个食物源被分配给每个引领蜂后,采用公式(4)来计算每个解的适应度。 f i t i ( t ) = { 1 1 + f i ( t ) f i ( t ) ≥ 0 1 + ∣ f i ( t ) ∣ f i ( t ) < 0 (4) fit_i(t)=\begin{dcases}\frac{1}{1+f_i(t)}\quad f_i(t)≥0\\1+|f_i(t)|\quad f_i(t)<0\end{dcases}\tag{4} fiti(t)=1+fi(t)1fi(t)01+fi(t)fi(t)<0(4)其中, f i t i fit_i fiti是第 i i i个解的适应值, f i f_i fi是第 i i i个个体对于优化问题的目标函数。

三、MATLAB程序实现

1、清空环境变量

程序运行之前,清除工作空间Workspace中的变量及Command Window中的命令。具体程序如下:

%% 清空环境变量
clc;
clear;
close all;

2、问题设定

在进行优化之前,需要明确优化的目标函数。具体程序如下:

%% 问题设定
CostFunction = @(x) Rosenbrock(x);   % 目标函数
nVar = 5;               % 变量个数
VarSize = [1 nVar];     % 变量矩阵
VarMin = -10;           % 变量下限
VarMax = 10;            % 变量上限

Rosenbrock函数的三维立体图如图3所示。
在这里插入图片描述

图3 Rosenbrock函数的三维立体图
Rosenbrock函数的代码如下:
function [y] = Rosenbrock(xx)
%% Rosenbrock函数
d = length(xx);
sum = 0;
for ii = 1:(d-1)
	xi = xx(ii);
	xnext = xx(ii+1);
	new = 100*(xnext-xi^2)^2 + (xi-1)^2;
	sum = sum + new;
end
y = sum;

3、参数设置

代码如下:

%% ABC参数
%% ABC参数
MaxIt = 200;                  % 最大迭代次数
nPop = 100;                   % 蜂群大小
nOnlooker = nPop;             % 侦察蜂个数
L = round(0.6*nVar*nPop);     % 探索极值限制参数
a = 1;                        % 加速度系数上限

4、初始化蜜蜂种群

在计算之前,需要对蜜蜂种群进行初始化。同时,为了加快程序的执行速度,对于程序中涉及的一些过程变量,需要预分配其存储容量。具体程序如下:

%% 初始化
% 置空蜜蜂矩阵
empty_bee.Position = [];
empty_bee.Cost = [];
% 初始化蜂群数组
pop = repmat(empty_bee, nPop, 1);
% 初始化最优解
BestSol.Cost = inf;
% 产生初始种群
for i = 1:nPop
    pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
    pop(i).Cost = CostFunction(pop(i).Position);
    if pop(i).Cost <= BestSol.Cost
        BestSol = pop(i);
    end
end
% 丢解计数器
C = zeros(nPop, 1);
% 保存最优函数值的数组
BestCost = zeros(MaxIt, 1);

5、迭代优化

代码如下:

%% ABC迭代
for it = 1:MaxIt
    % 引领蜂
    for i = 1:nPop
        % 随机选择不等于i的k
        K = [1:i-1 i+1:nPop];
        k = K(randi([1 numel(K)]));
        % 定义加速度系数
        phi = a*unifrnd(-1, +1, VarSize);
        % 新的蜜蜂位置
        newbee.Position = pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
        % 边界处理
        newbee.Position = max(newbee.Position, VarMin);
        newbee.Position = min(newbee.Position, VarMax);
        % 新的蜜蜂函数值
        newbee.Cost = CostFunction(newbee.Position);
        % 比较
        if newbee.Cost <= pop(i).Cost
            pop(i) = newbee;
        else
            C(i) = C(i)+1;
        end
    end
    % 计算适应度值和选择概率
    F = zeros(nPop, 1);
    MeanCost = mean([pop.Cost]);
    for i = 1:nPop
        % 将函数值转换为适应度
        if pop(i).Cost >= 0
            F(i) = 1/(1+pop(i).Cost);
        else
            F(i) = 1+abs(pop(i).Cost);
        end
    end
    P = F/sum(F);
    % 跟随蜂
    for m = 1:nOnlooker
        % 选择食物源
        i = RouletteWheelSelection(P);
        % 随机选择不等于i的k
        K = [1:i-1 i+1:nPop];
        k = K(randi([1 numel(K)]));
        % 定义加速度系数
        phi = a*unifrnd(-1, +1, VarSize);
        % 新的蜜蜂位置
        newbee.Position = pop(i).Position+phi.*(pop(i).Position-pop(k).Position);
        % 边界处理
        newbee.Position = max(newbee.Position, VarMin);
        newbee.Position = min(newbee.Position, VarMax);
        % 新的蜜蜂函数值
        newbee.Cost = CostFunction(newbee.Position);
        % 比较
        if newbee.Cost <= pop(i).Cost
            pop(i) = newbee;
        else
            C(i) = C(i) + 1;
        end
    end
    % 侦察蜂
    for i = 1:nPop
        if C(i) >= L    % 超出探索极值参数
            maxPos = max(pop(i).Position);
            minPos = min(pop(i).Position);
            for j = 1:numel(pop(i).Position)
                pop(i).Position(j) = minPos+rand*(maxPos-minPos);
            end
            pop(i).Cost = CostFunction(pop(i).Position);
            C(i) = 0;
        end
    end
    % 更新每轮最优解
    for i = 1:nPop
        if pop(i).Cost <= BestSol.Cost
            BestSol = pop(i);
        end
    end
    % 保存每轮最优解
    BestCost(it) = BestSol.Cost;
    % 显示迭代信息
    disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end

6、结果显示

为了更为直观地对结果进行观察和分析,以图形的形式将结果显示出来,具体程序如下:

%% 结果显示
figure;
% plot(BestCost, 'LineWidth', 2);
semilogy(BestCost, 'r', 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;

ABC算法进化过程如图4所示。
在这里插入图片描述

图4 ABC算法进化过程

四、参考文献

[1] D. Karaboga. An idea based on honey bee swarm for numerical optimization[M]. Technical report-tr06, Erciyes university, engineering faculty, computer engineering department, 2005.
[2] 于文杰. 基于人工蜂群算法的无线传感器网络部署问题研究[D]. 成都: 电子科技大学, 2018.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于人工蜂群算法的函数寻优算法 的相关文章

  • 整数的十进制表示形式中的分隔数字

    例如 我想将用户输入作为整数输入 45697 并将前两位数字存储在数组 向量或其他内容中 例如 4 5 6 9 7 这样我就可以使用一些函数调用来检查前两个值 4 5 并对它们进行计算 问题 我不知道如何存储恢复前两个值 有没有简单的函数调
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • MATLAB - 通过垂直连接子矩阵重新排列矩阵

    我在执行以下任务时遇到问题 假设一个 3x6 矩阵 A 0 2787 0 2948 0 4635 0 8388 0 0627 0 0435 0 6917 0 1185 0 3660 0 1867 0 2383 0 7577 0 6179 0
  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he

随机推荐

  • Dart基础语言 — 布尔

    Dart基础语言 布尔 声明 为了代表布尔值 Dart 有一个名字为 bool 的类型 只有两个对象是布尔类型的 true 和 false 所创建的对象 这两个对象也都是编译时常量 bool bool a print a 只有 true 对
  • 涵盖大部分核心组件使用的 Spring Cloud 教程,一定要收藏哦!

    耗时2个多月 周更两篇的Spring Cloud 全套教程终于完成了 想学习 Spring Cloud 的小伙伴们抓紧了 简介 这是一套涵盖大部分核心组件使用的Spring Cloud教程 包括Spring Cloud Alibaba及分布
  • 3、Mybatis通过注解的形式实现增、删、改、查

    上一节介绍了通过XML配置的形式实现增 删 该 查 本节介绍通过注解的形式实现增 删 该 查 还是以数据库中的users表为例 1 首先建立users表对应的bean package com lzj mybaits test1 public
  • 使用 Stable Diffusion 生成的仿旧照片和二次元图片

    这几天在电脑上运行 Stable Diffusion 玩了玩 这是我机器上的测试页面 https qizhen xyz genimg 这个模型比 Dall E 的小很多 所以才能在配置不高的个人电脑上跑 而且 我的电脑也只能勉强生成小尺寸的
  • 2023深圳杯(东三省)数学建模D题思路 - 基于机理的致伤工具推断

    1 赛题 D题 基于机理的致伤工具推断 致伤工具的推断一直是法医工作中的热点和难点 由于作用位置 作用方式的不同 相同的致伤工具在人体组织上会形成不同的损伤形态 不同的致伤工具也可能形成相同的损伤形态 致伤工具品种繁多 形态各异 但大致可分
  • 基于JAVA+SpringBoot+Vue+ElementUI中学化学实验室耗材管理系统

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 当前 中学的化
  • MATLAB的统计每个列向量的个数

    tabulate 变量名 例子 统计age列向量里面有多少个不同年龄的个数 tabulate age 下面还有很多太长了 没有截图
  • [Unity3D]关于Android真机调测Profiler

    Unity3D 关于Android真机调测Profiler 2013 08 25 13 28 50 转载 标签 android profiler adb it 分类 Unity3d U3D中的Profile也是可以直接在链接安卓设备运行游戏
  • 280场周赛

    6004 得到 0 的操作数 给你两个 非负 整数 num1 和 num2 每一步 操作 中 如果 num1 gt num2 你必须用 num1 减 num2 否则 你必须用 num2 减 num1 例如 num1 5 且 num2 4 应
  • 悬赏百万美金检测Deepfake假视频,数据集470G:比赛很久没这么壕

    2019 12 13 13 51 52 车栗子 发自 凹非寺 量子位 报道 公众号 QbitAI 谁说Kaggle比赛都那么穷 穷不穷 还要看做的是什么任务 比如 有左右两段视频 你能分辨哪个是修过的么 动图结尾公布了答案 右是原始视频 左
  • 刷视频课的脚本

    是不是不想上视频课 是不是被迫要上视频课 是不是视频课很长 是不是如果挂机短短几分钟就会出现自动暂停的情况 是不是还在为这些烦恼 那么 掌声 只需一台空置的电脑 这个代码可以为你解决这些烦恼 话不多说 上代码 import time imp
  • QT moveToThread线程理解

    一 moveToThread创建开启线程步骤 1 创建继承自QObject类 实现槽函数 2 将QObject类通过moveToThread方法移到QThread线程中 使QObject类依附于线程 3 连接信号槽 槽必须是QObject类
  • [LeetCode-70]-Climbing Stairs(爬楼梯,斐波那契数列问题)

    文章目录 题目相关 Solution 题目相关 题目解读 该题就是斐波那契数列问题 可以使用递归方法实现 原题描述 原题链接 You are climbing a stair case It takes n steps to reach t
  • NFS详细介绍

    NFS介绍 网络文件系统 network files system 简称NFS是一种基于TCP传输协议的文件共享习通 NFS的CS体系中的服务端启用协议将文件共享到网络上 然后允许本地NFS客户端通过网络挂载服务端共享的文件 应用场景 为w
  • LeetCode 题 -7. 整数反转

    题目 给出一个 32 位的有符号整数 你需要将这个整数中每位上的数字进行反转 示例 1 输入 123 输出 321 示例 2 输入 123 输出 321 示例 3 输入 120 输出 21 注意 假设我们的环境只能存储得下 32 位的有符号
  • JS逆向之网易云音乐

    文章目录 1 目标网站 2 初步分析 3 定位加密参数生成位置 4 编码测试 4 1 定义AES加密方法 4 2 调用两次AES加密获取params 4 3 获取歌曲的url 4 4 单曲下载初步测试代码 4 5 飙升榜单音乐批量抓取 文章
  • MySql中把一个表的数据插入到另一个表中

    1 如果2张表的字段一致 并且希望插入全部数据 可以用这种方法 INSERT INTO 目标表 SELECT FROM 来源表 例如 insert into insertTest select from insertTest2 2 如果只希
  • 2020年加密货币领域的5大做市商,都有谁?

    什么是加密货币做市 与传统做市商相比 加密货币做市是一个新的事物 本文旨在更好地了解加密货币做市商的行为 首先 让我们通过探索对做市流程的基本了解来研究什么是做市 简而言之 做市是一种交易活动 交易员同时向金融市场上的交易双方 买方和卖方
  • 超详细图解!【MySQL进阶篇】MySQL架构原理

    MySQL体系架构 MySQL Server架构自顶向下大致可以分网络连接层 服务层 存储引擎层和系统文件层 一 网络连接层 客户端连接器 Client Connectors 提供与MySQL服务器建立的支持 目前几乎支持所有主流 的服务端
  • 基于人工蜂群算法的函数寻优算法

    文章目录 一 理论基础 二 算法流程 1 初始化阶段 2 引领蜂阶段 3 跟随蜂阶段 4 侦察蜂阶段 5 食物源 三 MATLAB程序实现 1 清空环境变量 2 问题设定 3 参数设置 4 初始化蜜蜂种群 5 迭代优化 6 结果显示 四 参