人工蜂群算法(源码)

AN IDEA BASED ON HONEY BEE SWARM FOR NUMERICAL OPTIMIZATION

这篇论文没有讲到具体如何实现,但是大家可以通过去官网学习一下这个算法。

算法主要的变化,由三种蜜蜂的行为决定。

适应度值修正

fitness  ( X m → ) = { 1 / ( 1 + f ( X m → ) ) if  f ( X m → ) ≥ 0 1 + a b s ( f ( X m → ) ) if  f ( X m → ) < 0 } \text { fitness }\left(\overrightarrow{X_m}\right)=\left\{\begin{array}{cl}1 /\left(1+f\left(\overrightarrow{X_m}\right)\right) & \text { if } f\left(\overrightarrow{X_m}\right) \geq 0 \\1+a b s\left(f\left(\overrightarrow{X_m}\right)\right) & \text { if } f\left(\overrightarrow{X_m}\right)<0\end{array}\right\}  fitness (Xm​ ​)=⎩ ⎨ ⎧​1/(1+f(Xm​ ​))1+abs(f(Xm​ ​))​ if f(Xm​ ​)≥0 if f(Xm​ ​)<0​⎭ ⎬ ⎫​

首先,人工蜂群算法做的是求解最小值的问题,为了使得后面的轮盘赌算法能更好的运行,所以使用了这个修正函数,当原来的适应度值越小的时候,修正后的适应度值就会变得更大,并且修正过后的适应度值都为正数,同时,当适应度值为正数时候他修改后的适应度值小于等1,适应度值为负数的时候,适应度值大于1。

雇佣蜂(employed bee)

雇佣蜂负责在蜜源的附近搜索

