目录
1 蜻蜓算法概述
2 蜻蜓算法数学模型
2.1 分离
2.2 对齐
2.3 聚集
2.4 食物吸引
2.5 天敌驱散
3 完整matlab代码实现
3.1 主函数代码
3.2 子函数代码
此算法在电力系统中也有很多应用
自然充满了执行不同任务的社会行为。尽管所有个体和集体行为的最终目标是生存,但生物在群体、畜群、学校、殖民地和羊群中合作和互动有几个原因:狩猎、防御、导航和觅食。例如,狼群拥有组织最完善的狩猎社交互动之一。狼倾向于遵循社会领导以不同的步骤捕猎猎物:追逐猎物、盘旋猎物、骚扰猎物和攻击猎物 。集体防御的一个例子是海洋中的鱼群。数以千计的鱼类形成了一个鱼群,并通过相互警告来避开捕食者,使得捕食者的捕食变得非常困难。
蜻蜓算法(DA)。 DA算法的主要灵感来源于自然界蜻蜓静态和动态的成群行为。优化、探索和开发的两个基本阶段是通过对蜻蜓在导航、寻找食物和在动态或统计上成群时避开敌人的社会互动进行建模来设计的。接下来文章还考虑了 DA 的二进制和多目标版本的方法,分别称为二进制 DA (BDA) 和多目标 (MODA)。所提出的算法由几个数学测试函数和一个定性和定量的真实案例研究进行了基准测试。该算法能够改善给定问题的初始随机种群,收敛到全局最优,并提供非常有竞争力的结果。 MODA 的结果还表明,该算法倾向于为多目标问题找到具有高度均匀分布的帕累托最优解的非常精确的近似值。潜艇螺旋桨设计问题得到的一组设计证明了MOD的优点。
蜻蜓算法寻优计算主要思路通过模拟蜻蜓的捕食行为来实现(图1),该飞行(进化)寻优机制可以表示为蜻蜓群体分离、对齐、聚集、食物吸引与天敌驱散五个步骤。
表示避免蜻蜓个体距离太近降低寻优效率:
式中Ek为蜻蜓k的分离度;D表示当前蜻蜓的位置;Dj代表第j个邻近蜻蜓的位置;J代表群体中第k个蜻蜓的邻近蜻蜓的数量。
表示某个蜻蜓与其邻近蜻蜓个体速度的相同程度:
式中Uk为蜻蜓k的对齐度;Vj代表第j个邻近蜻蜓的飞行速度;其他符号意义同前。
表示某个蜻蜓具有朝着其附近较优蜻蜓个体靠近的趋势:
式中Bk为蜻蜓k的聚集度;其他符号意义同前。
食物是指某一次迭代计算中最优个体的位置:
式中Sk为蜻蜓k的食物吸引度;D+代表当前计算中最优蜻蜓的位置。
目的是使个体尽可能远离最差的蜻蜓个体,提高寻优计算效率:
式中Tk为蜻蜓k的天敌驱散度;D-代表当前计算中最差蜻蜓的位置。
蜻蜓个体k飞行位置更新步长:
蜻蜓飞行位置更新:
式中e、u、b、s、t分别表示分离度、对齐度、聚集度、食物吸引度、天敌驱散度的影响系数;β代表惯性系数;l代表反复迭代计数下标;其他符号意义同前。
二进制蜻蜓优化算法在电力系统中的应用(附Matlab完整代码)
%=====目标函数============
function [o] = MyCost(x)o=sum(x); % 这个目标函数比较简单,可以换成自己需要的目标函数end
Food_fitness=inf; Enemy_fitness=-inf; %% 初始化X和DeltaX向量 Fitness=zeros(1,N); for iter=1:max_iter Food_fitness=inf; Enemy_fitness=-inf; %% 初始化X和DeltaX向量 Fitness=zeros(1,N); for iter=1:max_iter
function [Best_pos, Best_score ,Convergence_curve]=BDA(N, max_iter, nVar, CostFunction)dim=nVar;Food_fitness=inf;
Food_pos=zeros(dim,1);Enemy_fitness=-inf;
Enemy_pos=zeros(dim,1);%% 初始化X和DeltaX向量
for i&#61;1:N,for j&#61;1:nVar if rand<&#61;0.5X(j,i)&#61;0;elseX(j,i)&#61;1;endif rand<&#61;0.5DeltaX(j,i)&#61;0;elseDeltaX(j,i)&#61;1;endend
endFitness&#61;zeros(1,N);for iter&#61;1:max_iterw&#61;0.9-iter*((0.9-0.4)/max_iter);my_c&#61;0.1-iter*((0.1-0)/(max_iter/2));if my_c<0my_c&#61;0;ends&#61;2*rand*my_c; % 分离权重a&#61;2*rand*my_c; % 对齐权重c&#61;2*rand*my_c; % 聚集权重f&#61;2*rand; % 食物吸引权重e&#61;my_c; % 天敌驱散权重if iter>(3*max_iter/4)e&#61;0;end%% &#61;&#61;&#61;&#61;&#61;&#61;首先计算所有的目标值&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;for i&#61;1:N Fitness(1,i)&#61;CostFunction(X(:,i)&#39;);if Fitness(1,i)function o&#61;Levy(d)beta&#61;3/2;sigma&#61;(gamma(1&#43;beta)*sin(pi*beta/2)/(gamma((1&#43;beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
u&#61;randn(1,d)*sigma;
v&#61;randn(1,d);
step&#61;u./abs(v).^(1/beta);o&#61;0.01*step;
function [Best_pos, Best_score ,Convergence_curve]&#61;BDA(N, max_iter, nVar, CostFunction)
dim&#61;nVar;
Food_pos&#61;zeros(dim,1);
Enemy_pos&#61;zeros(dim,1);
for i&#61;1:N,
for j&#61;1:nVar
if rand<&#61;0.5
X(j,i)&#61;0;
else
X(j,i)&#61;1;
end
if rand<&#61;0.5
DeltaX(j,i)&#61;0;
else
DeltaX(j,i)&#61;1;
end
end
end
w&#61;0.9-iter*((0.9-0.4)/max_iter);
my_c&#61;0.1-iter*((0.1-0)/(max_iter/2));
if my_c<0
my_c&#61;0;
end
s&#61;2*rand*my_c; % 分离权重
a&#61;2*rand*my_c; % 对齐权重
c&#61;2*rand*my_c; % 聚集权重
f&#61;2*rand; % 食物吸引权重
e&#61;my_c; % 天敌驱散权重
if iter>(3*max_iter/4)
e&#61;0;
end
%% &#61;&#61;&#61;&#61;&#61;&#61;首先计算所有的目标值&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
for i&#61;1:N
Fitness(1,i)&#61;CostFunction(X(:,i)&#39;);
if Fitness(1,i)
Food_pos&#61;X(:,i);
end
if Fitness(1,i)>Enemy_fitness
Enemy_fitness&#61;Fitness(1,i);
Enemy_pos&#61;X(:,i);
end
end
for i&#61;1:N
index&#61;0;
neighbours_no&#61;0;
clear Neighbours_DeltaX
clear Neighbours_X
%% 找到相邻的解决方案&#xff08;所有蜻蜓都假设为二元搜索空间中的一个组&#xff09;
for j&#61;1:N
if (i~&#61;j)
index&#61;index&#43;1;
neighbours_no&#61;neighbours_no&#43;1;
Neighbours_DeltaX(:,index)&#61;DeltaX(:,j);
Neighbours_X(:,index)&#61;X(:,j);
end
end
%% 分离
S&#61;zeros(dim,1);
for k&#61;1:neighbours_no
S&#61;S&#43;(Neighbours_X(:,k)-X(:,i));
end
S&#61;-S;
%% 对齐
A&#61;(sum(Neighbours_DeltaX&#39;)&#39;)/neighbours_no;
%% 聚集
C_temp&#61;(sum(Neighbours_X&#39;)&#39;)/neighbours_no;
C&#61;C_temp-X(:,i);
%% 食物吸引
F&#61;Food_pos-X(:,i);
%% 天敌驱散
E&#61;Enemy_pos&#43;X(:,i);
for j&#61;1:dim
DeltaX(j,i)&#61;s*S(j,1)&#43; a*A(j,1)&#43; c*C(j,1)&#43; f*F(j,1)&#43;e*E(j,1) &#43; w*DeltaX(j,i);
if DeltaX(j,i)>6
DeltaX(j,i)&#61;6;
end
if DeltaX(j,i)<-6
DeltaX(j,i)&#61;-6;
end
T&#61;abs(DeltaX(j,i)/sqrt((1&#43;DeltaX(j,i)^2))); %V3传递函数
if rand
end
end
end
Convergence_curve(iter)&#61;Food_fitness;
Best_pos&#61;Food_pos;
Best_score&#61;Food_fitness;
end
function [Best_pos, Best_score ,Convergence_curve]&#61;BDA(N, max_iter, nVar, CostFunction)
dim&#61;nVar;
Food_pos&#61;zeros(dim,1);
Enemy_pos&#61;zeros(dim,1);
for i&#61;1:N,
for j&#61;1:nVar
if rand<&#61;0.5
X(j,i)&#61;0;
else
X(j,i)&#61;1;
end
if rand<&#61;0.5
DeltaX(j,i)&#61;0;
else
DeltaX(j,i)&#61;1;
end
end
end
w&#61;0.9-iter*((0.9-0.4)/max_iter);
my_c&#61;0.1-iter*((0.1-0)/(max_iter/2));
if my_c<0
my_c&#61;0;
end
s&#61;2*rand*my_c; % 分离权重
a&#61;2*rand*my_c; % 对齐权重
c&#61;2*rand*my_c; % 聚集权重
f&#61;2*rand; % 食物吸引权重
e&#61;my_c; % 天敌驱散权重
if iter>(3*max_iter/4)
e&#61;0;
end
%% &#61;&#61;&#61;&#61;&#61;&#61;首先计算所有的目标值&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
for i&#61;1:N
Fitness(1,i)&#61;CostFunction(X(:,i)&#39;);
if Fitness(1,i)
Food_pos&#61;X(:,i);
end
if Fitness(1,i)>Enemy_fitness
Enemy_fitness&#61;Fitness(1,i);
Enemy_pos&#61;X(:,i);
end
end
for i&#61;1:N
index&#61;0;
neighbours_no&#61;0;
clear Neighbours_DeltaX
clear Neighbours_X
%% 找到相邻的解决方案&#xff08;所有蜻蜓都假设为二元搜索空间中的一个组&#xff09;
for j&#61;1:N
if (i~&#61;j)
index&#61;index&#43;1;
neighbours_no&#61;neighbours_no&#43;1;
Neighbours_DeltaX(:,index)&#61;DeltaX(:,j);
Neighbours_X(:,index)&#61;X(:,j);
end
end
%% 分离
S&#61;zeros(dim,1);
for k&#61;1:neighbours_no
S&#61;S&#43;(Neighbours_X(:,k)-X(:,i));
end
S&#61;-S;
%% 对齐
A&#61;(sum(Neighbours_DeltaX&#39;)&#39;)/neighbours_no;
%% 聚集
C_temp&#61;(sum(Neighbours_X&#39;)&#39;)/neighbours_no;
C&#61;C_temp-X(:,i);
%% 食物吸引
F&#61;Food_pos-X(:,i);
%% 天敌驱散
E&#61;Enemy_pos&#43;X(:,i);
for j&#61;1:dim
DeltaX(j,i)&#61;s*S(j,1)&#43; a*A(j,1)&#43; c*C(j,1)&#43; f*F(j,1)&#43;e*E(j,1) &#43; w*DeltaX(j,i);
if DeltaX(j,i)>6
DeltaX(j,i)&#61;6;
end
if DeltaX(j,i)<-6
DeltaX(j,i)&#61;-6;
end
T&#61;abs(DeltaX(j,i)/sqrt((1&#43;DeltaX(j,i)^2))); %V3传递函数
if rand
end
end
end
Convergence_curve(iter)&#61;Food_fitness;
Best_pos&#61;Food_pos;
Best_score&#61;Food_fitness;
end