优化算法——人工蜂群算法(ABC)
- 格式:doc
- 大小:245.76 KB
- 文档页数:12
分析Technology AnalysisI G I T C W 技术118DIGITCW2020.070 引言人工蜂群算法(ABC )是仿照蜜蜂的采蜜过程提出的仿生智能算法,Karaboga 在2005年首次提出了这个概念,主要目的是解决函数优化的相关问题,蜂群算法充分体现了群体智能思想,利用单只蜜蜂具有的局部寻优能力,从而让全局最优在整个群体里快速的凸显出来,该算法不仅具有良好的全局收敛性能,而且具有算法简单,适用范围广的特点。
许多专家学者对此予以关注,并成为计算机领域的重点研究的智能算法。
目前,人工蜂群算法可应用在函数优化问题、作业调度、路径及参数选择等工程领域,均取得了良好的效果。
然而,蜂群算法采用的群体进化搜索策略以及基于轮盘赌概率的适应度选择方式,容易使算法产生局部最优解,而无法快速搜寻到全局最优解。
而且算法在迭代过程中,邻域搜索策略的不同也会影响算法的收敛性能,本文提出新的改进蜂群算法,通过改进领域搜索策略,提高智能算法的全局寻优能力。
1 人工蜂群算法群体智能算法(SIA )是一种智能算法,旨在模仿社会生物种群的行为。
它是随着现代化AI 行业的迅速成长而产生的一种较为新颖的计算智能模型。
SIA 根据生物群体的个体间相互配合、共同协作的一系列行为从而构建行为规则模型,并根据模型中的行为规则演算出群体智能算法。
人工蜂群算法也是属于这类算法。
蜂群算法是一种基于蜂群智能的优化算法。
它模拟蜂群根据各自的分工来收集不同的蜂蜜,并交换蜂蜜来源的信息以找到最佳的蜂蜜来源。
蜂群通过舞蹈进行消息传递,确定局部区域最佳蜜源的正确位置,通过此种搜索方式调整正反馈机制,快速找寻全局区域的最佳蜜源位置。
ABC 算法一般由引领蜂和跟随蜂(观察蜂和侦查蜂)组成:一是引领蜂负责在局部区域搜索最佳蜜源,如果搜寻过程中发现花蜜质量较好的蜜源,引领蜂通过舞蹈的方式将蜜源的相关信息传递给后面的跟随蜂,并继续搜寻蜜源,如若发现新的蜜源比之前的蜜源质量较好,则马上将新的蜜源信息传递给跟随蜂。
一种改进的人工蜂群算法研究人工蜂群算法(Artificial Bee Colony,ABC)是一种优化算法,灵感来自于蜜蜂的觅食行为。
它模拟了蜜蜂的觅食过程,通过不断更新搜索空间中的位置来寻找最优解。
虽然ABC算法在很多问题中表现出了良好的性能,但它也存在一些不足之处,比如易陷入局部最优解、收敛速度慢等问题。
为了解决这些问题,研究者们对ABC算法进行了一系列的改进。
一种常见的改进方法是引入局部搜索策略。
传统的ABC算法只有蜜蜂在搜索空间中随机选择位置的能力,这容易导致搜索陷入局部最优解。
改进的ABC算法在蜜蜂搜索过程中引入了局部搜索策略,使蜜蜂能够在当前最优位置的附近进行局部搜索。
这样既能提高搜索的多样性,又能避免陷入局部最优解。
另一种改进方法是引入自适应机制。
传统的ABC算法使用固定的参数和运行策略,无法适应不同问题的特点。
改进的ABC算法通过引入自适应机制,使算法能够根据问题的性质和难度自动调整参数和运行策略,以提高搜索效率和性能。
还有一种改进方法是引入多种搜索策略。
传统的ABC算法只有一种搜索策略,这限制了算法的搜索能力。
改进的ABC算法引入了多种不同的搜索策略,使蜜蜂能够根据不同的情况选择合适的搜索策略。
这样能够提高算法的搜索能力和收敛速度。
还有一些其他改进的ABC算法,比如改进的初始化策略、改进的更新策略等。
这些改进方法可以根据具体问题进行选择和组合,以提高算法的性能。
人工蜂群算法在不断被研究和改进的过程中正不断展现出更强大的搜索能力和优化性能。
随着对ABC算法的深入研究,相信会有更多有效的改进方法被提出,并在实际问题中得到应用。
⼈⼯蜂群算法算法背景⼈⼯蜂群算法 (Artificial Bee Colony, ABC) 是由 Karaboga 于 2005 年提出的⼀种新颖的基于集群智能的全局优化算法,其直观背景来源于蜂群的采蜜⾏为。
它的主要特点是不需要了解问题的特殊信息,只需要对问题进⾏优劣的⽐较,通过各⼈⼯蜂个体的局部寻优⾏为,最终在群体中使全局最优值突现出来,有着较快的收敛速度。
蜜蜂是⼀种群居昆⾍,虽然单个昆⾍的⾏为极其简单,但是由单个简单的个体所组成的群体却表现出极其复杂的⾏为。
真实的蜜蜂种群能够在任何环境下,以极⾼的效率从⾷物源(花朵)中采集花蜜;同时,它们能适应环境的改变。
搜索流程算法的调⽤过程如下:初始化所有蜜源记录最优蜜源while:雇佣蜂对所有蜜源进⾏邻域搜索(避免饥饿效应)计算轮盘度,判断蜜源质量观察蜂对优质蜜源进⾏邻域搜索(加速算法收敛)记录最优蜜源侦查蜂放弃枯竭蜜源进⾏全局搜索(跳出局部最优)记录最优蜜源end其中雇佣蜂和观察蜂有着相似的逻辑,特别在对指定蜜源进⾏邻域搜索时,两者的逻辑是完全的⼀样的:1. 基于原有蜜源进⾏邻域突变2. 保证邻域突变的有效性3. 若为优质突变,则进⾏蜜源替换4. 若为劣质突变,则进⾏蜜源开采但是算法的设计者们却特意区分出两种不同的逻辑,其原因可以从实现代码中看出。
在进⾏领域搜索时,对指定蜜源的选择和限定是关键所在,它暗⽰了雇佣蜂和观察蜂的区别以及承担的不同⾓⾊。
⾸先对于雇佣蜂的⾓⾊,其指定蜜源的⽅式简单粗暴,对每⼀个蜜源进⾏遍历指定。
通过这种⽅式进⾏邻域搜索,是建⽴整个算法的基础核⼼。
⽽对于观察蜂⾓⾊,它是根据轮盘赌策略进⾏蜜源的指定,也就是说,蜜源越是优质,其被指定的、被进⾏领域搜索的概率就越⾼。
通过这种正向反馈的过程,加速了整个算法的收敛性,可以帮助我们在多个局部中快速找到最优解。
如此看来观察蜂似乎是雇佣蜂的进化版,观察蜂似乎可以完全替代雇佣蜂?其实不然。
观察蜂⾓⾊在进⾏快速收敛、对优质蜜源进⾏了较多照顾的同时,劣质的蜜源可能会被忽略,从⽽产⽣饥饿效应。
一种改进的人工蜂群算法研究人工蜂群算法(Artificial Bee Colony Algorithm,简称ABC算法)是一种优化算法,其灵感来自于蜜蜂群体搜索技能。
这种算法涉及三种不同类型的蜜蜂:工蜂、侦查蜂和观察蜂。
在传统的ABC算法中,每只工蜂都从当前位置开始搜索解空间。
如果当前位置的解更好,则它们将继续选择该空间进行搜索。
侦查蜂和观察蜂呈随机或随机游走状态进行搜索。
但是,以上这种方法存在一些缺陷,如易受陷入局部最优解和较慢的收敛速度等问题。
为了克服这些缺点,提出了一种改进的ABC算法。
下面将具体介绍该算法的特点和实现过程。
1. 多策略差分进化局部搜索在该算法中,引入了差分进化局部搜索策略。
在工蜂阶段中,将差分进化局部搜索策略应用于每个被选中的工蜂。
其中,每个选择的工蜂将产生两个随机解,并在其周围随机选择符合条件的解。
得到新的局部搜索解后,与本身位置进行比较,选择较优的解进行更新。
2. 动态死亡更新策略为了避免算法的过早收敛或陷入局部最优解,提出了一种动态死亡更新策略。
其主要思路是随机选择一定数量的蜜蜂(既包括工蜂,也包括侦查蜂)作为“死亡”个体,从而在种群中引入更多的多样性。
这会促使算法更好地探索解空间。
在每一次迭代的末尾,系统将根据蜜蜂的贡献程度来确定死亡个体。
这些贡献包括适应值和搜索次数等。
与适应度较低的个体相比,适应度较高的个体获得比例更高的生存几率,并得以更好地保持其性能。
3. 多阶段复制虫优化改进的ABC算法还引入了多阶段复制虫优化。
这种策略利用了生物多样性的概念,被用来优化蜜蜂个体间的信息交流。
当两个蜜蜂数值相似时,它们就会在局部解空间中进行复制。
这种策略能够提升搜索精度和加速收敛速度。
大多数情况下,局部搜索的结果会落入局部最优解中。
但是,采用这种策略可以探索更广泛的解空间,并优化概率分布。
同时,这个方法也有助于减少收敛时间。
综上所述,改进的ABC算法是一种能够在优化问题中取得较高性能的算法。
人工蜂群算法基本原理
人工蜂群算法(Artificial Bee Colony Algorithm,简称ABC算法)是一种模拟蜜蜂觅食行为的优化算法,通过模拟蜜蜂在搜索过程中的策略和行为来寻找最优解。
ABC算法的基本原理如下:
1. 初始化蜜蜂群体:随机生成一定数量的“雇员蜜蜂”,它们代表搜索空间中的候选解。
2. 雇佣阶段:每个雇员蜜蜂在当前位置周围随机选择一个相邻位置进行搜索,并计算该位置的目标函数值。
如果新的位置比当前位置更优,则蜜蜂将更新自己的位置和目标函数值,否则保持不变。
3. 观察阶段:每个雇员蜜蜂将自己的位置和目标函数值发送给“观察蜜蜂”,观察蜜蜂根据接收到的信息选择最优的解。
4. 搜索阶段:每个观察蜜蜂随机选择一个雇员蜜蜂的位置,并在其周围进行搜索。
如果搜索得到的新位置比当前位置更优,则观察蜜蜂更新自己的位置和目标函数值;否则保持不变。
5. 跟随阶段:每个观察蜜蜂将自己的位置和目标函数值发送给“跟随蜜蜂”,跟随蜜蜂选择最优的解作为当前最优解。
6. 蜜蜂进化阶段:随机选择一个雇员蜜蜂的位置,并随机扰动其位置。
如果扰动后的新位置比原位置更优,则更新雇员蜜蜂的位置和目标函数值。
这一步骤可以增强算法的局部搜索能力。
7. 终止条件检查:检查是否满足终止条件,如达到最大迭代次数或已经找到满意的解。
8. 返回最优解:返回当前找到的最优解作为算法的输出。
通过不断地重复以上步骤,ABC算法能够逐渐收敛到最优解附近的区域,并找到全局最优解。
其特点是简单、易于实现,并且对于大规模和复杂的优化问题有较好的适应性。
人工蜂群算法原理人工蜂群算法(Artificial Bee Colony Algorithm,ABC算法)是一种基于蜜蜂群体行为特点而产生的一种全局优化算法,由Dervis Karaboga于2005年首次提出。
该算法模拟了蜜蜂在搜索优秀食源时的行为,具有较强的全局搜索能力和快速收敛的特点,已广泛应用于各种优化问题的求解。
ABC算法的原理基于自然界中蜜蜂群体行为的特点,其核心思想主要包括三个方面:蜜蜂个体的行为模式、信息的传递方式和种群动态的调整机制。
下面将结合这三方面对ABC算法的原理进行详细说明。
1. 蜜蜂个体的行为模式在ABC算法中,蜜蜂的行为主要分为三类:工蜂、观察蜂和侦查蜂。
其中,工蜂主要负责搜索和开发蜜源,观察蜂则负责跟踪和评估不同工蜂发现的蜜源的质量,侦查蜂则负责在整个蜜蜂群体中搜索并发现新蜜源。
具体而言,ABC算法初始化时随机生成一定数量的工蜂群体,每个工蜂代表了一个解向量,即求解问题的一个可行解。
每个工蜂根据自身当前位置的解向量附近进行局部搜索,并且把搜索到的新解向量周围的解向量称为邻居。
在搜索过程中,每个工蜂会计算邻居解向量的适应度值,并将搜索到的更优质的解向量更新为自己的“蜜源”。
2. 信息的传递方式ABC算法中信息的传递主要是通过观察蜂完成的。
观察蜂会不断跟踪和评估工蜂发现的蜜源的质量,并将信息传递给其他工蜂和侦查蜂。
具体而言,在每次迭代中,每个观察蜂会从当前工蜂中随机选择一个进行“观察”,并比较其“蜜源”与其他工蜂的“蜜源”之间的优劣。
如果发现当前工蜂的蜜源更优秀,则该观察蜂就会将该工蜂的蜜源更新到自己的邻居解向量中。
此外,ABC算法还引入了“跟随”的概念,即当某个观察蜂发现一个更优质的解向量时,它会通过一定的概率将该解向量定位为自己的“蜜源”,并使所有的工蜂跟随其所对应的观察蜂进行搜索。
这样一来,整个蜜蜂群体就能够全局地搜索最优解。
3. 种群动态的调整机制ABC算法中种群动态的调整机制主要包括两种方式:工蜂群体的更新和侦查蜂的发现新蜜源。
《人工蜂群算法及其在语音识别中的应用研究》篇一一、引言随着科技的不断发展,人工智能、机器学习等领域的崛起,各种优化算法的应用日益广泛。
其中,人工蜂群算法(Artificial Bee Colony Algorithm,简称ABC算法)作为一种模拟自然界蜜蜂觅食行为的优化算法,近年来受到了广泛关注。
该算法以其强大的全局搜索能力和良好的鲁棒性在多个领域得到了应用。
本文将重点探讨人工蜂群算法的原理及其在语音识别领域的应用研究。
二、人工蜂群算法的原理人工蜂群算法是一种模拟蜜蜂觅食行为的优化算法,其基本思想是通过模拟蜜蜂的分工协作、信息共享等行为,实现全局寻优。
该算法主要包括三个部分:雇佣蜂、观察蜂和侦查蜂。
1. 雇佣蜂:负责搜索食物源,并将找到的食物源信息传递给观察蜂。
2. 观察蜂:根据雇佣蜂提供的信息,选择食物源进行进一步开发。
3. 侦查蜂:当食物源枯竭时,侦查蜂会寻找新的食物源。
在人工蜂群算法中,每个食物源都对应一个解,通过不断迭代搜索和开发,最终找到最优解。
该算法具有较强的全局搜索能力和鲁棒性,适用于解决复杂的优化问题。
三、人工蜂群算法在语音识别中的应用语音识别技术是人工智能领域的重要研究方向之一,其应用广泛。
将人工蜂群算法应用于语音识别中,可以提高语音识别的准确性和效率。
1. 特征提取:在语音识别中,特征提取是关键步骤之一。
人工蜂群算法可以通过全局搜索和优化,从语音信号中提取出有效的特征,为后续的语音识别提供支持。
2. 参数优化:语音识别系统的性能受到多种参数的影响,如声学模型参数、语言模型参数等。
人工蜂群算法可以通过优化这些参数,提高语音识别的准确性和鲁棒性。
3. 模型训练:在语音识别的模型训练过程中,需要调整模型的参数以使其适应不同的语音数据。
人工蜂群算法可以通过全局搜索和优化,找到最佳的模型参数,提高模型的训练效率和识别性能。
4. 噪声处理:在嘈杂的环境中,语音识别的准确性会受到影响。
人工蜂群算法可以通过优化噪声处理算法,提高语音识别的抗干扰能力。
优化算法——人工蜂群算法(ABC)一、人工蜂群算法的介绍手机微信关注公众号ID:datadw 学习数据挖掘,研究大数据,关注你想了解的,分享你需要的。
人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。
人工蜂群算法属于群智能算法的一种。
二、人工蜂群算法的原理1、原理标准的ABC算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为3类: 采蜜蜂、观察蜂和侦察蜂。
整个蜂群的目标是寻找花蜜量最大的蜜源。
在标准的ABC算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源。
假设问题的解空间是维的,采蜜蜂与观察蜂的个数都是,采蜜蜂的个数或观察蜂的个数与蜜源的数量相等。
则标准的ABC算法将优化问题的求解过程看成是在维搜索空间中进行搜索。
每个蜜源的位置代表问题的一个可能解,蜜源的花蜜量对应于相应的解的适应度。
一个采蜜蜂与一个蜜源是相对应的。
与第个蜜源相对应的采蜜蜂依据如下公式寻找新的蜜源:其中,,,是区间上的随机数,。
标准的ABC算法将新生成的可能解与原来的解作比较,并采用贪婪选择策略保留较好的解。
每一个观察蜂依据概率选择一个蜜源,概率公式为其中,是可能解的适应值。
对于被选择的蜜源,观察蜂根据上面概率公式搜寻新的可能解。
当所有的采蜜蜂和观察蜂都搜索完整个搜索空间时,如果一个蜜源的适应值在给定的步骤内(定义为控制参数“limit”) 没有被提高, 则丢弃该蜜源,而与该蜜源相对应的采蜜蜂变成侦查蜂,侦查蜂通过已下公式搜索新的可能解。
其中,是区间上的随机数,和是第维的下界和上界。
2、流程∙初始化;∙重复以下过程:o将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量;o观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜源的花蜜量;o确定侦查蜂,并根据第三个公式寻找新的蜜源;o记忆迄今为止最好的蜜源;判断终止条件是否成立;三、人工蜂群算法用于求解函数优化问题对于函数其中。
代码:[cpp]view plaincopy1.#include<iostream>2.#include<time.h>3.#include<stdlib.h>4.#include<cmath>5.#include<fstream>6.#include<iomanip>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 BeeGroup23.{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<maxCycle)62. {63. sendEmployedBees();64.65. CalculateProbabilities();66.67. sendOnlookerBees();68.69. MemorizeBestSource();70.71. sendScoutBees();72.73. MemorizeBestSource();74.75. output<<setprecision(30)<<BestSource.trueFit<<endl;76.77. gen++;78. }79.80. output.close();81. cout<<"运行结束!!"<<endl;82.return 0;83.}84.85./*****函数的实现****/86.double random(double start, double end)//随机产生区间内的随机数87.{88.return start+(end-start)*rand()/(RAND_MAX + 1.0);89.}90.91.void initilize()//初始化参数92.{93.int i,j;94.for (i=0;i<FoodNumber;i++)95. {96.for (j=0;j<D;j++)97. {98. NectarSource[i].code[j]=random(lb,ub);99. EmployedBee[i].code[j]=NectarSource[i].code[j];100. OnLooker[i].code[j]=NectarSource[i].code[j];101. BestSource.code[j]=NectarSource[0].code[j];102. }103./****蜜源的初始化*****/104. NectarSource[i].trueFit=calculationTruefit(NectarSource[i]); 105. NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit) ;106. NectarSource[i].rfitness=0;107. NectarSource[i].trail=0;108./****采蜜蜂的初始化*****/109. EmployedBee[i].trueFit=NectarSource[i].trueFit;110. EmployedBee[i].fitness=NectarSource[i].fitness;111. EmployedBee[i].rfitness=NectarSource[i].rfitness;112. EmployedBee[i].trail=NectarSource[i].trail;113./****观察蜂的初始化****/114. OnLooker[i].trueFit=NectarSource[i].trueFit;115. OnLooker[i].fitness=NectarSource[i].fitness;116. OnLooker[i].rfitness=NectarSource[i].rfitness;117. OnLooker[i].trail=NectarSource[i].trail;118. }119./*****最优蜜源的初始化*****/120. BestSource.trueFit=NectarSource[0].trueFit;121. BestSource.fitness=NectarSource[0].fitness;122. BestSource.rfitness=NectarSource[0].rfitness;123. BestSource.trail=NectarSource[0].trail;124.}125.126.double calculationTruefit(BeeGroup bee)//计算真实的函数值127.{128.double truefit=0;129./******测试函数1******/130. 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)131. /((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])));132.133.return truefit;134.}135.136.double calculationFitness(double truefit)//计算适应值137.{138.double fitnessResult=0;139.if (truefit>=0)140. {141. fitnessResult=1/(truefit+1);142. }else143. {144. fitnessResult=1+abs(truefit);145. }146.return fitnessResult;147.}148.149.void sendEmployedBees()//修改采蜜蜂的函数150.{151.int i,j,k;152.int param2change;//需要改变的维数153.double Rij;//[-1,1]之间的随机数154.for (i=0;i<FoodNumber;i++)155. {156.157. param2change=(int)random(0,D);//随机选取需要改变的维数158.159./******选取不等于i的k********/160.while (1)161. {162. k=(int)random(0,FoodNumber);163.if (k!=i)164. {165.break;166. }167. }168.169.for (j=0;j<D;j++)170. {171. EmployedBee[i].code[j]=NectarSource[i].code[j];172. }173.174./*******采蜜蜂去更新信息*******/175. Rij=random(-1,1);176. EmployedBee[i].code[param2change]=NectarSource[i].code[param2change ]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]) ;177./*******判断是否越界********/178.if (EmployedBee[i].code[param2change]>ub)179. {180. EmployedBee[i].code[param2change]=ub;181. }182.if (EmployedBee[i].code[param2change]<lb)183. {184. EmployedBee[i].code[param2change]=lb;185. }186. EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]); 187. EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit); 188.189./******贪婪选择策略*******/190.if (EmployedBee[i].trueFit<NectarSource[i].trueFit)191. {192.for (j=0;j<D;j++)193. {194. NectarSource[i].code[j]=EmployedBee[i].code[j];195. }196. NectarSource[i].trail=0;197. NectarSource[i].trueFit=EmployedBee[i].trueFit;198. NectarSource[i].fitness=EmployedBee[i].fitness;199. }else200. {201. NectarSource[i].trail++;202. }203. }204.}205.206.void CalculateProbabilities()//计算轮盘赌的选择概率207.{208.int i;209.double maxfit;210. maxfit=NectarSource[0].fitness;211.for (i=1;i<FoodNumber;i++)212. {213.if (NectarSource[i].fitness>maxfit)214. maxfit=NectarSource[i].fitness;215. }216.217.for (i=0;i<FoodNumber;i++)218. {219. NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1 ;220. }221.}222.223.void sendOnlookerBees()//采蜜蜂与观察蜂交流信息,观察蜂更改信息224.{225.int i,j,t,k;226.double R_choosed;//被选中的概率227.int param2change;//需要被改变的维数228.double Rij;//[-1,1]之间的随机数229. i=0;230. t=0;231.while(t<FoodNumber)232. {233.234. R_choosed=random(0,1);235.if(R_choosed<NectarSource[i].rfitness)//根据被选择的概率选择236. {237. t++;238. param2change=(int)random(0,D);239.240./******选取不等于i的k********/241.while (1)242. {243. k=(int)random(0,FoodNumber);244.if (k!=i)245. {246.break;247. }248. }249.250.for(j=0;j<D;j++)251. {252. OnLooker[i].code[j]=NectarSource[i].code[j];253. }254.255./****更新******/256. Rij=random(-1,1);257. OnLooker[i].code[param2change]=NectarSource[i].code[param2chang e]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change] );258.259./*******判断是否越界*******/260.if (OnLooker[i].code[param2change]<lb)261. {262. OnLooker[i].code[param2change]=lb;263. }264.if (OnLooker[i].code[param2change]>ub)265. {266. OnLooker[i].code[param2change]=ub;267. }268. OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);269. OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit); 270.271./****贪婪选择策略******/272.if (OnLooker[i].trueFit<NectarSource[i].trueFit)273. {274.for (j=0;j<D;j++)275. {276. NectarSource[i].code[j]=OnLooker[i].code[j]; 277. }278. NectarSource[i].trail=0;279. NectarSource[i].trueFit=OnLooker[i].trueFit;280. NectarSource[i].fitness=OnLooker[i].fitness;281. }else282. {283. NectarSource[i].trail++;284. }285. }286. i++;287.if (i==FoodNumber)288. {289. i=0;290. }291. }292.}293.294.295./*******只有一只侦查蜂**********/296.void sendScoutBees()//判断是否有侦查蜂的出现,有则重新生成蜜源297.{298.int maxtrialindex,i,j;299.double R;//[0,1]之间的随机数300. maxtrialindex=0;301.for (i=1;i<FoodNumber;i++)302. {303.if (NectarSource[i].trail>NectarSource[maxtrialindex].trail) 304. {305. maxtrialindex=i;306. }307. }308.if(NectarSource[maxtrialindex].trail>=limit)309. {310./*******重新初始化*********/311.for (j=0;j<D;j++)312. {313. R=random(0,1);314. NectarSource[maxtrialindex].code[j]=lb+R*(ub-lb); 315. }316. NectarSource[maxtrialindex].trail=0;317. NectarSource[maxtrialindex].trueFit=calculationTruefit(NectarSource [maxtrialindex]);318. NectarSource[maxtrialindex].fitness=calculationFitness(NectarSource [maxtrialindex].trueFit);319. }320.}321.322.void MemorizeBestSource()//保存最优的蜜源323.{324.int i,j;325.for (i=1;i<FoodNumber;i++)326. {327.if (NectarSource[i].trueFit<BestSource.trueFit)328. {329.for (j=0;j<D;j++)330. {331. BestSource.code[j]=NectarSource[i].code[j];332. }333. BestSource.trueFit=NectarSource[i].trueFit;334. }335. }336.}收敛曲线:。