当前位置:   article > 正文

二进制蜻蜓优化算法在电力系统中的应用(附Matlab完整代码)_二进制优化算法可以做什么

二进制优化算法可以做什么

目录

1 蜻蜓算法概述

2 蜻蜓算法数学模型

2.1 分离

2.2 对齐

2.3 聚集

2.4 食物吸引

2.5 天敌驱散

3 完整matlab代码实现  

3.1 主函数代码

3.2 子函数代码


 此算法在电力系统中也有很多应用 

1 蜻蜓算法概述

自然充满了执行不同任务的社会行为。尽管所有个体和集体行为的最终目标是生存,但生物在群体、畜群、学校、殖民地和羊群中合作和互动有几个原因:狩猎、防御、导航和觅食。例如,狼群拥有组织最完善的狩猎社交互动之一。狼倾向于遵循社会领导以不同的步骤捕猎猎物:追逐猎物、盘旋猎物、骚扰猎物和攻击猎物 。集体防御的一个例子是海洋中的鱼群。数以千计的鱼类形成了一个鱼群,并通过相互警告来避开捕食者,使得捕食者的捕食变得非常困难。

蜻蜓算法(DA)。 DA算法的主要灵感来源于自然界蜻蜓静态和动态的成群行为。优化、探索和开发的两个基本阶段是通过对蜻蜓在导航、寻找食物和在动态或统计上成群时避开敌人的社会互动进行建模来设计的。接下来文章还考虑了 DA 的二进制和多目标版本的方法,分别称为二进制 DA (BDA) 和多目标 (MODA)。所提出的算法由几个数学测试函数和一个定性和定量的真实案例研究进行了基准测试。该算法能够改善给定问题的初始随机种群,收敛到全局最优,并提供非常有竞争力的结果。 MODA 的结果还表明,该算法倾向于为多目标问题找到具有高度均匀分布的帕累托最优解的非常精确的近似值。潜艇螺旋桨设计问题得到的一组设计证明了MOD的优点。

2 蜻蜓算法数学模型

蜻蜓算法寻优计算主要思路通过模拟蜻蜓的捕食行为来实现(图1),该飞行(进化)寻优机制可以表示为蜻蜓群体分离、对齐、聚集、食物吸引与天敌驱散五个步骤。
 

2.1 分离

表示避免蜻蜓个体距离太近降低寻优效率:

                       

式中Ek为蜻蜓k的分离度;D表示当前蜻蜓的位置;Dj代表第j个邻近蜻蜓的位置;J代表群体中第k个蜻蜓的邻近蜻蜓的数量。

2.2 对齐

表示某个蜻蜓与其邻近蜻蜓个体速度的相同程度:

                        

式中Uk为蜻蜓k的对齐度;Vj代表第j个邻近蜻蜓的飞行速度;其他符号意义同前。

2.3 聚集

表示某个蜻蜓具有朝着其附近较优蜻蜓个体靠近的趋势:

                            

式中Bk为蜻蜓k的聚集度;其他符号意义同前。

2.4 食物吸引

食物是指某一次迭代计算中最优个体的位置:

                           

式中Sk为蜻蜓k的食物吸引度;D+代表当前计算中最优蜻蜓的位置。

2.5 天敌驱散

目的是使个体尽可能远离最差的蜻蜓个体,提高寻优计算效率:

                         

式中Tk为蜻蜓k的天敌驱散度;D-代表当前计算中最差蜻蜓的位置。
蜻蜓个体k飞行位置更新步长:

蜻蜓飞行位置更新:

                  

式中e、u、b、s、t分别表示分离度、对齐度、聚集度、食物吸引度、天敌驱散度的影响系数;β代表惯性系数;l代表反复迭代计数下标;其他符号意义同前。 

3 完整matlab代码实现  

3.1 主函数代码

二进制蜻蜓优化算法在电力系统中的应用(附Matlab完整代码)

