人工蜂群算法(ABC算法)Java实现

人工蜂群算法(ABC算法)(Artificial Bee Colony)

Java实现测试函数Rastrigin,附上原型代码翻译后的注释。

题目:

待优化问题参数设置10个,运行一次,[-5.12,5.12]。

附上代码:

package ABCtest;public class bee {/* ABC算法的控制参数 */int NP=20; /* 蜂群大小(雇佣蜂+观蜜蜂) (employed bees+onlooker bees)*/int FoodNumber = NP/2; /*食物源的数量相当于蜂群数量的一半*/int limit = 100;  /*一种无法通过“限制”改善的食物源被其雇佣蜂抛弃*/int maxCycle = 2500; /*觅食循环次数{一个停止条件}*//* 问题的特殊变量*/int D = 10; /*待优化问题的参数个数*/double lb = -5.12; /*参数的下界。*/double ub = 5.12; /*参数的上界。对于参数有不同边界的问题,可以将lb和ub定义为数组*/double Foods[][]=new double[FoodNumber][D];        /*foods是食物源的数组。每一行是一个包含D个待优化参数的向量。矩阵的行数等于食物源数*/double f[]=new double[FoodNumber];        /*f是一个与食物源相关的目标函数值的数组*/double fitness[]=new double[FoodNumber];      /*fitness是与食物源相关的质量值的数组*/double trial[]=new double[FoodNumber];         /*trial is a vector holding trial numbers through which solutions can not be improved*/double prob[]=new double[FoodNumber];          /*prob表示食物源被选择的概率的数组*/double solution[]=new double[D];double ObjValSol;              /*Objective function value of new solution*/double FitnessSol;             /*    Fitness        value of new solution*/int neighbour, param2change;   /*param2change corrresponds to j, neighbour corresponds to k in equation v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})*/double GlobalMin;                       /*ABC算法求得的最优解*/double GlobalParams[]=new double[D];                   /*最优解的参数Parameters of the optimum solution*/double r; /* [0,1)的随机数 *//*适应度函数*/double CalculateFitness(double fun){double result=0;if(fun>=0){result=1/(fun+1);}else{result=1+Math.abs(fun);}return result;}/*记录最优解*/void MemorizeBestSource(){int i,j;for(i=0;i<FoodNumber;i++){if (f[i]<GlobalMin){GlobalMin=f[i];for(j=0;j<D;j++)GlobalParams[j]=Foods[i][j];}}}/* 变量在[lb,ub]范围内初始化。如果每个参数的取值范围不同,使用lb[j]、ub[j]数组代替lb和ub *//* 食物源的计数器也在这个函数中初始化*/void init(int index){int j;for (j=0;j<D;j++){r = (   (double)Math.random()*32767 / ((double)32767+(double)(1)) );Foods[index][j]=r*(ub-lb)+lb;solution[j]=Foods[index][j];}f[index]=calculateFunction(solution);fitness[index]=CalculateFitness(f[index]);trial[index]=0;}/*初始化所有食物源 */void initial(){int i;for(i=0;i<FoodNumber;i++){init(i);}GlobalMin=f[0];for(i=0;i<D;i++)GlobalParams[i]=Foods[0][i];}void SendEmployedBees(){int i,j;/*雇佣蜂阶段*/for (i=0;i<FoodNumber;i++){/*随机更改参数*/r = ((double) Math.random()*32767 / ((double)(32767)+(double)(1)) );param2change=(int)(r*D);/*使用随机数产生不同的解*/r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );neighbour=(int)(r*FoodNumber);for(j=0;j<D;j++)solution[j]=Foods[i][j];r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;/*如果超出边界,则直接等于边界*/if (solution[param2change]<lb)solution[param2change]=lb;if (solution[param2change]>ub)solution[param2change]=ub;ObjValSol=calculateFunction(solution);FitnessSol=CalculateFitness(ObjValSol);/*贪婪选择一下*/if (FitnessSol>fitness[i]){/*如果变换后的解优于原解,则替换之,并重置计数器*/trial[i]=0;for(j=0;j<D;j++)Foods[i][j]=solution[j];f[i]=ObjValSol;fitness[i]=FitnessSol;}else{   /*如果解决方案没有改进,增加它的试验次数*/trial[i]=trial[i]+1;}}/*雇佣蜂阶段结束*/}/*选择食物源的概率与其质量成正比*//*可以采用多种方案来计算概率值*//*例如 prob(i)=fitness(i)/sum(fitness) *//*或者 prob(i)=a*fitness(i)/max(fitness)+b*//*概率值由适应度值计算,并除以最大适应度值来标准化*/void CalculateProbabilities(){int i;double maxfit;maxfit=fitness[0];for (i=1;i<FoodNumber;i++){if (fitness[i]>maxfit)maxfit=fitness[i];}for (i=0;i<FoodNumber;i++){prob[i]=(0.9*(fitness[i]/maxfit))+0.1;}}void SendOnlookerBees(){int i,j,t;i=0;t=0;/*观察蜂阶段*/while(t<FoodNumber){r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );if(r<prob[i]) /*根据选择概率选择食物源*/{t++;/*随机更改参数*/r = ((double)Math.random()*32767 / ((double)(32767)+(double)(1)) );param2change=(int)(r*D);/*使用随机数产生不同的解*/r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );neighbour=(int)(r*FoodNumber);/*随机解必须不同于解i*/while(neighbour == i){r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );neighbour=(int)(r*FoodNumber);}for(j=0;j<D;j++)solution[j]=Foods[i][j];r = (   (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;/*如果超出边界,则直接等于边界*/if (solution[param2change]<lb)solution[param2change]=lb;if (solution[param2change]>ub)solution[param2change]=ub;ObjValSol=calculateFunction(solution);FitnessSol=CalculateFitness(ObjValSol);/*贪婪选择一下*/if (FitnessSol>fitness[i]){trial[i]=0;for(j=0;j<D;j++)Foods[i][j]=solution[j];f[i]=ObjValSol;fitness[i]=FitnessSol;}else{   /*如果解决方案没有改进,增加它的试验次数*/trial[i]=trial[i]+1;}}i++;if (i==FoodNumber-1)i=0;}/*观察蜂阶段结束 */}/*确定哪些食物源的试验计数器超过了“limit”值. 在基本的ABC算法中,每次循环只允许有一个侦察蜂*/void SendScoutBees(){int maxtrialindex,i;maxtrialindex=0;for (i=1;i<FoodNumber;i++){if (trial[i]>trial[maxtrialindex])maxtrialindex=i;}if(trial[maxtrialindex]>=limit){init(maxtrialindex);}}double calculateFunction(double sol[]){return Rastrigin (sol);}double Rastrigin(double sol[]){int j;double top=0;for(j=0;j<D;j++){top=top+(Math.pow(sol[j],(double)2)-10*Math.cos(2*Math.PI*sol[j])+10);}return top;}public static void main(String[] args) {bee bee=new bee();int iter=0;int j=0;bee.initial();      /*初始化所有食物源 */bee.MemorizeBestSource();       /*记录最优解*/for (iter=0;iter<bee.maxCycle;iter++){bee.SendEmployedBees();     /*雇佣蜂阶段*/bee.CalculateProbabilities();       /*计算食物源适应度*/bee.SendOnlookerBees();     /*观察蜂阶段*/bee.MemorizeBestSource();       /*记录最优解*/bee.SendScoutBees();        /*侦查蜂阶段*/}for(j=0;j<bee.D;j++)        /*循环打印10个最优解的参数*/{System.out.println("最优解的参数GlobalParam["+(j+1)+"]:"+bee.GlobalParams[j]);}System.out.println("最优解为:"+bee.GlobalMin);      /*打印每次运行的最优解*/}
}

