一、人工蜂群算法的介绍

    人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。

二、人工蜂群算法的原理

1、原理

        标准的ABC算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为3类: 采蜜蜂、观察蜂和侦察蜂。整个蜂群的目标是寻找花蜜量最大的蜜源。在标准的ABC算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源。
        假设问题的解空间是维的,采蜜蜂与观察蜂的个数都是,采蜜蜂的个数或观察蜂的个数与蜜源的数量相等。则标准的ABC算法将优化问题的求解过程看成是在维搜索空间中进行搜索。每个蜜源的位置代表问题的一个可能解,蜜源的花蜜量对应于相应的解的适应度。一个采蜜蜂与一个蜜源是相对应的。与第个蜜源相对应的采蜜蜂依据如下公式寻找新的蜜源:
其中,是区间上的随机数,。标准的ABC算法将新生成的可能解与原来的解作比较,并采用贪婪选择策略保留较好的解。每一个观察蜂依据概率选择一个蜜源,概率公式为
其中,是可能解的适应值。对于被选择的蜜源,观察蜂根据上面概率公式搜寻新的可能解。当所有的采蜜蜂和观察蜂都搜索完整个搜索空间时,如果一个蜜源的适应值在给定的步骤内(定义为控制参数“limit”) 没有被提高, 则丢弃该蜜源,而与该蜜源相对应的采蜜蜂变成侦查蜂,侦查蜂通过已下公式搜索新的可能解。
其中,是区间上的随机数,是第维的下界和上界。

2、流程

  • 初始化;
  • 重复以下过程:
    • 将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量;
    • 观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜源的花蜜量;
    • 确定侦查蜂,并根据第三个公式寻找新的蜜源;
    • 记忆迄今为止最好的蜜源;
  • 判断终止条件是否成立;

三、人工蜂群算法用于求解函数优化问题

    对于函数
