优化算法—人工蜂群算法(ABC)
一、人工蜂群算法的介绍
二、人工蜂群算法的原理
1、原理
2、流程
- 初始化;
- 重复以下过程:
- 将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量;
- 观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜源的花蜜量;
- 确定侦查蜂,并根据第三个公式寻找新的蜜源;
- 记忆迄今为止最好的蜜源;
- 判断终止条件是否成立;
三、人工蜂群算法用于求解函数优化问题
- #include<iostream>
- #include<time.h>
- #include<stdlib.h>
- #include<cmath>
- #include<fstream>
- #include<iomanip>
- using namespace std;
- const int NP=40;//种群的规模,采蜜蜂+观察蜂
- const int FoodNumber=NP/2;//食物的数量,为采蜜蜂的数量
- const int limit=20;//限度,超过这个限度没有更新采蜜蜂变成侦查蜂
- const int maxCycle=10000;//停止条件
- /*****函数的特定参数*****/
- const int D=2;//函数的参数个数
- const double lb=-100;//函数的下界
- const double ub=100;//函数的上界
- double result[maxCycle]={0};
- /*****种群的定义****/
- struct BeeGroup
- {
- double code[D];//函数的维数
- double trueFit;//记录真实的最小值
- double fitness;
- double rfitness;//相对适应值比例
- int trail;//表示实验的次数,用于与limit作比较
- }Bee[FoodNumber];
- BeeGroup NectarSource[FoodNumber];//蜜源,注意:一切的修改都是针对蜜源而言的
- BeeGroup EmployedBee[FoodNumber];//采蜜蜂
- BeeGroup OnLooker[FoodNumber];//观察蜂
- BeeGroup BestSource;//记录最好蜜源
- /*****函数的声明*****/
- double random(double, double);//产生区间上的随机数
- void initilize();//初始化参数
- double calculationTruefit(BeeGroup);//计算真实的函数值
- double calculationFitness(double);//计算适应值
- void CalculateProbabilities();//计算轮盘赌的概率
- void evalueSource();//评价蜜源
- void sendEmployedBees();
- void sendOnlookerBees();
- void sendScoutBees();
- void MemorizeBestSource();
- /*******主函数*******/
- int main()
- {
- ofstream output;
- output.open("dataABC.txt");
- srand((unsigned)time(NULL));
- initilize();//初始化
- MemorizeBestSource();//保存最好的蜜源
- //主要的循环
- int gen=0;
- while(gen<maxCycle)
- {
- sendEmployedBees();
- CalculateProbabilities();
- sendOnlookerBees();
- MemorizeBestSource();
- sendScoutBees();
- MemorizeBestSource();
- output<<setprecision(30)<<BestSource.trueFit<<endl;
- gen++;
- }
- output.close();
- cout<<"运行结束!!"<<endl;
- return 0;
- }
- /*****函数的实现****/
- double random(double start, double end)//随机产生区间内的随机数
- {
- return start+(end-start)*rand()/(RAND_MAX + 1.0);
- }
- void initilize()//初始化参数
- {
- int i,j;
- for (i=0;i<FoodNumber;i++)
- {
- for (j=0;j<D;j++)
- {
- NectarSource[i].code[j]=random(lb,ub);
- EmployedBee[i].code[j]=NectarSource[i].code[j];
- OnLooker[i].code[j]=NectarSource[i].code[j];
- BestSource.code[j]=NectarSource[0].code[j];
- }
- /****蜜源的初始化*****/
- NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);
- NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);
- NectarSource[i].rfitness=0;
- NectarSource[i].trail=0;
- /****采蜜蜂的初始化*****/
- EmployedBee[i].trueFit=NectarSource[i].trueFit;
- EmployedBee[i].fitness=NectarSource[i].fitness;
- EmployedBee[i].rfitness=NectarSource[i].rfitness;
- EmployedBee[i].trail=NectarSource[i].trail;
- /****观察蜂的初始化****/
- OnLooker[i].trueFit=NectarSource[i].trueFit;
- OnLooker[i].fitness=NectarSource[i].fitness;
- OnLooker[i].rfitness=NectarSource[i].rfitness;
- OnLooker[i].trail=NectarSource[i].trail;
- }
- /*****最优蜜源的初始化*****/
- BestSource.trueFit=NectarSource[0].trueFit;
- BestSource.fitness=NectarSource[0].fitness;
- BestSource.rfitness=NectarSource[0].rfitness;
- BestSource.trail=NectarSource[0].trail;
- }
- double calculationTruefit(BeeGroup bee)//计算真实的函数值
- {
- double truefit=0;
- /******测试函数1******/
- 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)
- /((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])));
- return truefit;
- }
- double calculationFitness(double truefit)//计算适应值
- {
- double fitnessResult=0;
- if (truefit>=0)
- {
- fitnessResult=1/(truefit+1);
- }else
- {
- fitnessResult=1+abs(truefit);
- }
- return fitnessResult;
- }
- void sendEmployedBees()//修改采蜜蜂的函数
- {
- int i,j,k;
- int param2change;//需要改变的维数
- double Rij;//[-1,1]之间的随机数
- for (i=0;i<FoodNumber;i++)
- {
- param2change=(int)random(0,D);//随机选取需要改变的维数
- /******选取不等于i的k********/
- while (1)
- {
- k=(int)random(0,FoodNumber);
- if (k!=i)
- {
- break;
- }
- }
- for (j=0;j<D;j++)
- {
- EmployedBee[i].code[j]=NectarSource[i].code[j];
- }
- /*******采蜜蜂去更新信息*******/
- Rij=random(-1,1);
- EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
- /*******判断是否越界********/
- if (EmployedBee[i].code[param2change]>ub)
- {
- EmployedBee[i].code[param2change]=ub;
- }
- if (EmployedBee[i].code[param2change]<lb)
- {
- EmployedBee[i].code[param2change]=lb;
- }
- EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);
- EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);
- /******贪婪选择策略*******/
- if (EmployedBee[i].trueFit<NectarSource[i].trueFit)
- {
- for (j=0;j<D;j++)
- {
- NectarSource[i].code[j]=EmployedBee[i].code[j];
- }
- NectarSource[i].trail=0;
- NectarSource[i].trueFit=EmployedBee[i].trueFit;
- NectarSource[i].fitness=EmployedBee[i].fitness;
- }else
- {
- NectarSource[i].trail++;
- }
- }
- }
- void CalculateProbabilities()//计算轮盘赌的选择概率
- {
- int i;
- double maxfit;
- maxfit=NectarSource[0].fitness;
- for (i=1;i<FoodNumber;i++)
- {
- if (NectarSource[i].fitness>maxfit)
- maxfit=NectarSource[i].fitness;
- }
- for (i=0;i<FoodNumber;i++)
- {
- NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;
- }
- }
- void sendOnlookerBees()//采蜜蜂与观察蜂交流信息,观察蜂更改信息
- {
- int i,j,t,k;
- double R_choosed;//被选中的概率
- int param2change;//需要被改变的维数
- double Rij;//[-1,1]之间的随机数
- i=0;
- t=0;
- while(t<FoodNumber)
- {
- R_choosed=random(0,1);
- if(R_choosed<NectarSource[i].rfitness)//根据被选择的概率选择
- {
- t++;
- param2change=(int)random(0,D);
- /******选取不等于i的k********/
- while (1)
- {
- k=(int)random(0,FoodNumber);
- if (k!=i)
- {
- break;
- }
- }
- for(j=0;j<D;j++)
- {
- OnLooker[i].code[j]=NectarSource[i].code[j];
- }
- /****更新******/
- Rij=random(-1,1);
- OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
- /*******判断是否越界*******/
- if (OnLooker[i].code[param2change]<lb)
- {
- OnLooker[i].code[param2change]=lb;
- }
- if (OnLooker[i].code[param2change]>ub)
- {
- OnLooker[i].code[param2change]=ub;
- }
- OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);
- OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit);
- /****贪婪选择策略******/
- if (OnLooker[i].trueFit<NectarSource[i].trueFit)
- {
- for (j=0;j<D;j++)
- {
- NectarSource[i].code[j]=OnLooker[i].code[j];
- }
- NectarSource[i].trail=0;
- NectarSource[i].trueFit=OnLooker[i].trueFit;
- NectarSource[i].fitness=OnLooker[i].fitness;
- }else
- {
- NectarSource[i].trail++;
- }
- }
- i++;
- if (i==FoodNumber)
- {
- i=0;
- }
- }
- }
- /*******只有一只侦查蜂**********/
- void sendScoutBees()//判断是否有侦查蜂的出现,有则重新生成蜜源
- {
- int maxtrialindex,i,j;
- double R;//[0,1]之间的随机数
- maxtrialindex=0;
- for (i=1;i<FoodNumber;i++)
- {
- if (NectarSource[i].trail>NectarSource[maxtrialindex].trail)
- {
- maxtrialindex=i;
- }
- }
- if(NectarSource[maxtrialindex].trail>=limit)
- {
- /*******重新初始化*********/
- for (j=0;j<D;j++)
- {
- R=random(0,1);
- NectarSource[maxtrialindex].code[j]=lb+R*(ub-lb);
- }
- NectarSource[maxtrialindex].trail=0;
- NectarSource[maxtrialindex].trueFit=calculationTruefit(NectarSource[maxtrialindex]);
- NectarSource[maxtrialindex].fitness=calculationFitness(NectarSource[maxtrialindex].trueFit);
- }
- }
- void MemorizeBestSource()//保存最优的蜜源
- {
- int i,j;
- for (i=1;i<FoodNumber;i++)
- {
- if (NectarSource[i].trueFit<BestSource.trueFit)
- {
- for (j=0;j<D;j++)
- {
- BestSource.code[j]=NectarSource[i].code[j];
- }
- BestSource.trueFit=NectarSource[i].trueFit;
- }
- }
- }
收敛曲线:
优化算法—人工蜂群算法(ABC)相关推荐
- 优化算法——人工蜂群算法(ABC)
一.人工蜂群算法的介绍 人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜 ...
- 进化算法-人工蜂群(ABC)
人工蜂群算法(Artificial Bee Colony Algorithm,ABC),主要模拟蜂群的智能采蜜行为,ABC算法中,主要由采蜜蜂.观察蜂.侦查蜂,3部分组成,每一处蜜源仅有一个采蜜蜂, ...
- 优化算法 | 人工蜂群算法(附Python代码)
hello,大家好.各位可点击左下方阅读原文,访问公众号官方店铺.谨防上当受骗,感谢各位支持! 今天为各位更新人工蜂群算法(Artificial Bee Colony,ABC)的Python代码,之前 ...
- 投资组合优化的人工蜂群算法(Matlab代码实现)
- 【优化覆盖】基于matlab人工蜂群算法求解无线网络传感覆盖优化问题【含Matlab源码 1097期】
⛄一.人工蜂群算法求解无线网络传感覆盖优化问题简介 1 WSN覆盖模型 1.1 问题描述 在WSN中, 要实现较高的无线网络传感器节点覆盖率从而减少监测盲点的出现, 就必须加大无线网络传感器节点的分布 ...
- 人工蜂群算法(Artificial Bee Colony (ABC) Algorithm,附简单案例及详细matlab源码)
作者:非妃是公主 专栏:<智能优化算法> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 人工蜂群算法(ABC)
Karaboga在2005年提出的人工蜂群算法(Artificial Bee Colony, ABC)模型是为了 解决多变量函数优化,全局优化问题 完整过程: 两种不同的表述方式,但实际的关系是: 观 ...
- 论文阅读三:基于改进人工蜂群算法的SDN负载均衡策略研究
名词解释: Artificial Bee Colony Algorithm, ABC:人工蜂群算法 Load balancing algorithm based on improved artific ...
- 人工蜂群算法性能比较
人工蜂群算法的性能(performance) 摘要:人工蜂群算法是基于蜜蜂群体的特定智能行为的最优化算法.比较了人工蜂群算法.差分进化算法(differential evolution).粒子群算法( ...
最新文章
- Roger Ver:BCH也可成为价值储备,前提是它被用起来
- java的concurrent包
- 如何真正提高ASP.NET网站的性能
- 刷新DNS解析缓存+追踪+域名解析命令
- java.io.file()_JAVA基础知识之IO-File类
- Python获取2019-nCoV疫情实时追踪数据
- mysql8双机热备高可用配置
- Hibernate初探之单表映射——Hibernate概念及插件的安装
- 谷歌Apps vs.微软Office
- 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
- ssm教务排课系统MVC学校专业选修课程安排选课信息jsp源代码数据库mysql
- 嵌入式硬件设计:SoC开发、电源设计、人机交互设计
- MySQL 性别为什么不适合建立索引-值重复率高的字段不适合建索引【转载】
- GoldWave中文版如何将视频批量转换为音频?
- H3C无线控制器AP license共享配置
- ES索引生命周期管理ILM
- 45个python入门案例_4牛-三博股票学习网
- 女人长的漂亮不如活的漂亮(Top60)
- mysql中sum和count的区别
- ILRuntime学习——从零开始
热门文章
- Tomcat高级配置(应用场景总结及示例)
- 微信 for Mac 3.0.0.1来袭 可以在电脑上刷朋友圈,附下载地址
- Wallabag——开源稍后读知识管理服务工具
- 微信小程序人脸核身---快速入门到实战(附开发工具类,复制即用)
- 【技术邻】CAE工程师崩溃的10个瞬间
- 豆芽的生长过程观察日记-绿豆发芽观察日记7天-2021年
- 打卡革命纪念地线上徒步大会手机软件,运动打卡活动策划,CSS margin(外边距)
- oracle 信用检查,Oracle EBS 信用(Credit)额度(1)
- Clearing the Skies: A deep network architecture for single-image rain removal解读
- 草图大师素材是如何快速导入到模型中的呢?草图溜溜来替你解答