运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380940.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

暴强:用iOS设备控制的HTML5“小蜜蜂”游戏

摘要&#xff1a;红白机上的经典“小蜜蜂”游戏在HTML5技术下得到了革新&#xff1a;英国伦敦的Webdigi公司运用HTML5结合Node.js进行开发&#xff0c;扫描二维码使得游戏在PC浏览器中显示&#xff0c;玩家通过左右摇晃iPhone/iPad控制飞船&#xff0c;向小蜜蜂发起攻击。 近日…

【Android】Android外接音源设备之小蜜蜂坑

在开发直播APP时&#xff0c;有用到小蜜蜂外接音源&#xff0c;总是会存在声音噪音很大或者很多手机声音很小的问题&#xff1a; 适配的几个手机都测试了&#xff0c;总是得不到解决方案&#xff0c;因为在外接小蜜蜂MIC时&#xff0c;会用到转接线 最开始考虑的是否转接线存在…

Meefeng蜜蜂系统——手机应用营销工具

最新媒体是什么&#xff1f; Meefeng是什么&#xff1f; Meefeng三大商业价值是什么&#xff1f; Meefeng优势是什么&#xff1f; Meefeng实现价值全过程是什么&#xff1f; Meefeng案例有什么、适合那些行业&#xff1f;&#xff1f;&#xff1f; Meefeng解答以上问题&a…

