• 黑洞优化算法(Matlab实现)


     

    目录

    1 概述

    1.1 黑洞算法

    1.2黑洞搜索优化算法

    1.3黑洞搜索算法的实现过程

     2 Matlab代码实现

    2.1 主函数

    2.2 目标函数 

    2.3 黑洞优化算法 

    3 结果展现 


     

     应用的领域很多。

    1 概述

    1.1 黑洞算法

    根据黑洞现象原理首次提出BH 算法,它在传统PSO基础上引入了新的机制,有效地提高了收敛速度并防止了陷入局部极值的情况发生;但是该方法却没有提及如何确定黑洞边界和如何处理吸收星体的问题. Hatamlou BH算法进行了完善,让其更加接近于黑洞的自然现状,使其具有黑洞现象的一般特质.该方法不但沿袭了原BH算法的一切特性,同时还解决了原BH 算法的黑洞边界问题和吸收多余星点的问题.

    1.2黑洞搜索优化算法

    BH 算法的思想较为完整地描述了自然界中黑洞现象的一般特性;以BH 算法具有的这些特性为基础,BH算法的寻优搜索原理比较简单,易于实现.BH算法主要是模拟实际黑洞现象,在一定搜索空间内随机布置一定数量的星体,并通过统计学手段确定和评估搜索空间内每一个星体的适应度函数,选出一个具有最佳适应度值的星体作为黑洞.这个黑洞边界(以R为半径)被视为当前全局最优解所在区域,而黑洞本身被视为当前全局最优解;BH 算法中的黑洞具有与自然界黑洞同样的强吸引能力,在搜索域内所有其他星体都将向其靠拢且无法逃逸.星体被黑洞吸引并向黑洞靠拢的公式如下:

                     

    式中:x_{i}(t)x_{i+1}(t+1)分别代表第i个星体在t和 t+1次迭代时的位置;rand表示0,1]之间的随机数;Am是搜索空间内的黑洞位置;N是星体的数量.
    在更替迭代过程中黑洞将进入其边界以内的星体一一吸收.每当一个星体被吸收的同时,在搜索空间内随机产生一个新的星体﹐星体的总数保持不变.黑洞边界范围计算公式如下:

                  

    式中:f_{BH}是黑洞的适应度函数值;f_{i}是第i个星体的适应度函数值.
    在被黑洞吸引的过程中,如果有一个星体i的适应度函数值f_{i}优于黑洞的适应度函数值f_{BH}则说明该黑洞所处位置并非最优,需要黑洞和星体互换位置.然后算法将以新生成的黑洞为中心继续运行下去,其他星体将通过位置更替公式(1)重新涌向新的黑洞位置,并被其吸收.

    1.3黑洞搜索算法的实现过程

    根据上述分析,得出黑洞算法的实现步骤:

    步骤1初始化参数,在搜索空间内随机选取一定数量星体;
    步骤2计算每个星体的适应度函数值;

    步骤3选择一个具有最佳适应度值的星体作为黑洞;
    步骤4根据式(1)更改每个星体的位置;

    步骤5如果星体最优适应度函数值优于黑洞的适应度函数值,则交换二者位置;
    步骤6 如果一个星体在黑洞的边界范围内,那么这个星体将被吸收﹐黑洞的边界半径由式(2)计算,同时,在搜索空间内随机产生一个新的星体;

    步骤7当系统达到最大迭代次数,或者出现一个最好的适应度值时,程序停止运行,否则返回步骤4.

     2 Matlab代码实现

    2.1 主函数

    1. clear all
    2. clc
    3. close all
    4. %% 初始化参数
    5. d=5; % 维度
    6. options.lk=-32*ones(1,d); % 下限
    7. options.uk=32*ones(1,d); % 上限
    8. options.m=50; % 种群数量
    9. options.MAXITER=500; % 最大迭代次数
    10. options.n=length(options.uk); % 问题的维度。
    11. options.ObjFunction=@Ackley; % 调用目标函数
    12. options.Display_Flag=1; % 在迭代中显示结果的标志
    13. options.run_parallel_index=0;
    14. options.run=10;
    15. if options.run_parallel_index
    16. stream = RandStream('mrg32k3a');
    17. parfor index=1:options.run
    18. set(stream,'Substream',index);
    19. RandStream.setGlobalStream(stream)
    20. [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options);
    21. bestX_M(index,:)=bestX;
    22. Fbest_M(index)=bestFitness;
    23. fbest_evolution_M(index,:)=bestFitnessEvolution;
    24. end
    25. else
    26. rng('default')
    27. for index=1:options.run
    28. [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options);
    29. bestX_M(index,:)=bestX;
    30. Fbest_M(index)=bestFitness;
    31. fbest_evolution_M(index,:)=bestFitnessEvolution;
    32. end
    33. end
    34. %% 可视化
    35. [a,b]=min(Fbest_M);
    36. figure
    37. plot(1:options.MAXITER,fbest_evolution_M(b,:))
    38. xlabel('迭代次数')
    39. ylabel('适应度值')
    40. fprintf(' MIN=%g MEAN=%g MEDIAN=%g MAX=%g SD=%g \n',...
    41. min(Fbest_M),mean(Fbest_M),median(Fbest_M),max(Fbest_M),std(Fbest_M))

    2.2 目标函数 2.3 

    1. function [F, lb, ub, FGO] = Ackley(x)
    2. %% 目标函数值
    3. if (nargin==0)
    4. F=[];
    5. d=2; % 维度
    6. lb=-32*ones(1,d); % 下限
    7. ub=32*ones(1,d); % 上限
    8. FGO=0; % 总体最优值
    9. else
    10. n=size(x,2);
    11. for ix=1:size(x,1)
    12. x0=x(ix,:);
    13. F(ix) = -20*exp(-0.2*sqrt(1/n*sum(x0.^2)))-...
    14. exp(1/n*sum(cos(2*pi*x0)))+20+exp(1);
    15. end
    16. end

    2.3 黑洞优化算法 

    1. function [bestX, bestFitness, bestFitnessEvolution,nEval]=BH_v1(options)
    2. %--------------------------------------------------------------------------
    3. % 黑洞优化算法
    4. %--------------------------------------------------------------------------
    5. % 在搜索空间中初始化具有随机位置的恒星群。
    6. % 开始。
    7. % 对于每一颗星,评估目标函数。
    8. % 选择具有最佳适应值的最佳恒星作为黑洞。
    9. % 根据公式更改每颗恒星的位置。
    10. % 如果一颗恒星到达一个比黑洞成本更低的位置,交换它们的位置。
    11. % 如果一颗恒星穿过黑洞的视界,在搜索空间中的随机位置用一颗新恒星替换它。
    12. % 如果满足终止标准(最大迭代次数或足够好的适应度),则退出循环。
    13. % 结束循环
    14. %--------------------------------------------------------------------------
    15. ObjFunction=options.ObjFunction; % 目标函数的命名
    16. n=options.n; % 该问题的维度
    17. uk=options.uk; % 在第k维上界。
    18. lk=options.lk; % 在第k的下界。
    19. m=options.m; % m:样本点数
    20. MAXITER=options.MAXITER; % 最大迭代次数
    21. nEval=0;
    22. [x,xBH,iBH,ObjFunctionValue]=Initialize(options);
    23. nEval=nEval+size(x,1);
    24. for iteration =1:MAXITER
    25. %% 根据公式改变每颗星的位置。
    26. for i = 1 : m
    27. if i ~= iBH
    28. landa=rand;
    29. for k = 1 : n
    30. if landa<0.5
    31. x(i,k)=x(i,k) + rand*(xBH(k)- x(i,k));
    32. else
    33. x(i,k)=x(i,k) + rand*(xBH(k)- x(i,k));
    34. end
    35. end
    36. end
    37. end
    38. %% 如果恒星到达一个比黑洞成本低的位置,交换它们的位置
    39. ObjFunctionValue=feval(ObjFunction,x);
    40. nEval=nEval+size(x,1);
    41. %如果一颗恒星越过黑洞的事件视界,则在搜索空间中随机位置用一颗新恒星代替
    42. R=ObjFunctionValue(iBH)/sum(ObjFunctionValue);
    43. % R=exp(-n*ObjFunctionValue(iBH)/sum(ObjFunctionValue))
    44. for i = 1 : m
    45. Distance(i)=norm(xBH- x(i,:));
    46. end
    47. [x,ObjFunctionValue]=NewStarGeneration(x,Distance,R,options,iBH,ObjFunctionValue);
    48. [x]=bound(x,lk,uk);
    49. [xBH,iBH]=argmin(x,ObjFunctionValue,options);
    50. %--------------------------------------------------------------------------------
    51. bestFitnessEvolution(iteration)=ObjFunctionValue(iBH);
    52. %--------------------------------------------------------------------------------
    53. if options.Display_Flag==1
    54. fprintf('迭代次数N为 %g 最优适应度为 %g\n',iteration,ObjFunctionValue(iBH))
    55. end
    56. end
    57. bestX=xBH;
    58. bestFitness=ObjFunctionValue(iBH);
    59. end
    60. function [x,xBH,iBH,ObjFunctionValue]=Initialize(options)
    61. ObjFunction=options.ObjFunction; % the name of the objective function.
    62. n=options.n; % n: dimension of the problem.
    63. uk=options.uk; % up: upper bound in the kth dimension.
    64. lk=options.lk; % lp: lower bound in the kth dimension.
    65. m=options.m; % m: number of sample points
    66. for i = 1 : m
    67. for k = 1 : n
    68. landa=rand;
    69. x(i,k) = lk(k) + landa*(uk(k) - lk(k));
    70. end
    71. end
    72. % x(end+1,:)=x0;
    73. ObjFunctionValue=feval(ObjFunction,x);
    74. [index1,index2]=sort(ObjFunctionValue);
    75. x=x(index2(1:m),:);
    76. xBH=x(1,:);
    77. iBH=1;
    78. ObjFunctionValue=ObjFunctionValue(index2(1:m));
    79. end
    80. function [xb,ib,xw,iw]=argmin(x,f,options)
    81. [minf,ib]=min(f);
    82. xb=x(ib,:);
    83. [maxf,iw]=max(f);
    84. xw=x(iw,:);
    85. end
    86. function [x,ObjFunctionValue]=NewStarGeneration(x,Distance,R,options,iBH,ObjFunctionValue)
    87. ObjFunction=options.ObjFunction;
    88. n=options.n;
    89. uk=options.uk;
    90. lk=options.lk;
    91. index=find(Distance<R);
    92. for i=1:length(index)
    93. if index(i) ~= iBH
    94. for k = 1 : n
    95. x(i,k) = lk(k) + rand*(uk(k) - lk(k));
    96. end
    97. ObjFunctionValue(i)=feval(ObjFunction,x(i,:));
    98. end
    99. end
    100. end
    101. function [x]=bound(x,l,u)
    102. for j = 1:size(x,1)
    103. for k = 1:size(x,2)
    104. % 如果上限越界
    105. if x(j,k) > u(k),
    106. x(j,k) = u(k);
    107. end
    108. % 如果下限越界
    109. if x(j,k) < l(k),
    110. x(j,k) = l(k);
    111. end
    112. end
    113. end
    114. end

    3 结果展现 

     

     

  • 相关阅读:
    ES6异步编程解决方案——async、Generator、Promise
    用已安装好的系统级别PsychoPy软件配置Python虚拟环境
    LinkedList与链表
    DevOps平台中的制品库是什么?有什么用处?
    根据条件查询下载Excel表单(Java+Vue 及 Vue 两种方式)
    计算机毕业设计Python+djang的疫情数据可视化分析系统(源码+系统+mysql数据库+Lw文档)
    【目标检测】LLA: Loss-aware label assignment for dense pedestrian detection【标签分配】
    TensorFlow 的基本概念和使用场景
    SpringMVC-02 MVC模式介绍
    Golang【Web 入门】 08 集成 Gorilla Mux
  • 原文地址:https://blog.csdn.net/weixin_46039719/article/details/125261832