【智能算法】非洲秃鹫优化算法(AVOA)原理及实现

news2024/11/15 11:14:11

在这里插入图片描述

目录

    • 1.背景
    • 2.算法原理
      • 2.1算法思想
      • 2.2算法过程
    • 3.代码实现
    • 4.参考文献


1.背景

2021年,Abdollahzadeh等人受到非洲秃鹫自然捕食行为启发,提出了非洲秃鹫优化算法(African Vultures Optimization Algorithm, AVOA)。

2.算法原理

2.1算法思想

AVOA模拟了非洲秃鹫在自然界中的捕食过程,是典型的领导者-追随者模式。AVOA通过最优秃鹫和次优秃鹫对整个群体进行引导。

2.2算法过程

在这里插入图片描述

领导者-秃鹰筛选
R ( i ) = { B e s t V u l t u r e 1 i f p i = L 1 B e s t V u l t u r e 2 i f p i = L 2 \left.R(i)=\left\{\begin{array}{ll}BestVulture_1ifp_i=L_1\\BestVulture_2ifp_i=L_2\end{array}\right.\right. R(i)={BestVulture1ifpi=L1BestVulture2ifpi=L2
这里 p i p_i pi是对群体适应度归一化,通过轮盘赌策略选取最佳解策略。
p i = F i ∑ i = 1 n F i p_i=\frac{F_i}{\sum_{i=1}^nF_i} pi=i=1nFiFi
饥饿度
秃鹰的行为受到饥饿水平和能量储备的驱使,成为优化算法中探索和开发阶段转换的关键灵感。饱食时,秃鹰能够飞行更远寻找食物,而饥饿时能量减少,限制了它们的飞行能力。在饥饿时,秃鹰更积极地寻找食物,常常与更强壮的秃鹰一起觅食。
t = h × ( s i n w ( π 2 × i t e r a t i o n i m a x i t e r a t i o n s ) + c o s ( π 2 × i t e r a t i o n i m a x i t e r a t i o n s ) − 1 ) F = ( 2 × r a n d 1 + 1 ) × z × ( 1 − i t e r a t i o n i m a x i t e r a t i o n s ) + t \begin{aligned} &t=h\times\left(sin^{\mathrm{w}}\left(\frac{\pi}{2}\times\frac{iteration_{i}}{maxiterations}\right)+cos\left(\frac{\pi}{2}\times\frac{iteration_{i}}{maxiterations}\right)-1\right) \\ &F=(2\times rand_1+1)\times z\times\left(1-\frac{iteration_i}{maxiterations}\right)+t \end{aligned} t=h×(sinw(2π×maxiterationsiterationi)+cos(2π×maxiterationsiterationi)1)F=(2×rand1+1)×z×(1maxiterationsiterationi)+t
∣ F ∣ > 1 |F|>1 F>1时,全局探索;反之,局部搜索。
探索阶段
P ( i + 1 ) = { R ( i ) − D ( i ) ∗ F , i f P 1 ≥ r a n d P 1 R ( i ) − F + r a n d 2 ∗ ( ( u b − l b ) ∗ r a n d 3 + l b ) , e l s e \mathrm{P}\left(\mathrm{i}+1\right)=\begin{cases}\mathrm{R}(\mathrm{i})-\mathrm{D}(\mathrm{i})*\mathrm{F},\mathrm{if}\mathrm{P}_1\ge\mathrm{rand}_{\mathrm{P}1}\\\mathrm{R}(\mathrm{i})-\mathrm{F}+\mathrm{rand}_2*((\mathrm{u}\mathrm{b}-\mathrm{l}\mathrm{b})*\mathrm{rand}_3+\mathrm{l}\mathrm{b}),\mathrm{else}\end{cases} P(i+1)={R(i)D(i)F,ifP1randP1R(i)F+rand2((ublb)rand3+lb),else
其中, D ( i ) D(i) D(i)表述为:
D ( i ) = ∣ X ∗ R ( i ) − P ( i ) ∣ \mathrm D(\mathrm i)=|\mathrm X*\mathrm R(\mathrm i)-\mathrm P(\mathrm i)| D(i)=XR(i)P(i)
开发阶段
S 1 = R ( i ) × ( r a n d 5 × P ( i ) 2 π ) × c o s ( P ( i ) ) S 2 = R ( i ) × ( r a n d 6 × P ( i ) 2 π ) × s i n ( P ( i ) ) \begin{aligned}S_1&=R(i)\times\left(\frac{rand_5\times P(i)}{2\pi}\right)\times cos(P(i))\\S_2&=R(i)\times\left(\frac{rand_6\times P(i)}{2\pi}\right)\times sin(P(i))\end{aligned} S1S2=R(i)×(2πrand5×P(i))×cos(P(i))=R(i)×(2πrand6×P(i))×sin(P(i))

A 1 = B e s t V u l t u r e 1 ( i ) − B e s t V u l t u r e 1 ( i ) × P ( i ) B e s t V u l t u r e 1 ( i ) − P ( i ) 2 × F A_1=BestVulture_1(i)-\frac{BestVulture_1(i)\times P(i)}{BestVulture_1(i)-P(i)^2}\times F A1=BestVulture1(i)BestVulture1(i)P(i)2BestVulture1(i)×P(i)×F
A 2 = B e s t V u l t u r e 2 ( i ) − B e s t V u l t u r e 2 ( i ) × P ( i ) B e s t V u l t u r e 2 ( i ) − P ( i ) 2 × F A_2=BestVulture_2(i)-\frac{BestVulture_2(i)\times P(i)}{BestVulture_2(i)-P(i)^2}\times F A2=BestVulture2(i)BestVulture2(i)P(i)2BestVulture2(i)×P(i)×F

3.代码实现

%非洲秃鹫优化算法
function [Best_pos, Best_fitness,Iter_curve, History_pos, History_best]=AVOA(pop, dim, ub, lb, fobj,maxIter)
%input
%pop 种群数量
%dim 问题维数
%ub 变量上边界
%lb 变量下边界
%fobj 适应度函数
%maxIter 最大迭代次数
%output
%Best_pos 最优位置
%Best_fitness 最优适应度值
%Iter_curve 每代最优适应度值
%History_pos 每代种群位置
%History_best 每代最优位置
%% 全局记录
Best_pos=zeros(1,dim);
Best_fitness=inf;
Best_vulture2_X=zeros(1,dim);
Best_vulture2_F=inf;
%% 初始化种群
X=initialization(pop,dim,ub,lb);
%% 控制参数
p1=0.6;
p2=0.4;
p3=0.6;
alpha=0.8;
betha=0.2;
gamma=2.5;
%% 迭代
    current_iter=0; % Loop counter
    while current_iter < maxIter
        for i=1:size(X,1)
            % Calculate the fitness of the population
            current_vulture_X = X(i,:);
            current_vulture_F=fobj(current_vulture_X);

            % Update the first best two vultures if needed
            if current_vulture_F<Best_fitness
                Best_fitness=current_vulture_F; % Update the first best bulture
                Best_pos=current_vulture_X;
            end
            if current_vulture_F>Best_fitness && current_vulture_F<Best_vulture2_F
                Best_vulture2_F=current_vulture_F; % Update the second best bulture
                Best_vulture2_X=current_vulture_X;
            end
        end

        a=unifrnd(-2,2,1,1)*((sin((pi/2)*(current_iter/maxIter))^gamma)+cos((pi/2)*(current_iter/maxIter))-1);
        P1=(2*rand+1)*(1-(current_iter/maxIter))+a;

        % Update the location
        for i=1:size(X,1)
            current_vulture_X = X(i,:);  % pick the current vulture back to the population
            F=P1*(2*rand()-1);  

            random_vulture_X=random_select(Best_pos,Best_vulture2_X,alpha,betha);
            
            if abs(F) >= 1 % Exploration:
                current_vulture_X = exploration(current_vulture_X, random_vulture_X, F, p1, ub, lb);
            elseif abs(F) < 1 % Exploitation:
                current_vulture_X = exploitation(current_vulture_X, Best_pos, Best_vulture2_X, random_vulture_X, F, p2, p3, dim, ub, lb);
            end

            X(i,:) = current_vulture_X; % place the current vulture back into the population
        end

        current_iter=current_iter+1;
        X = boundaryCheck(X, lb, ub);
        Iter_curve(current_iter)=Best_fitness;
        History_pos{current_iter} = X;
        History_best{current_iter} = Best_pos;    

    end

end

%% 初始化函数
function [ X ]=initialization(N,dim,ub,lb)
Boundary_no= size(ub,2); 
if Boundary_no==1
    X=rand(N,dim).*(ub-lb)+lb;
end
if Boundary_no>1
    for i=1:dim
        ub_i=ub(i);
        lb_i=lb(i);
        X(:,i)=rand(N,1).*(ub_i-lb_i)+lb_i;
    end
end
end
%%
function [current_vulture_X] = exploitation(current_vulture_X, Best_vulture1_X, Best_vulture2_X, ...
                                                                      random_vulture_X, F, p2, p3, variables_no, upper_bound, lower_bound)

% phase 1
    if  abs(F)<0.5
        if rand<p2
            A=Best_vulture1_X-((Best_vulture1_X.*current_vulture_X)./(Best_vulture1_X-current_vulture_X.^2))*F;
            B=Best_vulture2_X-((Best_vulture2_X.*current_vulture_X)./(Best_vulture2_X-current_vulture_X.^2))*F;
            current_vulture_X=(A+B)/2;
        else
            current_vulture_X=random_vulture_X-abs(random_vulture_X-current_vulture_X)*F.*levyFlight(variables_no);
        end
    end
    % phase 2
    if  abs(F)>=0.5
        if rand<p3
            current_vulture_X=(abs((2*rand)*random_vulture_X-current_vulture_X))*(F+rand)-(random_vulture_X-current_vulture_X);
        else
            s1=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*cos(current_vulture_X);
            s2=random_vulture_X.* (rand()*current_vulture_X/(2*pi)).*sin(current_vulture_X);
            current_vulture_X=random_vulture_X-(s1+s2);
        end
    end
end
%% 
function [current_vulture_X] = exploration(current_vulture_X, random_vulture_X, F, p1, upper_bound, lower_bound)

    if rand<p1
        current_vulture_X=random_vulture_X-(abs((2*rand)*random_vulture_X-current_vulture_X))*F;
    else
        current_vulture_X=(random_vulture_X-(F)+rand()*((upper_bound-lower_bound)*rand+lower_bound));
    end
    
end
%% 随机选择
function [random_vulture_X]=random_select(Best_vulture1_X,Best_vulture2_X,alpha,betha)

    probabilities=[alpha, betha ];
    
    if (rouletteWheelSelection( probabilities ) == 1)
            random_vulture_X=Best_vulture1_X;
    else
            random_vulture_X=Best_vulture2_X;
    end

end
%% 飞行
function [ o ]=levyFlight(d)
  
    beta=3/2;

    sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
    u=randn(1,d)*sigma;
    v=randn(1,d);
    step=u./abs(v).^(1/beta);

    o=step;

end
%% 边界检查
function [ X ] = boundaryCheck(X, lb, ub)

    for i=1:size(X,1)
            FU=X(i,:)>ub;
            FL=X(i,:)<lb;
            X(i,:)=(X(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;
    end
end
%% 轮盘赌策略
function [index] = rouletteWheelSelection(x)

    index=find(rand() <= cumsum(x) ,1,'first');

end

在这里插入图片描述

4.参考文献

[1] Abdollahzadeh B, Gharehchopogh F S, Mirjalili S. African vultures optimization algorithm: A new nature-inspired metaheuristic algorithm for global optimization problems[J]. Computers & Industrial Engineering, 2021, 158: 107408.

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

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

相关文章

13.WEB渗透测试--Kali Linux(一)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;12.WEB渗透测试-Linux系统管理、安全加固&#xff08;下&#xff09;-CSDN博客 kali由 Of…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…

【js刷题:数据结构数组篇之移除元素】

移除元素 一、题目二、思路三、方法1.暴力解法2.双指针法定义快指针和慢指针代码展示 三、力扣刷题1.删除排序数组中的重复项 一、题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额…

vivo统一接入网关VUA转发性能优化实践

作者&#xff1a;vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology&#xff08;QAT&#xff09;来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能&#xff0c;并探讨QAT在不同应用场景中的表现。最…

重学SpringBoot3-内容协商机制

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-内容协商机制 ContentNegotiationConfigurer接口配置内容协商URL参数Accept头使用Url扩展名 自定义内容协商格式步骤1: 注册自定义媒体类型步骤2: 实现H…

AI实战:借助Python与PaddleOCR,实现高精度文本检测与识别

1、引言 欢迎来到今天的教程&#xff1a;“驾驭PaddleOCR&#xff0c;解锁Python文字识别新技能”。在本篇文章中&#xff0c;我们将手把手教你如何安装及使用这款强大的Python库&#xff0c;轻松应对各类图像中的文字识别问题。 2、安装PaddleOCR 首先确保你的环境中已安装…

苹果电脑下载crossover对电脑有影响吗 crossover mac 好用吗CrossOver虚拟机 CrossOver打游戏

苹果电脑下载crossover对电脑有影响吗&#xff1f; 在苹果电脑下载安装crossover对电脑没有什么影响&#xff0c;并且可以解决macOS系统不能安装Windows应用程序的问题。相较于虚拟机和双系统而言&#xff0c;crossover安装软件更简单&#xff0c;占用内存也更小。下面我们来看…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减…

可行性研究报告模板

1业务需求可行性分析 2技术可行性分析 2.1规范化原则 2.2高度的兼容性和可移植性 2.3人性化、适用性 2.4标准化统一设计原则 2.5先进安全可扩展性原则 3开发周期可行性分析 4人力资源可行性分析 5成本分析 6收益分析 7结论 软件项目全套资料获取下载&#xff1a;软件开发全套资…

链路聚合练习

下面的接口都改为Etherent [LSW1]int Eth-Trunk 1 创建一个eth-trunk 1[LSW1-Eth-Trunk1]int g0/0/1[LSW1-GigabitEthernet0/0/1]eth-trunk 1 将接口0/0/1加入eth-trunk 1[LSW1-GigabitEthernet0/0/1]int g0/0/2[LSW1-GigabitEthernet0/0/2]eth-trunk 1[LSW1-GigabitEthernet…

CAQ六西格玛绿带认证流程:从能力考试到评价全解析

六西格玛绿带认证&#xff0c;作为质量管理领域的一个重要里程碑&#xff0c;对于专业人士来说是一项极具价值的认证。张驰咨询将详细解读这一流程&#xff0c;包括理论知识考试、项目实践能力评价&#xff0c;以及期满换证的相关细节。 一、理论知识考试 六西格玛绿带的理论…

OpenAI机器人,一出手就是王炸

「借助 OpenAI 的能力&#xff0c;Figure 01 现在可以与人全面对话了&#xff01;」 本周三&#xff0c;半个硅谷都在投的明星机器人创业公司Figure&#xff0c;发布了自己第一个 OpenAI 大模型加持的机器人 demo。 这家公司在 3 月 1 日刚刚宣布获得 OpenAI 等公司的投资&…

论文阅读——VSA

VSA: Learning Varied-Size Window Attention in Vision Transformers 方法&#xff1a; 给定输入特征X&#xff0c;VSA首先按照基线方法的例程&#xff0c;将这些标记划分为几个窗口Xw&#xff0c;窗口大小为预定义的w。我们将这些窗口称为默认窗口&#xff0c;并从默认窗口中…

(一)搭建Android Studio开发环境

一、JDK 1、下载 2、安装 双击进行安装&#xff0c;修改安装路径为&#xff1a;D:\Java\jdk-17.0.4.1即可&#xff0c;安装完成后目录如下&#xff1a; 配置环境变量 3、测试 WinR&#xff0c;输入cmd&#xff0c;按Enter后&#xff0c;键入&#xff1a;java --version&…

面试经典-18-合并两个有序链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 解 class Solution {// 成功public ListNode mergeTwoLists(ListN…

探索世界的第一步:新生儿抬头指南

引言&#xff1a; 新生儿的抬头能力是他们发展早期的重要里程碑之一。这不仅是对颈部肌肉的锻炼&#xff0c;更是对视觉和感觉系统的发展的重要促进。在这个阶段&#xff0c;父母的关注和引导至关重要&#xff0c;以帮助宝宝安全地探索和发展。 1. 激发兴趣&#xff1a; 从宝宝…

matlab调用nlopt时向目标函数中传入数据的案例

matlab调用nlopt时向目标函数中传入数据的案例&#xff0c;如代码所示&#xff1a; clc,clear,close allopt.algorithm NLOPT_LN_AUGLAG; opt.lower_bounds -10; opt.upper_bounds 10; opt.min_objective (x) goal_function(x,[1,2,3,4,5,6,7,8,9]); opt.xtol_rel 1e-8; …

week07day01(powerbi)

一. Power BI简介 1. 构成部分 power query: 进行简单的数据清洗power pivot : 进行指标计算power view &#xff1a; 进行报表视图 二. Power Query (进行数据清洗) 1. 如何获取数据&#xff1a; 点击获取数据 ——> 选择导入数据的类型——> 会出现 "加载&…

Python学习:数据类型转换

数据类型转换 对数据内置的类型进行转换&#xff0c;数据类型的转换&#xff0c;一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种&#xff1a; 隐式类型转换 - 自动完成显式类型转换 - 需要使用类型函数来转换 隐式类型转换 Python 会自动…

c/c++ | 求叶子结点个数 |构建B树 | 动态规划--找叶子结点个数

是这样的&#xff0c;一道代码题&#xff0c;根据输入数据&#xff0c;计算运行结果 #include<bits/stdc.h> using namespace std; vector<int>g[10]; int ans 0; void dfs(int x){if(g[x].size() 0){ans;return;}for(int i 0; i < g[x].size(); i){dfs(g[x]…