蜜蜂

蜜蜂的数感&#xff08;蜜蜂知道0比1要小&#xff09; 2018/6/8th Sicence上的论文&#xff0c;原文链接 像蜜蜂这样的昆虫是否能有数字“0”的概念呢&#xff1f;于是实验人员做了一个实验来测试。基本方式是训练蜜蜂知道“大于”还是“小于”规则&#xff08;跟普通Transitiv…

密蜂路线

题目&#xff1a; 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你&#xff1a;蜜蜂从蜂房M开始爬到蜂房N&#xff0c;M<N&#xff0c;有多少种爬行路线&#xff1f; Input 输入M&#xff0c;N的值。 Output 爬行有多少种路线。…

Python(八十)字符串的常用操作——字符串的劈分

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

(三十五)ArcMap创建最小边界几何

ArcMap数据管理——创建最小边界几何 目录 ArcMap数据管理——创建最小边界几何1.概念2.插图3.几何类型4.组选项(可选)5.将几何特征作为属性添加输出中 (可选)1.概念 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 2.插图 输出最…

Object C实现三国英雄对战

Object C实现三国英雄对战 实验要求游戏介绍英雄机制对战机制 英雄介绍蜀国英雄吴国英雄魏国英雄群雄 代码实现数据隐秘性封装继承多态 实验结果游戏源码 实验要求 输出随机选择的英雄及其关键属性&#xff0c;输出单挑中每回合的过程、结果&#xff0c;以及最终胜负结果输出程…

DTF:预测抗癌药物协同作用的深度张量分解

DTF: Deep Tensor Factorization for predicting anticancer drug synergy 摘要1 介绍2 材料与方法2.1 数据采集和预处理2.2 DTF:深张量因式分解2.2.1 符号2.2.2 张量分解算法2.2.3 CP-WOPT2.2.4 深度神经网络2.2.5 特征工程2.2.6 模型构建 2.3 模型与比较评价CP-WOPT基准分类器…

元宇宙需要“基建狂魔”

当互联网行业从先进生产力的象征&#xff0c;逐渐成为带有原罪的资本力量时&#xff0c;元宇宙作为这个行业的元叙事&#xff0c;变成了万能药&#xff0c;能解一切忧愁。 荔枝说自己是“声音元宇宙”&#xff0c;Soul 说自己是“年轻人社交元宇宙”&#xff0c;Facebook 现在…

牛逼|珍藏多年的工具让我实现了带薪摸鱼自由