其中
代码:
[cpp] view plaincopy
  1. #include<iostream>
  2. #include<time.h>
  3. #include<stdlib.h>
  4. #include<cmath>
  5. #include<fstream>
  6. #include<iomanip>
  7. using namespace std;
  8. const int NP=40;//种群的规模,采蜜蜂+观察蜂
  9. const int FoodNumber=NP/2;//食物的数量,为采蜜蜂的数量
  10. const int limit=20;//限度,超过这个限度没有更新采蜜蜂变成侦查蜂
  11. const int maxCycle=10000;//停止条件
  12. /*****函数的特定参数*****/
  13. const int D=2;//函数的参数个数
  14. const double lb=-100;//函数的下界
  15. const double ub=100;//函数的上界
  16. double result[maxCycle]={0};
  17. /*****种群的定义****/
  18. struct BeeGroup
  19. {
  20. double code[D];//函数的维数
  21. double trueFit;//记录真实的最小值
  22. double fitness;
  23. double rfitness;//相对适应值比例
  24. int trail;//表示实验的次数,用于与limit作比较
  25. }Bee[FoodNumber];
  26. BeeGroup NectarSource[FoodNumber];//蜜源,注意:一切的修改都是针对蜜源而言的
  27. BeeGroup EmployedBee[FoodNumber];//采蜜蜂
  28. BeeGroup OnLooker[FoodNumber];//观察蜂
  29. BeeGroup BestSource;//记录最好蜜源
  30. /*****函数的声明*****/
  31. double random(double, double);//产生区间上的随机数
  32. void initilize();//初始化参数
  33. double calculationTruefit(BeeGroup);//计算真实的函数值
  34. double calculationFitness(double);//计算适应值
  35. void CalculateProbabilities();//计算轮盘赌的概率
  36. void evalueSource();//评价蜜源
  37. void sendEmployedBees();
  38. void sendOnlookerBees();
  39. void sendScoutBees();
  40. void MemorizeBestSource();
  41. /*******主函数*******/
  42. int main()
  43. {
  44. ofstream output;
  45. output.open("dataABC.txt");
  46. srand((unsigned)time(NULL));
  47. initilize();//初始化
  48. MemorizeBestSource();//保存最好的蜜源
  49. //主要的循环
  50. int gen=0;
  51. while(gen<maxCycle)
  52. {
  53. sendEmployedBees();
  54. CalculateProbabilities();
  55. sendOnlookerBees();
  56. MemorizeBestSource();
  57. sendScoutBees();
  58. MemorizeBestSource();
  59. output<<setprecision(30)<<BestSource.trueFit<<endl;
  60. gen++;
  61. }
  62. output.close();
  63. cout<<"运行结束!!"<<endl;
  64. return 0;
  65. }
  66. /*****函数的实现****/
  67. double random(double start, double end)//随机产生区间内的随机数
  68. {
  69. return start+(end-start)*rand()/(RAND_MAX + 1.0);
  70. }
  71. void initilize()//初始化参数
  72. {
  73. int i,j;
  74. for (i=0;i<FoodNumber;i++)
  75. {
  76. for (j=0;j<D;j++)
  77. {
  78. NectarSource[i].code[j]=random(lb,ub);
  79. EmployedBee[i].code[j]=NectarSource[i].code[j];
  80. OnLooker[i].code[j]=NectarSource[i].code[j];
  81. BestSource.code[j]=NectarSource[0].code[j];
  82. }
  83. /****蜜源的初始化*****/
  84. NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);
  85. NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);
  86. NectarSource[i].rfitness=0;
  87. NectarSource[i].trail=0;
  88. /****采蜜蜂的初始化*****/
  89. EmployedBee[i].trueFit=NectarSource[i].trueFit;
  90. EmployedBee[i].fitness=NectarSource[i].fitness;
  91. EmployedBee[i].rfitness=NectarSource[i].rfitness;
  92. EmployedBee[i].trail=NectarSource[i].trail;
  93. /****观察蜂的初始化****/
  94. OnLooker[i].trueFit=NectarSource[i].trueFit;
  95. OnLooker[i].fitness=NectarSource[i].fitness;
  96. OnLooker[i].rfitness=NectarSource[i].rfitness;
  97. OnLooker[i].trail=NectarSource[i].trail;
  98. }
  99. /*****最优蜜源的初始化*****/
  100. BestSource.trueFit=NectarSource[0].trueFit;
  101. BestSource.fitness=NectarSource[0].fitness;
  102. BestSource.rfitness=NectarSource[0].rfitness;
  103. BestSource.trail=NectarSource[0].trail;
  104. }
  105. double calculationTruefit(BeeGroup bee)//计算真实的函数值
  106. {
  107. double truefit=0;
  108. /******测试函数1******/
  109. truefit=0.5+(sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))-0.5)
  110. /((1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*(1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1])));
  111. return truefit;
  112. }
  113. double calculationFitness(double truefit)//计算适应值
  114. {
  115. double fitnessResult=0;
  116. if (truefit>=0)
  117. {
  118. fitnessResult=1/(truefit+1);
  119. }else
  120. {
  121. fitnessResult=1+abs(truefit);
  122. }
  123. return fitnessResult;
  124. }
  125. void sendEmployedBees()//修改采蜜蜂的函数
  126. {
  127. int i,j,k;
  128. int param2change;//需要改变的维数
  129. double Rij;//[-1,1]之间的随机数
  130. for (i=0;i<FoodNumber;i++)
  131. {
  132. param2change=(int)random(0,D);//随机选取需要改变的维数
  133. /******选取不等于i的k********/
  134. while (1)
  135. {
  136. k=(int)random(0,FoodNumber);
  137. if (k!=i)
  138. {
  139. break;
  140. }
  141. }
  142. for (j=0;j<D;j++)
  143. {
  144. EmployedBee[i].code[j]=NectarSource[i].code[j];
  145. }
  146. /*******采蜜蜂去更新信息*******/
  147. Rij=random(-1,1);
  148. EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
  149. /*******判断是否越界********/
  150. if (EmployedBee[i].code[param2change]>ub)
  151. {
  152. EmployedBee[i].code[param2change]=ub;
  153. }
  154. if (EmployedBee[i].code[param2change]<lb)
  155. {
  156. EmployedBee[i].code[param2change]=lb;
  157. }
  158. EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);
  159. EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);
  160. /******贪婪选择策略*******/
  161. if (EmployedBee[i].trueFit<NectarSource[i].trueFit)
  162. {
  163. for (j=0;j<D;j++)
  164. {
  165. NectarSource[i].code[j]=EmployedBee[i].code[j];
  166. }
  167. NectarSource[i].trail=0;
  168. NectarSource[i].trueFit=EmployedBee[i].trueFit;
  169. NectarSource[i].fitness=EmployedBee[i].fitness;
  170. }else
  171. {
  172. NectarSource[i].trail++;
  173. }
  174. }
  175. }
  176. void CalculateProbabilities()//计算轮盘赌的选择概率
  177. {
  178. int i;
  179. double maxfit;
  180. maxfit=NectarSource[0].fitness;
  181. for (i=1;i<FoodNumber;i++)
  182. {
  183. if (NectarSource[i].fitness>maxfit)
  184. maxfit=NectarSource[i].fitness;
  185. }
  186. for (i=0;i<FoodNumber;i++)
  187. {
  188. NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;
  189. }
  190. }
  191. void sendOnlookerBees()//采蜜蜂与观察蜂交流信息,观察蜂更改信息
  192. {
  193. int i,j,t,k;
  194. double R_choosed;//被选中的概率
  195. int param2change;//需要被改变的维数
  196. double Rij;//[-1,1]之间的随机数
  197. i=0;
  198. t=0;
  199. while(t<FoodNumber)
  200. {
  201. R_choosed=random(0,1);
  202. if(R_choosed<NectarSource[i].rfitness)//根据被选择的概率选择
  203. {
  204. t++;
  205. param2change=(int)random(0,D);
  206. /******选取不等于i的k********/
  207. while (1)
  208. {
  209. k=(int)random(0,FoodNumber);
  210. if (k!=i)
  211. {
  212. break;
  213. }
  214. }
  215. for(j=0;j<D;j++)
  216. {
  217. OnLooker[i].code[j]=NectarSource[i].code[j];
  218. }
  219. /****更新******/
  220. Rij=random(-1,1);
  221. OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
  222. /*******判断是否越界*******/
  223. if (OnLooker[i].code[param2change]<lb)
  224. {
  225. OnLooker[i].code[param2change]=lb;
  226. }
  227. if (OnLooker[i].code[param2change]>ub)
  228. {
  229. OnLooker[i].code[param2change]=ub;
  230. }
  231. OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);
  232. OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit);
  233. /****贪婪选择策略******/
  234. if (OnLooker[i].trueFit<NectarSource[i].trueFit)
  235. {
  236. for (j=0;j<D;j++)
  237. {
  238. NectarSource[i].code[j]=OnLooker[i].code[j];
  239. }
  240. NectarSource[i].trail=0;
  241. NectarSource[i].trueFit=OnLooker[i].trueFit;
  242. NectarSource[i].fitness=OnLooker[i].fitness;
  243. }else
  244. {
  245. NectarSource[i].trail++;
  246. }
  247. }
  248. i++;
  249. if (i==FoodNumber)
  250. {
  251. i=0;
  252. }
  253. }
  254. }
  255. /*******只有一只侦查蜂**********/
  256. void sendScoutBees()//判断是否有侦查蜂的出现,有则重新生成蜜源
  257. {
  258. int maxtrialindex,i,j;
  259. double R;//[0,1]之间的随机数
  260. maxtrialindex=0;
  261. for (i=1;i<FoodNumber;i++)
  262. {
  263. if (NectarSource[i].trail>NectarSource[maxtrialindex].trail)
  264. {
  265. maxtrialindex=i;
  266. }
  267. }
  268. if(NectarSource[maxtrialindex].trail>=limit)
  269. {
  270. /*******重新初始化*********/
  271. for (j=0;j<D;j++)
  272. {
  273. R=random(0,1);
  274. NectarSource[maxtrialindex].code[j]=lb+R*(ub-lb);
  275. }
  276. NectarSource[maxtrialindex].trail=0;
  277. NectarSource[maxtrialindex].trueFit=calculationTruefit(NectarSource[maxtrialindex]);
  278. NectarSource[maxtrialindex].fitness=calculationFitness(NectarSource[maxtrialindex].trueFit);
  279. }
  280. }
  281. void MemorizeBestSource()//保存最优的蜜源
  282. {
  283. int i,j;
  284. for (i=1;i<FoodNumber;i++)
  285. {
  286. if (NectarSource[i].trueFit<BestSource.trueFit)
  287. {
  288. for (j=0;j<D;j++)
  289. {
  290. BestSource.code[j]=NectarSource[i].code[j];
  291. }
  292. BestSource.trueFit=NectarSource[i].trueFit;
  293. }
  294. }
  295. }

