2024.04最新 鹦鹉优化算法 (PO) 开源MATLAB代码

1.算法简介

引用自:Lian J, Hui G, Ma L, et al. Parrot optimizer: Algorithm and applications to medical problems[J]. Computers in Biology and Medicine, 2024, 172: 108064.
鹦鹉优化器(PO)是一种受自然界中鹦鹉行为启发的新型元启发式优化算法。这一算法的设计灵感源自于鹦鹉的社交行为、觅食策略以及它们对环境的适应能力。PO算法通过模拟鹦鹉在自然环境中的行为模式,如搜索食物、群体协作和社会学习,来解决复杂的优化问题。
在这里插入图片描述

2.灵感来源与核心思想

2.1 灵感来源

在这里插入图片描述
Pyrrhura Molinae是一种备受喜爱的鹦鹉品种,因其迷人的外观、与主人的亲密关系以及易于训练的特点,成为宠物主人的热门选择。以往的研究与繁殖努力揭示了Pyrrhura Molinae展现出的四种独特行为特质:觅食、停留、交流及对陌生人的恐惧[。这些行为,在现实情境中生动展现如上图所示,构成了我们设计鹦鹉优化器(PO)的灵感来源。

  • 觅食行为:家养的Pyrrhura Molinae的觅食行为令人着迷,它们倾向于成小群活动,寻找食物丰饶之地[54]。它们通过朝向食物的方向移动,利用主人的位置和群体的存在进行搜索。视觉提示和嗅觉帮助它们提高搜索效率。
  • 停留行为:停留行为指的是Pyrrhura Molinae随机栖息在主人身体的不同部位。
  • 交流行为:这些善于社交的鸟类会发出独特的叫声,在群体内进行沟通,既促进了社交互动,也传播了信息。
  • 对陌生人的恐惧:如同多数鸟类,Pyrrhura Molinae天生对陌生人感到恐惧,这促使它们远离不熟悉的人,寻求主人的庇护以求安全。

2.2 核心思想

  • 探索:类似于鹦鹉寻找新食物来源,算法在解空间中随机探索,寻找潜在的优质解。
  • 开发:一旦发现了好的解,算法就像鹦鹉聚集在丰富食物源一样,集中资源进一步细化和优化这些解。
  • 社会学习:算法中的个体(即搜索代理)通过观察和模仿群体中表现优异的同伴,学习更好的解。
  • 恐惧反应:引入了对陌生环境或潜在威胁的反应,这有助于算法跳出局部最优,避免过早收敛。
  • 通信:模仿鹦鹉间的通信,算法促进个体间的信息交换,提高搜索效率。

3.主要步骤

3.1 种群初始化

对于提议的PO算法,考虑到群体规模 N N N、最大迭代次数 M a x i t e r Maxiter Maxiter 以及搜索空间的界限 l b lb lb(下界)和 u b ub ub(上界),初始化公式可以表示为:

X i 0 = l b + r a n d ( 0 , 1 ) ⋅ ( u b − l b ) (1) X^0_i = lb + rand(0, 1) \cdot (ub - lb) \tag{1} Xi0=lb+rand(0,1)(ublb)(1)

其中, r a n d ( 0 , 1 ) rand(0, 1) rand(0,1) 表示范围在 [0, 1] 之间的随机数,而 X i 0 X^0_i Xi0 代表初始阶段第 i i i 只 Pyrrhura Molinae 的位置。

3.2 觅食行为

在 PO 的觅食行为中,鹦鹉主要通过观察食物位置或参照主人位置来估计食物的大致位置,然后飞向相应地点。因此,位置移动遵循以下方程:

X i t + 1 = ( X i t − X b e s t ) ⋅ L e v y ( d i m ) + r a n d ( 0 , 1 ) ⋅ ( 1 − t M a x i t e r ) 2 t M a x i t e r ⋅ X m e a n t (2) X^{t+1}_i = (X^t_i - X_{best}) \cdot Levy(dim) + rand(0, 1) \cdot \left(1 - \frac{t}{Maxiter}\right)^{\frac{2t}{Maxiter}} \cdot X^t_{mean} \tag{2} Xit+1=(XitXbest)Levy(dim)+rand(0,1)(1Maxitert)Maxiter2tXmeant(2)

在上述方程中, X i t X^t_i Xit 表示当前位置,而 X i t + 1 X^{t+1}_i Xit+1 意味着更新后的下一个位置。 X m e a n t X^t_{mean} Xmeant 表示当前群体中的平均位置, L e v y ( D ) Levy(D) Levy(D) 表示莱维分布,用于描述鹦鹉的飞行。 X b e s t X_{best} Xbest 表示从初始化到当前搜索到的最佳位置,同时也代表了主人的当前位置。 t t t 表示当前迭代次数。 ( X i t − X b e s t ) ⋅ L e v y ( d i m ) (X^t_i - X_{best}) \cdot Levy(dim) (XitXbest)Levy(dim) 表示基于与主人相对位置的移动,而 r a n d ( 0 , 1 ) ⋅ ( 1 − t M a x i t e r ) 2 t M a x i t e r ⋅ X m e a n t rand(0, 1) \cdot \left(1 - \frac{t}{Maxiter}\right)^{\frac{2t}{Maxiter}} \cdot X^t_{mean} rand(0,1)(1Maxitert)Maxiter2tXmeant 表示观察群体整体位置以进一步锁定食物方向。这一过程在图2中展示。

当前群体的平均位置 X m e a n t X^t_{mean} Xmeant,使用如下公式计算:

X m e a n t = 1 N ∑ k = 1 N X k t (3) X^t_{mean} = \frac{1}{N} \sum^{N}_{k=1} X^t_k \tag{3} Xmeant=N1k=1NXkt(3)

莱维分布可以通过遵循公式 (4) 的规则获得,其中 γ \gamma γ 赋值为 1.5:

L e v y ( d i m ) = { μ ⋅ σ ⋅ ∣ v ∣ − 1 γ μ ∼ N ( 0 , d i m ) v ∼ N ( 0 , d i m ) σ = ( Γ ( 1 + γ ) ⋅ sin ⁡ ( π γ 2 ) Γ ( 1 + γ 2 ) ⋅ γ ⋅ 2 1 + γ 2 ) 1 γ + 1 (4) Levy(dim) = \begin{cases} \mu \cdot \sigma \cdot |v|^{\frac{-1}{\gamma}} \\ \mu \sim N(0, dim) \\ v \sim N(0, dim) \\ \sigma = \left(\frac{\Gamma(1+\gamma) \cdot \sin\left(\frac{\pi \gamma}{2}\right)}{\Gamma\left(\frac{1+\gamma}{2}\right) \cdot \gamma \cdot 2^{\frac{1+\gamma}{2}}}\right)^{\frac{1}{\gamma+1}} \end{cases} \tag{4} Levy(dim)= μσvγ1μN(0,dim)vN(0,dim)σ=(Γ(21+γ)γ221+γΓ(1+γ)sin(2πγ))γ+11(4)

3.3 停留行为

Pyrrhura Molinae 是一种高度社交的生物,其停留行为主要涉及突然飞向主人身体的任意部位,并在那里停留一段时间。这一过程在图3中展示。这一过程可以表示为:

X i t + 1 = X i t + X b e s t ⋅ L e v y ( d i m ) + r a n d ( 0 , 1 ) ⋅ o n e s ( 1 , d i m ) (5) X^{t+1}_i = X^t_i + X_{best} \cdot Levy(dim) + rand(0, 1) \cdot ones(1, dim) \tag{5} Xit+1=Xit+XbestLevy(dim)+rand(0,1)ones(1,dim)(5)

其中, o n e s ( 1 , d i m ) ones(1, dim) ones(1,dim) 表示维度为 d i m dim dim 的全1向量。 ( X b e s t ⋅ L e v y ( d i m ) ) (X_{best} \cdot Levy(dim)) (XbestLevy(dim)) 表示飞向主人的过程,而 r a n d ( 0 , 1 ) ⋅ o n e s ( 1 , d i m ) rand(0, 1) \cdot ones(1, dim) rand(0,1)ones(1,dim) 表示随机停留在主人身体的一部分。

3.4 交流行为

Pyrrhura Molinae 鹦鹉本质上是群居动物,其特征是在群体内部密切交流。这种交流行为包括飞向群体并与之交流,以及不飞向群体而进行交流。在 PO 算法中,假设这两种行为发生的概率相等,当前群体的平均位置被用来象征群体的中心。这一过程在图4中展示。

3.5 对陌生人的恐惧行为

通常而言,鸟类对陌生人表现出天然的恐惧感,Pyrrhura Molinae 鹦鹉也不例外。它们远离不熟悉的个体,并寻求主人的安全,寻找安全环境的行为在图5中展示,具体描述如下:

X i t + 1 = X i t + r a n d ( 0 , 1 ) ⋅ cos ⁡ ( 0.5 π ⋅ t M a x i t e r ) ⋅ ( X b e s t − X i t ) − cos ⁡ ( r a n d ( 0 , 1 ) ⋅ π ) ⋅ ( t M a x i t e r ) 2 M a x i t e r ⋅ ( X i t − X b e s t ) (6) X^{t+1}_i = X^t_i + rand(0, 1) \cdot \cos\left(\frac{0.5\pi \cdot t}{Maxiter}\right) \cdot (X_{best} - X^t_i) - \cos(rand(0, 1) \cdot \pi) \cdot \left(\frac{t}{Maxiter}\right)^{\frac{2}{Maxiter}} \cdot (X^t_i - X_{best}) \tag{6} Xit+1=Xit+rand(0,1)cos(Maxiter0.5πt)(XbestXit)cos(rand(0,1)π)(Maxitert)Maxiter2(XitXbest)(6)

其中, r a n d ( 0 , 1 ) ⋅ cos ⁡ ( 0.5 π ⋅ t M a x i t e r ) ⋅ ( X b e s t − X i t ) rand(0, 1) \cdot \cos\left(\frac{0.5\pi \cdot t}{Maxiter}\right) \cdot (X_{best} - X^t_i) rand(0,1)cos(Maxiter0.5πt)(XbestXit) 显示了重新定向飞向主人的过程,而 cos ⁡ ( r a n d ( 0 , 1 ) ⋅ π ) ⋅ ( t M a x i t e r ) 2 M a x i t e r ⋅ ( X i t − X b e s t ) \cos(rand(0, 1) \cdot \pi) \cdot \left(\frac{t}{Maxiter}\right)^{\frac{2}{Maxiter}} \cdot (X^t_i - X_{best}) cos(rand(0,1)π)(Maxitert)Maxiter2(XitXbest) 显示了远离陌生人的移动过程。

4.伪代码与核心代码

4.1流程图与伪代码

流程图

在这里插入图片描述

伪代码
1. 初始化PO参数  
2. 随机初始化解决方案的位置  
3. 对于 i = 1:Max_iter 执行以下操作  
   - 计算适应度函数  
   - 查找最佳位置  
   - 对于 j = 1:N 执行以下操作  
     - 行为1:觅食行为  
         如果 St == 1 则  
             根据式(2)更新位置  
     - 行为2:停留行为  
         否则,如果 St == 2 则  
             根据式(5)更新位置  
     - 行为3:交流行为  
         否则,如果 St == 3 则  
             根据式(6)更新位置  
     - 行为4:陌生人恐惧行为  
         否则,如果 St == 4 则  
             根据式(7)更新位置  
   - 结束  
4. 返回最佳解决方案  
5. 结束

4.2 核心代码(PO函数)

function [Score, Best_pos, CPO_curve] = PO(Search_Agents, Max_iterations, Lowerbound, Upperbound, dimensions, objective)

% 如果上下界是标量,则转换为向量
if (max(size(Upperbound)) == 1)
    Upperbound = Upperbound .* ones(1, dimensions);
    Lowerbound = Lowerbound .* ones(1, dimensions);
end

%% 初始化
X0 = initialization(Search_Agents, dimensions, Upperbound, Lowerbound); % 初始化种群
X = X0;

% 计算初始适应度值
fitness = zeros(1, Search_Agents);
for i = 1:Search_Agents
    fitness(i) = objective(X(i, :));
end
[fitness, index] = sort(fitness); % 排序
GBestF = fitness(1); % 全局最佳适应度值
AveF = mean(fitness); % 平均适应度值
for i = 1:Search_Agents
    X(i, :) = X0(index(i), :);
end
CPO_curve = zeros(1, Max_iterations); % 收敛曲线
GBestX = X(1, :); % 全局最佳位置
X_new = X;

%% 开始搜索
for i = 1:Max_iterations
    if mod(i,100) == 0
      display(['迭代次数 ', num2str(i), ' 当前最佳适应度值 ', num2str(CPO_curve(max(1,i-1)))]);
    end
    alpha = rand(1) / 5;
    sita = rand(1) * pi;
    for j = 1:Search_Agents
        St = randi([1, 4]);
        % 觅食行为
        if St == 1
                X_new(j, :) = (X(j, :) - GBestX) .* Levy(dimensions) + rand(1) * mean(X) * (1 - i / Max_iterations) ^ (2 * i / Max_iterations);

        % 停留行为
        elseif St == 2
                X_new(j, :) = X(j, :) + GBestX .* Levy(dimensions) + randn() * (1 - i / Max_iterations) * ones(1, dimensions);

        % 交流行为
        elseif St == 3
                H = rand(1);
                if H < 0.5
                    X_new(j, :) = X(j, :) + alpha * (1 - i / Max_iterations) * (X(j, :) - mean(X));
                else
                    X_new(j, :) = X(j, :) + alpha * (1 - i / Max_iterations) * exp(-j / (rand(1) * Max_iterations));
                end
        % 恐惧陌生人行为
        else
                X_new(j, :) = X(j, :) + rand() * cos((pi *i )/ (2 * Max_iterations)) * (GBestX - X(j, :)) - cos(sita) * (i / Max_iterations) ^ (2 / Max_iterations) * (X(j, :) - GBestX);
        end
   
        % 边界控制
        Flag4ub = X_new(j,:) > Upperbound;
        Flag4lb = X_new(j,:) < Lowerbound;
        X_new(j,:) = (X_new(j,:).*(~(Flag4ub+Flag4lb))) + Upperbound.*Flag4ub + Lowerbound.*Flag4lb;
       
        % 更新最佳位置
        fitness_new(j) = objective(X_new(j, :));
        if fitness_new(j) < GBestF
            GBestF = fitness_new(j);
            GBestX = X_new(j, :);
        end
    end
   
    % 更新位置
    X = X_new;
    fitness = fitness_new;
    CPO_curve(i) = GBestF;
    Best_pos = GBestX;
    Score = CPO_curve(end);
end

%% Levy搜索策略
function o = Levy(d)
    beta = 1.5;
    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   

end

核心代码(免费自取)

链接:https://pan.baidu.com/s/1tTpL0OOk-wWyGVS34J31ew
提取码:9999

本篇文章不靠卖代码赚取收益,麻烦给个点赞和关注,后续还会有开源的免费优化算法及其代码,栓Q!同时如果大家有想要的算法可以在评论区打出,如果有空的话我可以帮忙复现

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值