优化算法——人工蜂群算法(ABC)一、人工蜂群算法的介绍一、人工蜂群算法的介绍关注公众号 ID:datadw 学习数据挖掘,研究大数据,关注你想了解的,分享你需要的人工蜂群算法(Artificial Bee Colony, ABC)是由 Karaboga 于 2005 年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解人工蜂群算法属于群智能算法的一种二、人工蜂群算法的原理二、人工蜂群算法的原理1 1、原理、原理标准的 ABC 算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为 3 类: 采蜜蜂、观察蜂和侦察蜂整个蜂群的目标是寻找花蜜量最大的蜜源在标准的 ABC 算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源假设问题的解空间是维的,采蜜蜂与观察蜂的个数都是,采蜜蜂的个数或观察蜂的个数与蜜源的数量相等则标准的 ABC 算法将优化问题的求解过程看成是在维搜索空间中进行搜索。
每个蜜源的位置代表问题的一个可能解,蜜源的花蜜量对应于相应的解的适应度一个采蜜蜂与一个蜜源是相对应的与第 个蜜源相对应的采蜜蜂依据如下公式寻找新的蜜源:其中,,,是区间上的随机数,标准的 ABC 算法将新生成的可能解与原来的解作比较,并采用贪婪选择策略保留较好的解每一个观察蜂依据概率选择一个蜜源,概率公式为其中,是可能解的适应值对于被选择的蜜源,观察蜂根据上面概率公式搜寻新的可能解当所有的采蜜蜂和观察蜂都搜索完整个搜索空间时,如果一个蜜源的适应值在给定的步骤内(定义为控制参数“limit”) 没有被提高, 则丢弃该蜜源,而与该蜜源相对应的采蜜蜂变成侦查蜂,侦查蜂通过已下公式搜索新的可能解其中, 是区间上的随机数,和是第 维的下界和上界2 2、流程、流程初始化;重复以下过程:o将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量;o观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜源的花蜜量;o确定侦查蜂,并根据第三个公式寻找新的蜜源;o记忆迄今为止最好的蜜源;判断终止条件是否成立;三、人工蜂群算法用于求解函数优化问题三、人工蜂群算法用于求解函数优化问题对于函数其中。
代码:[cpp] view plaincopy1.#include 2.#include 3.#include 4.#include 5.#include 6.#include 7.using namespace std; 8. 9.const int NP=40;//种群的规模,采蜜蜂+观察蜂 10.const int FoodNumber=NP/2;//食物的数量,为采蜜蜂的数量 11.const int limit=20;//限度,超过这个限度没有更新采蜜蜂变成侦查蜂 12.const int maxCycle=10000;//停止条件 13. 14./*****函数的特定参数*****/ 15.const int D=2;//函数的参数个数 16.const double lb=-100;//函数的下界 17.const double ub=100;//函数的上界 18. 19.double result[maxCycle]={0}; 20. 21./*****种群的定义****/ 22.struct BeeGroup 23.{ 24. double code[D];//函数的维数 25. double trueFit;//记录真实的最小值 26. double fitness; 27. double rfitness;//相对适应值比例 28. int trail;//表示实验的次数,用于与 limit 作比较 29.}Bee[FoodNumber]; 30. 31.BeeGroup NectarSource[FoodNumber];//蜜源,注意:一切的修改都是针对蜜源而言的 32.BeeGroup EmployedBee[FoodNumber];//采蜜蜂 33.BeeGroup OnLooker[FoodNumber];//观察蜂 34.BeeGroup BestSource;//记录最好蜜源 35. 36./*****函数的声明*****/ 37.double random(double, double);//产生区间上的随机数 38.void initilize();//初始化参数 39.double calculationTruefit(BeeGroup);//计算真实的函数值 40.double calculationFitness(double);//计算适应值 41.void CalculateProbabilities();//计算轮盘赌的概率 42.void evalueSource();//评价蜜源 43.void sendEmployedBees(); 44.void sendOnlookerBees(); 45.void sendScoutBees(); 46.void MemorizeBestSource(); 47. 48. 49./*******主函数*******/ 50.int main() 51.{ 52. ofstream output; 53. output.open(“dataABC.txt“); 54. 55. srand((unsigned)time(NULL)); 56. initilize();//初始化 57. MemorizeBestSource();//保存最好的蜜源 58. 59. //主要的循环 60. int gen=0; 61. while(gen=0) 140. { 141. fitnessResult=1/(truefit+1); 142. }else 143. { 144. fitnessResult=1+abs(truefit); 145. } 146. return fitnessResult; 147.} 148. 149.void sendEmployedBees()//修改采蜜蜂的函数 150.{ 151. int i,j,k; 152. int param2change;//需要改变的维数 153. double Rij;//[-1,1]之间的随机数 154. for (i=0;iub) 179. { 180. EmployedBee[i].code[param2change]=ub; 181. } 182. if (EmployedBee[i].code[param2change]maxfit) 214. maxfit=NectarSource[i].fitness; 215. } 216. 217. for (i=0;iub) 265. { 266. OnLooker[i].code[param2change]=ub; 267. } 268. OnLooker[i].trueFit=calculationTruefit(OnLooker[i]); 269. OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit); 270. 271. /****贪婪选择策略******/ 272. if (OnLooker[i].trueFitNectarSource[maxtrialindex].trail) 304. { 305. maxtrialindex=i; 306. } 307. } 308. if(NectarSource[maxtrialindex].trail>=limit) 309. { 310. /*******重新初始化*********/ 311. for (j=0;j