优化算法——人工蜂群算法(ABC)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

优化算法——人工蜂群算法(ABC)

一、人工蜂群算法的介绍

手机微信关注公众号ID:datadw 学习数据挖掘,研究大数据,关注你想了解的,分享你需要的。人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。

二、人工蜂群算法的原理

1、原理

标准的ABC算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为3类: 采蜜蜂、观察蜂和侦察蜂。整个蜂群的目标是寻找花蜜量最大的蜜源。在标准的ABC算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源。

假设问题的解空间是维的,采蜜蜂与观察蜂的个数都是,采蜜蜂的个数或观察蜂的个数与蜜源的数量相等。则标准的ABC

算法将优化问题的求解过程看成是在维搜索空间中进行搜索。每个蜜源的位置代表问题的一个可能解,蜜源的花蜜量对应于相应的解的适应

度。一个采蜜蜂与一个蜜源是相对应的。与第个蜜源相对应的采蜜蜂依据如下公式寻找新的蜜源:

其中,,,是区间上的随机数,

。标准的ABC算法将新生成的可能解与原来的解作比较,并采用贪婪选择策略保留较好的解。每一个观察蜂依据概率选择一个蜜源,概率公式为

其中,是可能解的适应值。对于被选择的蜜源,观察蜂根据上面概率公式搜寻新的可能解。当所有的采蜜蜂和观察蜂都搜索完整个搜索空间时,如果一个蜜源的适应值在给定的步骤内(定义为控制参数“limit”) 没有被提高, 则丢弃该蜜源,而与该蜜源相对应的采蜜蜂变成侦查蜂,侦查蜂通过已下公式搜索新的可能解。

其中,是区间上的随机数,和是第维的下界和上界。

2、流程

∙初始化;

∙重复以下过程:

o将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量;

o观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜源的花

蜜量;

o确定侦查蜂,并根据第三个公式寻找新的蜜源;

o记忆迄今为止最好的蜜源;

判断终止条件是否成立;

三、人工蜂群算法用于求解函数优化问题

对于函数

其中。

代码:

[cpp]view plaincopy

1.#include

2.#include

3.#include

4.#include

5.#include

6.#include

ing 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

62. {

相关文档
最新文档