文 | 豆豆 来源&#xff1a;Python 技术「ID: pythonall」 资本是噬血的&#xff0c;因此打工人最有效的抵抗资本的方法就是上班划水&#xff0c;带薪摸鱼&#xff0c;但前提是你要先搞完自己手上的工作才行&#xff0c;今天就给大家推荐几款我常用的在线工具&#xff0c;每一款…

岂有此理? 珍藏多年的工具让我实现了带薪摸鱼自由

资本是噬血的&#xff0c;因此打工人最有效的抵抗资本的方法就是上班划水&#xff0c;带薪摸鱼&#xff0c;但前提是你要先搞完自己手上的工作才行&#xff0c;今天就给大家推荐几款我常用的在线工具&#xff0c;每一款都能让你提高不少工作效率。 drawio (https://jq.qq.com/…

基于ipad协议的gewe框架进行微信群组管理(二)

友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示&#xff1a; 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL&#xff1a; http://域名地址/api/group/detail 请求方式&#xff1a; POST 请求头&#xff1a; Content-Type&#xff1a;applica…

如何打开计算机控制界面,如何打开控制面板 【使用途径】

大家都知道电脑使用起来非常方便,但遇见如何打开控制面板 的时候就非常头疼了,如果你是第一次遇到如何打开控制面板 ,怎么样才能快速解决如何打开控制面板 带来的烦恼呢?小编为大家收集了很多关于如何打开控制面板 问题的解决方法,下面请看具体的解决方法步骤: 电脑的控制…

【JAVA基础】- BIO介绍及其使用

【JAVA基础】- BIO介绍及其使用 文章目录 【JAVA基础】- BIO介绍及其使用一、BIO概述二、BIO工作机制客户端服务端 三、同步阻塞步骤四、编码实现传统BIO服务端代码客户端代码总结 五、BIO编程现实多发多收服务端代码客户端代码 六、BIO模拟客户端服务端多对一实现步骤服务端实…

39、传输层的任务和协议

从本节内容开始&#xff0c;我们学习TCP/IP模型的传输层的知识。传输层是TCP/IP模型中的重要组成部分&#xff0c;如果没有传输层的处理&#xff0c;那么源主机发送的IP数据包到达目的主机之后&#xff0c;目的主机将不知道这个数据是哪个应用程序的数据&#xff0c;就不能很好…

央行、外管局、银行业协会牵头银行区块链联盟,三驾马车齐攻国际金融市场...

文丨互链脉搏黑珍珠号 未经授权&#xff0c;不得转载! 11月20日&#xff0c;恒生电子股份有限公司官方消息&#xff0c;恒生电子区块链运营总监任珊日前表示&#xff0c;由中国银行业协会牵头&#xff0c;11家头部银行以及4家科技公司共同参与的“中国贸易金融跨行交易区块链平…

CDA数据分析师高级师资研修班在重庆仙桃大数据学院顺利开班

7月22日&#xff0c;由CDA数据分析(成都)研究院、重庆仙桃大数据学院联合筹备及招生的“CDA数据分析师高级师资研修班”在重庆仙桃大数据学院顺利开班。 本次培训由CDA数据分析(成都)研究院副院长、中科院博士、电子科技大学博士后卢宇老师主讲。分别从大数据系统架构、数据的导…

阿里巴巴区签约重庆,这些合作亮点你不得不知!

&#xff08;原文标题&#xff1a;刚刚&#xff0c;阿里巴巴区域中心落地&#xff01;马云来重庆要干这些大事情&#xff01;&#xff09; 马云携团队来重庆了&#xff0c;背后隐藏着大信息&#xff01;显然是要干大事情&#xff01; 就在刚刚&#xff0c;重庆市政府与阿里巴巴…

首批49个国家绿色数据中心名单公布

导读 工业和信息化部、国家机关事务管理局、国家能源局等三部门日前联合公告第一批国家绿色数据中心名单&#xff0c;世纪互联M6数据中心等49个数据中心榜上有名。 工 业 和 信 息 化 部 国 家 机 关 事 务 管 理 局 国  家  能  源  局 公  告 2018年…