3.2 子函数代码

  1. %=====目标函数============
  2. function [o] = MyCost(x)
  3. o=sum(x); % 这个目标函数比较简单,可以换成自己需要的目标函数
  4. end
  1. function [Best_pos, Best_score ,Convergence_curve]=BDA(N, max_iter, nVar, CostFunction)
  2. dim=nVar;
  3. Food_fitness=inf;
  4. Food_pos=zeros(dim,1);
  5. Enemy_fitness=-inf;
  6. Enemy_pos=zeros(dim,1);
  7. %% 初始化X和DeltaX向量
  8. for i=1:N,
  9. for j=1:nVar
  10. if rand<=0.5
  11. X(j,i)=0;
  12. else
  13. X(j,i)=1;
  14. end
  15. if rand<=0.5
  16. DeltaX(j,i)=0;
  17. else
  18. DeltaX(j,i)=1;
  19. end
  20. end
  21. end
  22. Fitness=zeros(1,N);
  23. for iter=1:max_iter
  24. w=0.9-iter*((0.9-0.4)/max_iter);
  25. my_c=0.1-iter*((0.1-0)/(max_iter/2));
  26. if my_c<0
  27. my_c=0;
  28. end
  29. s=2*rand*my_c; % 分离权重
  30. a=2*rand*my_c; % 对齐权重
  31. c=2*rand*my_c; % 聚集权重
  32. f=2*rand; % 食物吸引权重
  33. e=my_c; % 天敌驱散权重
  34. if iter>(3*max_iter/4)
  35. e=0;
  36. end
  37. %% ======首先计算所有的目标值============
  38. for i=1:N
  39. Fitness(1,i)=CostFunction(X(:,i)');
  40. if Fitness(1,i)<Food_fitness
  41. Food_fitness=Fitness(1,i);
  42. Food_pos=X(:,i);
  43. end
  44. if Fitness(1,i)>Enemy_fitness
  45. Enemy_fitness=Fitness(1,i);
  46. Enemy_pos=X(:,i);
  47. end
  48. end
  49. for i=1:N
  50. index=0;
  51. neighbours_no=0;
  52. clear Neighbours_DeltaX
  53. clear Neighbours_X
  54. %% 找到相邻的解决方案(所有蜻蜓都假设为二元搜索空间中的一个组)
  55. for j=1:N
  56. if (i~=j)
  57. index=index+1;
  58. neighbours_no=neighbours_no+1;
  59. Neighbours_DeltaX(:,index)=DeltaX(:,j);
  60. Neighbours_X(:,index)=X(:,j);
  61. end
  62. end
  63. %% 分离
  64. S=zeros(dim,1);
  65. for k=1:neighbours_no
  66. S=S+(Neighbours_X(:,k)-X(:,i));
  67. end
  68. S=-S;
  69. %% 对齐
  70. A=(sum(Neighbours_DeltaX')')/neighbours_no;
  71. %% 聚集
  72. C_temp=(sum(Neighbours_X')')/neighbours_no;
  73. C=C_temp-X(:,i);
  74. %% 食物吸引
  75. F=Food_pos-X(:,i);
  76. %% 天敌驱散
  77. E=Enemy_pos+X(:,i);
  78. for j=1:dim
  79. DeltaX(j,i)=s*S(j,1)+ a*A(j,1)+ c*C(j,1)+ f*F(j,1)+e*E(j,1) + w*DeltaX(j,i);
  80. if DeltaX(j,i)>6
  81. DeltaX(j,i)=6;
  82. end
  83. if DeltaX(j,i)<-6
  84. DeltaX(j,i)=-6;
  85. end
  86. T=abs(DeltaX(j,i)/sqrt((1+DeltaX(j,i)^2))); %V3传递函数
  87. if rand<T
  88. X(j,i)=~X(j,i);
  89. end
  90. end
  91. end
  92. Convergence_curve(iter)=Food_fitness;
  93. Best_pos=Food_pos;
  94. Best_score=Food_fitness;
  95. end
  1. function o=Levy(d)
  2. beta=3/2;
  3. sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
  4. u=randn(1,d)*sigma;
  5. v=randn(1,d);
  6. step=u./abs(v).^(1/beta);
  7. o=0.01*step;


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=1:N,
    for j=1:nVar 
        if rand<=0.5
            X(j,i)=0;
        else
            X(j,i)=1;
        end
        
        if rand<=0.5
            DeltaX(j,i)=0;
        else
            DeltaX(j,i)=1;
        end
    end
end

Fitness=zeros(1,N);

for iter=1:max_iter
    
    w=0.9-iter*((0.9-0.4)/max_iter);
    
    my_c=0.1-iter*((0.1-0)/(max_iter/2));
    if my_c<0
        my_c=0;
    end
    
    s=2*rand*my_c; % 分离权重
    a=2*rand*my_c; % 对齐权重
    c=2*rand*my_c; % 聚集权重
    f=2*rand;      % 食物吸引权重
    e=my_c;        % 天敌驱散权重
    
    if iter>(3*max_iter/4)
        e=0;
    end
    %% ======首先计算所有的目标值============
    for i=1:N 
        Fitness(1,i)=CostFunction(X(:,i)');
        if Fitness(1,i)<Food_fitness
            Food_fitness=Fitness(1,i);
            Food_pos=X(:,i);
        end
        
        if Fitness(1,i)>Enemy_fitness
            Enemy_fitness=Fitness(1,i);
            Enemy_pos=X(:,i);
        end
    end
    
    for i=1:N
        index=0;
        neighbours_no=0;
        
        clear Neighbours_DeltaX
        clear Neighbours_X
        
        %% 找到相邻的解决方案(所有蜻蜓都假设为二元搜索空间中的一个组)
        for j=1:N
            if (i~=j)
                index=index+1;
                neighbours_no=neighbours_no+1;
                Neighbours_DeltaX(:,index)=DeltaX(:,j);
                Neighbours_X(:,index)=X(:,j);
            end
        end
        
        %% 分离
        
        S=zeros(dim,1);
        for k=1:neighbours_no
            S=S+(Neighbours_X(:,k)-X(:,i));
        end
        S=-S;
        
       %% 对齐
        
        A=(sum(Neighbours_DeltaX')')/neighbours_no;
        
       %% 聚集
        
        C_temp=(sum(Neighbours_X')')/neighbours_no;
        C=C_temp-X(:,i);
         
       %% 食物吸引
       
        F=Food_pos-X(:,i);
        
       %% 天敌驱散
       
        E=Enemy_pos+X(:,i);
        
        for j=1:dim
            
            DeltaX(j,i)=s*S(j,1)+ a*A(j,1)+ c*C(j,1)+ f*F(j,1)+e*E(j,1) + w*DeltaX(j,i);
            if DeltaX(j,i)>6
                DeltaX(j,i)=6;
            end
            if DeltaX(j,i)<-6
                DeltaX(j,i)=-6;
            end
            
            
            T=abs(DeltaX(j,i)/sqrt((1+DeltaX(j,i)^2))); %V3传递函数
            
            
            if rand<T 
                X(j,i)=~X(j,i);
            end
        end  
    end
    Convergence_curve(iter)=Food_fitness;
    Best_pos=Food_pos;
    Best_score=Food_fitness;
    
end


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=1:N,
    for j=1:nVar 
        if rand<=0.5
            X(j,i)=0;
        else
            X(j,i)=1;
        end
        
        if rand<=0.5
            DeltaX(j,i)=0;
        else
            DeltaX(j,i)=1;
        end
    end
end

Fitness=zeros(1,N);

for iter=1:max_iter
    
    w=0.9-iter*((0.9-0.4)/max_iter);
    
    my_c=0.1-iter*((0.1-0)/(max_iter/2));
    if my_c<0
        my_c=0;
    end
    
    s=2*rand*my_c; % 分离权重
    a=2*rand*my_c; % 对齐权重
    c=2*rand*my_c; % 聚集权重
    f=2*rand;      % 食物吸引权重
    e=my_c;        % 天敌驱散权重
    
    if iter>(3*max_iter/4)
        e=0;
    end
    %% ======首先计算所有的目标值============
    for i=1:N 
        Fitness(1,i)=CostFunction(X(:,i)');
        if Fitness(1,i)<Food_fitness
            Food_fitness=Fitness(1,i);
            Food_pos=X(:,i);
        end
        
        if Fitness(1,i)>Enemy_fitness
            Enemy_fitness=Fitness(1,i);
            Enemy_pos=X(:,i);
        end
    end
    
    for i=1:N
        index=0;
        neighbours_no=0;
        
        clear Neighbours_DeltaX
        clear Neighbours_X
        
        %% 找到相邻的解决方案(所有蜻蜓都假设为二元搜索空间中的一个组)
        for j=1:N
            if (i~=j)
                index=index+1;
                neighbours_no=neighbours_no+1;
                Neighbours_DeltaX(:,index)=DeltaX(:,j);
                Neighbours_X(:,index)=X(:,j);
            end
        end
        
        %% 分离
        
        S=zeros(dim,1);
        for k=1:neighbours_no
            S=S+(Neighbours_X(:,k)-X(:,i));
        end
        S=-S;
        
       %% 对齐
        
        A=(sum(Neighbours_DeltaX')')/neighbours_no;
        
       %% 聚集
        
        C_temp=(sum(Neighbours_X')')/neighbours_no;
        C=C_temp-X(:,i);
         
       %% 食物吸引
       
        F=Food_pos-X(:,i);
        
       %% 天敌驱散
       
        E=Enemy_pos+X(:,i);
        
        for j=1:dim
            
            DeltaX(j,i)=s*S(j,1)+ a*A(j,1)+ c*C(j,1)+ f*F(j,1)+e*E(j,1) + w*DeltaX(j,i);
            if DeltaX(j,i)>6
                DeltaX(j,i)=6;
            end
            if DeltaX(j,i)<-6
                DeltaX(j,i)=-6;
            end
            
            
            T=abs(DeltaX(j,i)/sqrt((1+DeltaX(j,i)^2))); %V3传递函数
            
            
            if rand<T 
                X(j,i)=~X(j,i);
            end
        end  
    end
    Convergence_curve(iter)=Food_fitness;
    Best_pos=Food_pos;
    Best_score=Food_fitness;
    
end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/249130
推荐阅读
相关标签
  

闽ICP备14008679号