public void employeeMove(){for(int i = 0;i<employeeBeeSize;i++){int j = (int)(Math.random()*employeeBeeSize);while(j==i){j = (int)(Math.random()*employeeBeeSize);//i!=j}//遍历所有的蜜源, 并且从里面挑出一个不是自己的蜜源的蜜源,i!=jint d = (int)(Math.random()*dimension);//随机挑一个维度进行变异Individual oldInd = honey.get(i);double xid = oldInd.getPosition().get(d);double xjd = honey.get(j).getPosition().get(d);double phi = Math.random()*2-1;//[-1,1)double vid = xid+phi*(xid-xjd);Position newPos = oldInd.getPosition().clone();newPos.set(d,vid);Individual newInd = new Individual(newPos);updateFitness(newInd);if(newInd.modifyFitness>oldInd.modifyFitness){//修正过以后越大越好honey.set(i,newInd);//贪婪交换trail[i]=0;}else {trail[i]++;}}}

这里是雇佣蜂的搜索

  • 遍历所有的雇佣蜂,由于直接将蜜源当成雇佣蜂来写比较方便,所以后面不管是雇佣蜂还是旁观蜂都用蜜源(honey表示)
  • 随机挑一个和自己不一样的蜜源,并且挑选一个维度使用公式 x i d = x i d + ϕ ∗ ( x i d − x k d ) x_{id} = x_{id}+\phi *(x_{id}-x_{kd}) xid​=xid​+ϕ∗(xid​−xkd​)进行变异,其中i是当前的蜜源,k是随机挑出来的蜜源,d代表着要变异的维度, ϕ \phi ϕ为(-1,1)上面均匀分布的随机数。
  • 假如更新过后的蜜源比原来的蜜源要好,就替换,假如不是则 t r a i l trail trail增加, t r a i l trail trail是记录当前的蜜源有多久没有变化的。 t r a i l trail trail具有上限,当 t r a i l trail trail超过 l i m i t limit limit值的时候就会进行侦察峰的行为, l i m i t = d i m e n s i o n ∗ 10 limit = dimension * 10 limit=dimension∗10

旁观蜂(onlooker bee)

public void onlookerMove(){double sum = 0;for(int i = 0;i<employeeBeeSize;i++){sum+=honey.get(i).getModifyFitness();}for(int i = 0;i<onlookersSize;i++){double prob = Math.random()*sum;int select = 0;double curProb = 0;for(int j = 0;j<employeeBeeSize;j++){curProb+=honey.get(j).getModifyFitness();if(prob<curProb){select = j;break;}}int selectDimension = (int)(dimension*Math.random());Individual oldInd = honey.get(i);double xid = oldInd.getPosition().get(selectDimension);double xjd = honey.get(select).getPosition().get(selectDimension);double phi = Math.random()*2-1;//[-1,1)double vid = xid+phi*(xid-xjd);Position newPos = oldInd.getPosition().clone();newPos.set(selectDimension,vid);Individual newInd = new Individual(newPos);updateFitness(newInd);if(newInd.modifyFitness>oldInd.modifyFitness){//最大化修正过的适应度值,minihoney.set(i,newInd);//贪婪交换trail[i]=0;}else {trail[i]++;}}}

旁观蜂阶段大致是和雇佣蜂阶段相同的,最大的不同点就是,雇佣蜂阶段使用的是随机挑选一个雇佣蜂进行跟随,但是在旁观蜂阶段使用的是贪心形选择,将修正过后的适应度值作为选取轮盘赌的依据

轮盘赌的公式为:

p m = f i t m ( X m → ) ∑ m = 1 ∣ P ∣ f i t m ( X m → ) p_m=\frac{f i t_m\left(\overrightarrow{X_m}\right)}{\sum_{m=1}^{|P|} f i t_m\left(\overrightarrow{X_m}\right)} pm​=∑m=1∣P∣​fitm​(Xm​ ​)fitm​(Xm​ ​)​

注意这里的fit为修改过后的适应度值,修改过后的适应度值越大,则在该轮被选取的概率越大。

同样的,这里变化的公式为 x i d = x i d + ϕ ∗ ( x i d − x k d ) x_{id} = x_{id}+\phi *(x_{id}-x_{kd}) xid​=xid​+ϕ∗(xid​−xkd​),k为根据轮盘赌选出的蜜蜂。

侦察峰(scout bee)

侦察峰

public void scoutMove(){int selectMaxTrail = 0;int limit = dimension*10;for(int i = 0;i<employeeBeeSize;i++){//find max trail beeif(trail[i]>limit&&trail[selectMaxTrail]< trail[i]){selectMaxTrail = i;}}if(trail[selectMaxTrail]>limit){Individual scout = new Individual(positionFactory.initRandomPosition());updateFitness(scout);trail[selectMaxTrail] = 0;honey.set(selectMaxTrail,scout);}}

这里就是每一轮都挑出最大的trail的蜜源出来,假如蜜源超过上限的话,就重新初始化这个蜜源。

总体流程就是这样↓

将侦察蜂送到初始化的食物源
重复雇佣蜂行为旁观蜂行为侦察峰行为记录下最优解
直到(需求被满足)

总体流程代码

import java.util.*;//人工蜂群优化算法
public class ABC{int populationSize = 40;int onlookersSize = populationSize/2;//跟随蜂int employeeBeeSize = populationSize/2;//雇佣蜂Individual scout;List<Individual> honey;PositionFactory positionFactory;Individual bestBee;int dimension;int trail[];//记录迭代次数public ABC(int dimension,int ub,int lb){this.dimension = dimension;positionFactory = new PositionFactory(dimension,ub,lb);init();int iterTime = 0;int maxIterTime = 1000;while(iterTime<maxIterTime){employeeMove();onlookerMove();recordBest();scoutMove();recordBest();iterTime++;System.out.println(bestBee.fitness+"   "+bestBee.modifyFitness);}}public static void main(String[] args) {new ABC(2,4,-2);}public void init(){scout = new Individual(positionFactory.initRandomPosition());updateFitness(scout);honey = new ArrayList<>(onlookersSize);for (int i = 0; i < onlookersSize; i++) {Position p = positionFactory.initRandomPosition();Individual individual = new Individual(p);updateFitness(individual);honey.add(individual);}trail = new int[onlookersSize];Arrays.fill(trail,0);}public void employeeMove(){for(int i = 0;i<employeeBeeSize;i++){int j = (int)(Math.random()*employeeBeeSize);while(j==i){j = (int)(Math.random()*employeeBeeSize);//i!=j}int d = (int)(Math.random()*dimension);Individual oldInd = honey.get(i);double xid = oldInd.getPosition().get(d);double xjd = honey.get(j).getPosition().get(d);double phi = Math.random()*2-1;//[-1,1)double vid = xid+phi*(xid-xjd);Position newPos = oldInd.getPosition().clone();newPos.set(d,vid);Individual newInd = new Individual(newPos);updateFitness(newInd);if(newInd.modifyFitness>oldInd.modifyFitness){//修正过以后越大越好honey.set(i,newInd);//贪婪交换trail[i]=0;}else {trail[i]++;}}}public void onlookerMove(){double sum = 0;for(int i = 0;i<employeeBeeSize;i++){sum+=honey.get(i).getModifyFitness();}for(int i = 0;i<onlookersSize;i++){double prob = Math.random()*sum;int select = 0;double curProb = 0;for(int j = 0;j<employeeBeeSize;j++){curProb+=honey.get(j).getModifyFitness();if(prob<curProb){select = j;break;}}int selectDimension = (int)(dimension*Math.random());Individual oldInd = honey.get(i);double xid = oldInd.getPosition().get(selectDimension);double xjd = honey.get(select).getPosition().get(selectDimension);double phi = Math.random()*2-1;//[-1,1)double vid = xid+phi*(xid-xjd);Position newPos = oldInd.getPosition().clone();newPos.set(selectDimension,vid);Individual newInd = new Individual(newPos);updateFitness(newInd);if(newInd.modifyFitness>oldInd.modifyFitness){//最大化修正过的适应度值,minihoney.set(i,newInd);//贪婪交换trail[i]=0;}else {trail[i]++;}}}public void scoutMove(){int selectMaxTrail = 0;int limit = dimension*10;for(int i = 0;i<employeeBeeSize;i++){//find max trail beeif(trail[i]>limit&&trail[selectMaxTrail]< trail[i]){selectMaxTrail = i;}}if(trail[selectMaxTrail]>limit){Individual scout = new Individual(positionFactory.initRandomPosition());updateFitness(scout);trail[selectMaxTrail] = 0;honey.set(selectMaxTrail,scout);}}//求解最小值问题public void recordBest(){Individual curBestBee = Collections.min(honey, new Comparator<Individual>() {@Overridepublic int compare(Individual o1, Individual o2) {return new Double(o1.getFitness()).compareTo(new Double(o2.getFitness()));}});if(bestBee==null){bestBee = curBestBee;}else if(bestBee.fitness>curBestBee.fitness){bestBee = curBestBee;}}public void updateFitness(Individual individual){individual.fitness = sinsin(individual.getPosition());individual.modifyFitness = modifyFitness(individual.fitness);}public static double Michalewicz(Position position){double res = 0;double m = 10;for (int i = 0; i < position.size(); i++) {double x = position.get(i);res+=-Math.sin(x)*Math.pow(Math.sin((i+1)*x*x/Math.PI),2*m);}return res;}public static double sinsin(Position position){double res = 0;for(int i = 0;i<position.size();i++){double x = position.get(i);res+=Math.sin(x);}return res;}public static double modifyFitness(double value){if(value>=0){return 1.0/(1.0+value);}else {return 1+Math.abs(value);}}
}

总结

这篇算法有粒子群算法的影子,在旁观蜂阶段使用轮盘赌算法,同时也有差分进化算法的影子:雇佣蜂阶段搜索猎物。而且这个算法没有什么需要调参的地方,感觉还行,这篇算法要注意的地方是适应度修正的地方然后就没有了。

人工蜂群算法(源码)相关推荐

  1. 【布局优化】基于人工蜂群算法的无线传感器网(WSN)覆盖优化matlab源码

    一.WSN模型 1.1 动机 近年来,随着对等网络.云计算和网格计算等分布式环境的发展,无线传感器网络(WSN)得到了广泛的应用.无线传感器网络(WSN)是一种新兴的计算和网络模式,它可以被定义为一个 ...

  2. 【LSSVM回归预测】基于matlab人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】

    ⛄一.人工蜂群算法优化最小二乘支持向量机LSSVM简介 1 最小二乘支持向量机 最小二乘支持向量机是支持向量机的一种改进算法[9,10],它将SVM算法中的不等式约束转化为等式约束,采用最小二乘线性系 ...

  3. 【LSSVM回归预测】人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】

    ⛄一.人工蜂群算法优化最小二乘支持向量机LSSVM简介 1 最小二乘支持向量机 最小二乘支持向量机是支持向量机的一种改进算法[9,10],它将SVM算法中的不等式约束转化为等式约束,采用最小二乘线性系 ...

  4. 【ABC三维路径规划】基于matlab人工蜂群算法多无人机三维路径规划【含Matlab源码 170期】

    一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下 ...

  5. 【ABC三维路径规划】基于matlab人工蜂群算法无人机三维路径规划【含Matlab源码 021期】

    ⛄一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水 ...

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

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

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

    1 简介 近年来,物联网技术,人工智能技术的兴起使传感器网络分布覆盖检测区域的研究以及最大限度地提高传感器网络的覆盖率变得尤为必要.人工蜂群算法在无约束条件的数值优化问题上能取得较好的收敛效果.通过人 ...

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

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

  9. 人工蜂群算法(Artificial Bee Colony, ABC)MATALAB代码详细解析

    目录 一.人工蜂群算法理论 二.算法流程图 二.代码讲解 1. ABC.m文件 2.Sephere.m文件 3.RouletteWheelSelection.m文件 二.源码下载 该代码是Matlab ...

最新文章

  1. Premiere制作VCD视频几个关键设置
  2. Styling Alert controls in Flex using the StyleManager class and setStyle() methods
  3. git仓库相关知识01-安装和基本命令
  4. 预测数值型数据:回归源码分析(1)
  5. HDU4364(模拟矩阵乘法)
  6. XCodeBuild 使用
  7. pandas 操作 excel
  8. 区块链 PBFT 哪个节点 谁负责打包区块
  9. linux下的软件管理
  10. 第七章 yaml格式
  11. 如何理解静态库与动态库
  12. timestamp 与 nonce 防止重放攻击
  13. Could not locate zlibwapi.dll. Please make sure it is in your library path
  14. 斯坦福大学自然语言处理第四课“语言模型(Language Modeling)”
  15. 中国眼部护理产品市场趋势报告、技术动态创新及市场预测
  16. 将标准的EclipseWTP项目转化成具有Gradle功能的EclipseWTP项目
  17. c语言的菜单制作,C语言的菜单制作.ppt
  18. 深度学习 yolov5等结构图
  19. 【用户画像】应用场景
  20. mac网页java无法加载,chrome浏览器mac版无法加载怎么办_chrome浏览器mac版打不开网页解决方法-win7之家...

热门文章

  1. 发送邮件springboot-stater-mail
  2. 给DreamweaverCs6安装Emmet插件,让你快速编写html标签
  3. 怎样检查笔记本电池使用情况?
  4. linux中iptables配置文件及命令详解详解
  5. 虚拟主机安装wp提示Fatal error: require(): Failed opening required解决方案
  6. 美术0基础想快速入行游戏美术3d,需要学习哪些课程
  7. 广州市计算机教育软件,广州博学教育电脑版
  8. pygame库pgu使用介绍
  9. 计算机中f代表几,相机中的F代表什么意思
  10. 第三届中国站长大会拟邀请站长名单