!!!只需要代码的直接跳转到最后一节,有开源代码
- 1.算法简介
- 2.灵感来源与核心思想
- 2.1 灵感来源
- 2.2 核心思想
- 3.主要步骤
- 3.1 种群初始化
- 3.2 觅食行为
- 3.3 停留行为
- 3.4 交流行为
- 3.5 对陌生人的恐惧行为
- 4.伪代码与核心代码
- 4.1流程图与伪代码
- 流程图
- 伪代码
- 4.2 核心代码(PO函数)
- 核心代码(免费自取)
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)⋅(ub−lb)(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=(Xit−Xbest)⋅Levy(dim)+rand(0,1)⋅(1−Maxitert)Maxiter2t⋅Xmeant(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) (Xit−Xbest)⋅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)⋅(1−Maxitert)Maxiter2t⋅Xmeant 表示观察群体整体位置以进一步锁定食物方向。这一过程在图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=1∑NXkt(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)v∼N(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+Xbest⋅Levy(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)) (Xbest⋅Levy(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)⋅(Xbest−Xit)−cos(rand(0,1)⋅π)⋅(Maxitert)Maxiter2⋅(Xit−Xbest)(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)⋅(Xbest−Xit) 显示了重新定向飞向主人的过程,而 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⋅(Xit−Xbest) 显示了远离陌生人的移动过程。
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_Agentsfitness(i) = objective(X(i, :));
end
[fitness, index] = sort(fitness); % 排序
GBestF = fitness(1); % 全局最佳适应度值
AveF = mean(fitness); % 平均适应度值
for i = 1:Search_AgentsX(i, :) = X0(index(i), :);
end
CPO_curve = zeros(1, Max_iterations); % 收敛曲线
GBestX = X(1, :); % 全局最佳位置
X_new = X;%% 开始搜索
for i = 1:Max_iterationsif mod(i,100) == 0display(['迭代次数 ', num2str(i), ' 当前最佳适应度值 ', num2str(CPO_curve(max(1,i-1)))]);endalpha = rand(1) / 5;sita = rand(1) * pi;for j = 1:Search_AgentsSt = randi([1, 4]);% 觅食行为if St == 1X_new(j, :) = (X(j, :) - GBestX) .* Levy(dimensions) + rand(1) * mean(X) * (1 - i / Max_iterations) ^ (2 * i / Max_iterations);% 停留行为elseif St == 2X_new(j, :) = X(j, :) + GBestX .* Levy(dimensions) + randn() * (1 - i / Max_iterations) * ones(1, dimensions);% 交流行为elseif St == 3H = rand(1);if H < 0.5X_new(j, :) = X(j, :) + alpha * (1 - i / Max_iterations) * (X(j, :) - mean(X));elseX_new(j, :) = X(j, :) + alpha * (1 - i / Max_iterations) * exp(-j / (rand(1) * Max_iterations));end% 恐惧陌生人行为elseX_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) < GBestFGBestF = fitness_new(j);GBestX = X_new(j, :);endend% 更新位置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!同时如果大家有想要的算法可以在评论区打出,如果有空的话我可以帮忙复现