收敛曲线:

优化算法—人工蜂群算法(ABC)相关推荐

  1. 优化算法——人工蜂群算法(ABC)

    一.人工蜂群算法的介绍     人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜 ...

  2. 进化算法-人工蜂群(ABC)

    人工蜂群算法(Artificial Bee Colony  Algorithm,ABC),主要模拟蜂群的智能采蜜行为,ABC算法中,主要由采蜜蜂.观察蜂.侦查蜂,3部分组成,每一处蜜源仅有一个采蜜蜂, ...

  3. 优化算法 | 人工蜂群算法(附Python代码)

    hello,大家好.各位可点击左下方阅读原文,访问公众号官方店铺.谨防上当受骗,感谢各位支持! 今天为各位更新人工蜂群算法(Artificial Bee Colony,ABC)的Python代码,之前 ...

  4. 投资组合优化的人工蜂群算法(Matlab代码实现)

     

  5. 【优化覆盖】基于matlab人工蜂群算法求解无线网络传感覆盖优化问题【含Matlab源码 1097期】

    ⛄一.人工蜂群算法求解无线网络传感覆盖优化问题简介 1 WSN覆盖模型 1.1 问题描述 在WSN中, 要实现较高的无线网络传感器节点覆盖率从而减少监测盲点的出现, 就必须加大无线网络传感器节点的分布 ...

  6. 人工蜂群算法(Artificial Bee Colony (ABC) Algorithm,附简单案例及详细matlab源码)

    作者:非妃是公主 专栏:<智能优化算法> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  7. 人工蜂群算法(ABC)

    Karaboga在2005年提出的人工蜂群算法(Artificial Bee Colony, ABC)模型是为了 解决多变量函数优化,全局优化问题 完整过程: 两种不同的表述方式,但实际的关系是: 观 ...

  8. 论文阅读三:基于改进人工蜂群算法的SDN负载均衡策略研究

    名词解释: Artificial Bee Colony Algorithm, ABC:人工蜂群算法 Load balancing algorithm based on improved artific ...

  9. 人工蜂群算法性能比较

    人工蜂群算法的性能(performance) 摘要:人工蜂群算法是基于蜜蜂群体的特定智能行为的最优化算法.比较了人工蜂群算法.差分进化算法(differential evolution).粒子群算法( ...

最新文章

  1. Roger Ver:BCH也可成为价值储备,前提是它被用起来
  2. java的concurrent包
  3. 如何真正提高ASP.NET网站的性能
  4. 刷新DNS解析缓存+追踪+域名解析命令
  5. java.io.file()_JAVA基础知识之IO-File类
  6. Python获取2019-nCoV疫情实时追踪数据
  7. mysql8双机热备高可用配置
  8. Hibernate初探之单表映射——Hibernate概念及插件的安装
  9. 谷歌Apps vs.微软Office
  10. 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
  11. ssm教务排课系统MVC学校专业选修课程安排选课信息jsp源代码数据库mysql
  12. 嵌入式硬件设计:SoC开发、电源设计、人机交互设计
  13. MySQL 性别为什么不适合建立索引-值重复率高的字段不适合建索引【转载】
  14. GoldWave中文版如何将视频批量转换为音频?
  15. H3C无线控制器AP license共享配置
  16. ES索引生命周期管理ILM
  17. 45个python入门案例_4牛-三博股票学习网
  18. 女人长的漂亮不如活的漂亮(Top60)
  19. mysql中sum和count的区别
  20. ILRuntime学习——从零开始

热门文章

  1. Tomcat高级配置(应用场景总结及示例)
  2. 微信 for Mac 3.0.0.1来袭 可以在电脑上刷朋友圈,附下载地址
  3. Wallabag——开源稍后读知识管理服务工具
  4. 微信小程序人脸核身---快速入门到实战(附开发工具类,复制即用)
  5. 【技术邻】CAE工程师崩溃的10个瞬间
  6. 豆芽的生长过程观察日记-绿豆发芽观察日记7天-2021年
  7. 打卡革命纪念地线上徒步大会手机软件,运动打卡活动策划,CSS margin(外边距)
  8. oracle 信用检查,Oracle EBS 信用(Credit)额度(1)
  9. Clearing the Skies: A deep network architecture for single-image rain removal解读
  10. 草图大师素材是如何快速导入到模型中的呢?草图溜溜来替你解答