ABC人工蜂群算法C++

  • 人工蜂群算法
    • 1、原理
    • 2、算法流程
    • 3、函数优化实例
    • 4、求解函数优化的ABC源代码C++

人工蜂群算法

1、原理

最常见的基于蜜蜂采蜜行为的蜂群算法是Karaboga(2005)提出的人工蜂群算法,通常称该算法为标准(或原始)人工蜂群算法,其主要是为了解决多维和多模的函数优化问题。
        标准的人工蜂群算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为三类:雇佣蜂、观察蜂和侦察蜂。整个蜂群的目标是寻找花蜜量最大的蜜源。在标准的ABC算法中,雇佣蜂利用先前的蜜源信息寻找新的蜜源并与跟随蜂分享蜜源信息;观察蜂在蜂房中等待并依据雇佣蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近地寻找蜜源。
        算法主要包括以下四个部分。
        (1)蜜源初始化:初始化时,随机生成SNSNSN个可行解(等于雇佣蜂的数量)并计算适应度函数值。随机产生可行解的公式为xij=xmin,j+rand(0,1)(xmax,j−xmin,j)x_{ij}=x_{min,j}+rand(0,1)(x_{max,j}-x_{min,j)}xij​=xmin,j​+rand(0,1)(xmax,j​−xmin,j)​其中,xix_ixi​(i=1,2,…,SN)表示DDD维向量,DDD表示优化参数的个数;j∈1,2,...,Dj∈{1,2,...,D}j∈1,2,...,D。
        (2)新蜜源的更新搜索:蜜蜂记录自己到目前为止的最优值,并在当前蜜源邻域内展开搜索,基本ABC在蜜源附近搜索新蜜源的公式为vij=xij+φij(xij−xkj)v_{ij}=x_{ij}+φ_{ij}(x_{ij}-x_{kj})vij​=xij​+φij​(xij​−xkj​)其中,j∈1,2,...,Dj∈{1,2,...,D}j∈1,2,...,D,k∈1,2,...,SNk∈{1,2,...,SN}k∈1,2,...,SN,kkk表示随机生成且k≠ik≠ik​=i;φφφ表示[-1,1]的随机数。
        (3)观察蜂选择蜜源的概率为Pi=fit(xi)∑n=1SNfit(xn)P_i=\frac{fit(x_i)}{\sum_{n=1}^{SN}fit(x_n)}Pi​=∑n=1SN​fit(xn​)fit(xi​)​其中,fit(xi)fit(x_i)fit(xi​)表示第iii个解的适应度,对应蜜源的丰富程度。蜜源越丰富,被跟随蜂选择的概率越大,按以下式子计算适应度:fit(xi)={11+fi,fi>01+abs(fi)fi<0fit(x_i) = \begin{cases} \frac{1}{1+f_i}, & \text{$f_i>0$} \\[2ex] 1+abs(f_i) & \text{$f_i<0$} \\ \end{cases} fit(xi​)=⎩⎨⎧​1+fi​1​,1+abs(fi​)​fi​>0fi​<0​其中,fif_ifi​是蜜源的适应值。

(4)侦察蜂的产生:为防止算法陷入局部最优,当某蜜源迭代limitlimitlimit次没有改进时,便放弃该蜜源,并且将该蜜源记录在禁忌表中,同时该蜜源对应的雇佣蜂转变为侦察蜂,随机产生一个新的位置代替原蜜源。
        人工蜂群算法就是通过不断地角色转换和执行行为模式,最终找到最丰富食物源。在人工蜂群算法中,雇佣蜂有保持优良食物源的作用,具有精英特性;跟随蜂增加较好食物源对应的蜜蜂数,加快算法的收敛;侦察蜂随机搜索新食物源,帮助算法跳出局部最优。

2、算法流程

人工蜂群算法的算法流程如下:
        步骤1:根据第一个式子初始化种群解xi,i=1,...,SNx_i,i=1,...,SNxi​,i=1,...,SN
        步骤2:计算种群中各个蜜蜂的适应值
        步骤3:cycle=1
        步骤4:repeat
        步骤5:雇佣蜂根据第二个式子产生新的解viv_ivi​并计算适应值
        步骤6:雇佣蜂根据贪心策略选择蜜源
        步骤7:根据第三个式子计算选择蜜源xix_ixi​的概率PiP_iPi​
        步骤8:跟随蜂根据概率PiP_iPi​选择蜜源xix_ixi​,根据第二个式子在该蜜源附近产生新的蜜源viv_ivi​,并计算新蜜源viv_ivi​的适应值
        步骤9:跟随蜂根据贪心策略选择蜜源
        步骤10:决定是否存在需要放弃的蜜源,如果存在,根据第一个式子随机产生一个蜜源替代它
        步骤11:记录最优解
        步骤12:cycle=cycle+1
        步骤13:until cycle = MCN ,MCN表示终止代数。

3、函数优化实例

minf(x1,x2)=0.5+sin2x12+x22−0.5(1+0.001(x12+x22))2minf(x_1,x_2)=0.5+ \frac{{sin}^2 \sqrt{x_1^2+x_2^2 }-0.5}{{(1+0.001(x_1^2+x_2^2))}^2}minf(x1​,x2​)=0.5+(1+0.001(x12​+x22​))2sin2x12​+x22​​−0.5​
其中,−100≤x1,x2≤100(i=1,2,...,30)-100≤x_1,x_2≤100 (i=1,2,...,30)−100≤x1​,x2​≤100(i=1,2,...,30)

MATLAB绘制上述函数图像代码如下:

X=-100:4:100;
Y=-100:4:100;
[XX,YY]=meshgrid(X,Y);
Z=0.5+(power(sin(sqrt(XX.*XX+YY.*YY)),2)-0.5)./power(1+0.001.*power(XX.*XX+YY.*YY,2),2);
figure
subplot(221)
mesh(X,Y,Z)
subplot(222)
surf(X,Y,Z)
subplot(223)
surfc(X,Y,Z)
subplot(224)
surfl(X,Y,Z)
shading interp;
colormap(gray);

4、求解函数优化的ABC源代码C++

人工蜂群算法中输入参数:
        蜜源数量SN=20SN = 20SN=20
        解向量的维数Dimension=2Dimension=2Dimension=2
        最大循环次数MCN=10000MCN=10000MCN=10000
        蜜源没改进的最大次数limit=20limit=20limit=20
main.cpp

#include <iostream>
#include <random>
#include <time.h>
using namespace std;
double Xmax = 100, Xmin = -100;
std::default_random_engine random((unsigned int)time(NULL));
std::uniform_real_distribution<double> u(Xmin, Xmax); //随机数分布对象
std::uniform_real_distribution<double> u0(0, 1); //随机数分布对象
std::uniform_real_distribution<double> u1(-1, 1); //随机数分布对象struct Bee
{public:int dimension;//变量的维数double *X;//蜜蜂double fitdegreevalue = 0;double selectprobability = 0;int limitcishu = 0;void Init(int Dimension)//初始化函数{dimension = Dimension;X = new double[dimension];for (int j = 0; j < dimension; j++)*(X + j) = u(random);}
};
struct BeeQun
{public:Bee *miyuan, bestmiyuan, *employedbee, *onlookerbee;//蜜源、最好蜜源、雇佣蜂、观察蜂int SN;//雇佣蜂的数量、蜜源的数量、观察蜂的数量相等int Dimension;//可行解的维数int MCN;//终止代数int Limit;//为防止算法陷入局部最优,蜜源最大改进次数void Init(int sn, int dimension, int mcn, int limit){SN = sn;Dimension = dimension;MCN = mcn;Limit = limit;miyuan = new Bee[SN];employedbee = new Bee[SN];onlookerbee = new Bee[SN];for (int i = 0; i < SN; i++)//蜜源、雇佣峰、观察蜂初始化:随机产生SN个可行解,并计算适应度函数值{(miyuan + i)->Init(Dimension);double beefunvalue = CalculateFitValue(*(miyuan + i));(miyuan + i)->fitdegreevalue = CalculateFitDegree(beefunvalue);(employedbee + i)->Init(Dimension);double employedbeefunvalue = CalculateFitValue(*(employedbee + i));(employedbee + i)->fitdegreevalue = CalculateFitDegree(employedbeefunvalue);(onlookerbee + i)->Init(Dimension);double onlookerbeefunvalue = CalculateFitValue(*(onlookerbee + i));(onlookerbee + i)->fitdegreevalue = CalculateFitDegree(onlookerbeefunvalue);}bestmiyuan.Init(Dimension);//最好蜜源初始化for (int j = 0; j < Dimension; j++){bestmiyuan.X[j] = miyuan->X[j];}bestmiyuan.fitdegreevalue = miyuan->fitdegreevalue;}double CalculateFitValue(Bee be)//计算蜜蜂的目标函数值{double funvalue = 0;for (int j = 0; j < Dimension; j++)funvalue += be.X[j] * be.X[j];funvalue = 0.5 + (pow(sin(sqrt(funvalue)), 2) - 0.5) / pow((1 + 0.001*funvalue), 2);return funvalue;}double CalculateFitDegree(double fi)//由目标函数值计算适应度{double fitnessdu = 0;if (fi > 0) fitnessdu = 1.0 / (1 + fi);else fitnessdu = 1.0 + abs(fi);return fitnessdu;}void EmployedBeeOperate()//雇佣蜂操作函数{std::uniform_int_distribution<int> uD(1, Dimension); //随机数分布对象std::uniform_int_distribution<int> uSN(1, SN); //随机数分布对象for (int i = 0; i < SN; i++){for (int j = 0; j < Dimension; j++)//雇佣峰利用先前的蜜源信息寻找新的蜜源{(employedbee + i)->X[j] = (miyuan + i)->X[j];}int k, jie;//随机生成且 k≠i k∈[1,SN]jie = uD(random) - 1;//jie为【1,Dimension】上的随机数double φ = u1(random);//φ表示[-1,1]之间的随机数while (true){k = uSN(random) - 1;if (k != i)break;}(employedbee + i)->X[jie] = (miyuan + i)->X[jie] + φ*((miyuan + i)->X[jie] - (miyuan + k)->X[jie]);//搜索新蜜源//保证蜜源位置不越界if ((employedbee + i)->X[jie] > Xmax) (employedbee + i)->X[jie] = Xmax;else if ((employedbee + i)->X[jie] < Xmin) (employedbee + i)->X[jie] = Xmin;(employedbee + i)->fitdegreevalue = CalculateFitDegree(CalculateFitValue(*(employedbee + i)));//计算适应值//雇佣蜂根据贪心策略选择蜜源if (CalculateFitValue(*(employedbee + i)) < CalculateFitValue(*(miyuan + i))){for (int j = 0; j < Dimension; j++)(miyuan + i)->X[j] = (employedbee + i)->X[j];(miyuan + i)->limitcishu = 0;(miyuan + i)->fitdegreevalue = (employedbee + i)->fitdegreevalue;}else(miyuan + i)->limitcishu++;//蜜源未改进次数加一}}void CalculateProbability()//计算蜜源概率的函数{for (int i = 0; i < SN; i++){(miyuan + i)->fitdegreevalue = CalculateFitDegree(CalculateFitValue(*(miyuan + i)));}double sumfitdegreevalue = 0;for (int i = 0; i < SN; i++){sumfitdegreevalue += (miyuan + i)->fitdegreevalue;}for (int i = 0; i < SN; i++){(miyuan + i)->selectprobability = (miyuan + i)->fitdegreevalue / sumfitdegreevalue;}}void OnLookerBeeOperate()//观察蜂操作{std::uniform_int_distribution<int> uD(1, Dimension); //随机数分布对象std::uniform_int_distribution<int> uSN(1, SN); //随机数分布对象int m = 0;while (m < SN)//为所有的观察蜂按照概率选择蜜源并搜索新蜜源,计算新蜜源适应值{double m_choosedprobability = u0(random);//0~1之间的随机数for (int i = 0; i < SN; i++){if (m_choosedprobability < (miyuan + i)->selectprobability){int k, jie;//随机生成且 k≠i k∈[1,SN]jie = uD(random) - 1;//jie为【1,Dimension】上的随机数double φ = u1(random);//φ表示[-1,1]之间的随机数while (true){k = uSN(random) - 1;if (k != i)break;}for (int j = 0; j < Dimension; j++)(onlookerbee + m)->X[j] = (miyuan + i)->X[j];(onlookerbee + m)->X[jie] = (miyuan + i)->X[jie] + φ*((miyuan + i)->X[jie] - (miyuan + k)->X[jie]);//搜索新蜜源if ((onlookerbee + m)->X[jie] > Xmax) (onlookerbee + m)->X[jie] = Xmax;else if ((onlookerbee + m)->X[jie] < Xmin) (onlookerbee + m)->X[jie] = Xmin;//判断是否越界(onlookerbee + m)->fitdegreevalue = CalculateFitDegree(CalculateFitValue(*(onlookerbee + m)));//贪心策略选择蜜源if (CalculateFitValue(*(onlookerbee + m)) < CalculateFitValue(*(miyuan + i))){for (int j = 0; j < Dimension; j++)(miyuan + i)->X[j] = (onlookerbee + m)->X[j];(miyuan + i)->fitdegreevalue = (onlookerbee + m)->fitdegreevalue;}else(miyuan + i)->limitcishu++;m++;}break;}}}void ScoutBeeOperate()//侦查蜂操作,决定蜜源是否放弃,并随机产生新位置替代原蜜源{for (int i = 0; i < SN; i++){if ((miyuan + i)->limitcishu >= Limit){for (int j = 0; j < Dimension; j++){(miyuan + i)->X[j] = u(random);//随机产生可行解}(miyuan + i)->limitcishu = 0;(miyuan + i)->fitdegreevalue = CalculateFitDegree(CalculateFitValue(*(miyuan + i)));}}}void SaveBestMiyuan()//记录最优解的函数{for (int i = 0; i < SN; i++){if (CalculateFitValue(*(miyuan + i)) < CalculateFitValue(bestmiyuan)){for (int j = 0; j < Dimension; j++)bestmiyuan.X[j] = (miyuan + i)->X[j];}}}void shuchumiyuan(){for (int i = 0; i<SN; i++)for (int j = 0; j < Dimension; j++){if (j == Dimension - 1)std::cout << (miyuan + i)->X[j] << endl;else std::cout << (miyuan + i)->X[j] << ", ";}}void ShuchuBestmiyuan(){for (int j = 0; j < Dimension; j++){if (j == Dimension - 1) std::cout << bestmiyuan.X[j] << ")" << "对应的函数值为:" << CalculateFitValue(bestmiyuan) << endl;else if (j == 0) std::cout << "(" << bestmiyuan.X[j] << ",";else std::cout << bestmiyuan.X[j] << ",";}}void DoABC(int sn, int dimension, int mcn, int limit)//运行人工蜂群算法的函数{Init(sn, dimension, mcn, limit);//初始化shuchumiyuan();SaveBestMiyuan();//保存最好蜜源for (int k = 0; k < MCN; k++){EmployedBeeOperate();CalculateProbability();OnLookerBeeOperate();SaveBestMiyuan();ScoutBeeOperate();SaveBestMiyuan();std::cout << "第" << k + 1 << "次迭代的最优解为:";ShuchuBestmiyuan();}}
};
int main()
{int itetime = 0;while (true){std::cout << "请输入迭代次数:";std::cin >> itetime;BeeQun bq;bq.DoABC(20, 2, itetime, 20);}system("pause");return 0;
}

运行结果:

ABC人工蜂群算法求解函数优化实例C++(2020.11.5)相关推荐

  1. 人工蜂群算法求解TSP旅行商问题C++(2020.11.13)

    ABC算法求解TSP问题的C++实现 1.输入数据文件:bayg29.tsp 2.头文件 3.所需的类 3.1 城市类City 3.2 包含城市的地图类Graph 3.3 蜜蜂类Bee 3.4 人工蜂 ...

  2. matlab基于人工蜂群算法的函数优化分析【matlab优化算法十一】

    基于人工蜂群算法的函数优化分析 自然界中的群居昆虫,它们虽然个体结构简单,但是通过个体间的合作却能够表现出极其复杂的行为能力.受这些社会性昆虫群体行为的启发,研宄者通过模拟这些群体的行为提出了群集智能 ...

  3. MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例

    MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例 MATLAB人工蜂群算法求解数据拟合和多参数优化问题代码实例 1.基本概念 人工蜂群算法是模仿蜜蜂行为提出的一种优化方法,是集群智能思想的 ...

  4. MATLAB人工蜂群算法求解超市物流配送选址问题代码实例

    MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 人工蜂群算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域内,散布 ...

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

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

  6. 【智能优化算法】基于人工蜂群算法求解多目标优化问题附matlab代码

    1 简介 人工蜂群算法(Artificial Bee Colony Algorithm, 简称ABC算法)是一个由蜂群行为启发的算法,在2005年由Karaboga小组为优化代数问题而提出.​ 2 部 ...

  7. 人工蜂群算法python_教程 | 用人工蜂群算法求解k-分区聚类问题

    原标题:教程 | 用人工蜂群算法求解k-分区聚类问题 选自towarddatascience 作者:Pedro Buarque 参与:Pedro.刘晓坤 群体智能算法是一类受生物群体智能行为的启发而发 ...

  8. 人工蜂群算法求解TSP问题

    人工蜂群算法求解TSP问题 [标签] ABC TSP Matlab data:2018-10-19 author:怡宝2号 [总起]利用人工蜂群算法(Artificial Bee Colony Alg ...

  9. 【路径规划-VRP问题】基于人工蜂群算法求解双层2E-VRP问题matlab代码

    1 简介 本文利用人工蜂群算法求解带载重量限制的车辆路径问题(Capacitated vehicle routing problem, CVRP)和双层车辆路径问题(2E-VRP).CVRP是传统的单 ...

最新文章

  1. 小说形象特征包括哪些方面_中高考常考题:怎样鉴赏散文中的形象 ?
  2. Cocos2d x 2 0 从HelloWorld入手
  3. char 转换 二进制 java_使用Java读取二进制文件并将其转换为char文件 - java
  4. linux替换字符串 正则,Linux 字符串操作-裁剪和正则替换
  5. xci转化nsp_4nxci软件下载[xci游戏转nsp格式工具]v2.10-k73游戏之家
  6. wps页眉怎么设置不同页码_wps版word怎么从第二页设置页眉页脚
  7. GIS应用技巧之去除遥感影像黑边
  8. 2020香港公司开户的一些个人见解?香港银行开户免踩坑。
  9. arcgis 导入Excel 处理 点线 数据关系
  10. 泛在操作系统功能特点
  11. Bat文件批量处理----DOS命令
  12. Docker启动MySql容器Exited (1) 7 seconds ago问题解决
  13. 学计算机买什么英语字典,我是一名英语初学者,我想买一本字典该买什么样的呢...
  14. Django startapp
  15. 基于I.MX6UL平台的WIFI模块AP6214A 驱动移植
  16. 对于运维工程师岗位职责有哪些
  17. “求职路”上英语口语面试问答大全收藏
  18. vscode国际化插件i18n Ally配置
  19. Ubuntu 10.04里安装强大抓图工具Shutter
  20. 基于 YOLO 的车牌检测与识别

热门文章

  1. wm8960驱动:裸机代码研读
  2. am335x+wm8960音频基于linux 4.9.41移植
  3. 随着日益增多的新技术,如何正确的提升自己?
  4. 钉钉接口报错java.net.UnknownHostException: oapi.dingtalk.com_无法访问oapi.dingtalk.com
  5. 仿微信、QQ聊天页面软键盘遮挡聊天对话的解决办法
  6. Camera:高斯模糊
  7. 【NOIP2013初赛】整除
  8. 微型计算机控制系统设计方法,第3章 机电一体化中微型计算机控制系统及接口设计...
  9. 如何在 Matlab 中启用 UTF-8 编码
  10. FreeModbus开源协议简介