1、1人工蜂群算法分析与实现李林菲(陕西师范大学 计算机科学学院,西安 710062)摘 要:在了解蜜蜂采蜜原理和蜂群优化算法的基础上,分析基本的人工蜂群算法,结合操作系统的相关知识,将求解智力 题的过程转化为蜂群寻找最优蜜源的过程。针对智力题求解实例,用线程模拟不同角色的蜜蜂,模仿人工蜂群算法(ABCA)中各个蜜蜂并行地完成智力题求解。在 VC+6.0 环境中的仿真实验表明,该算法全局搜索能力强,运算效率比单线程的算法明显高出十余倍。关键词:人工蜂群算法;群体智能;组合优化1 绪论群集智能优化算法起源于研究者们对自然界的生物进化过程和觅食行为的模拟。它将搜索或者优化过程模拟为个体的觅食或者进化过
2、程,使用搜索空间中的点模拟自然界中的个体;把求解问题的目标函数转化成个体对环境的适应能力;将个体的优胜劣汰过程或觅食过程类比为在搜索和优化过程中用较好的可行解取代较差可行解的迭代过程,从而形成了一种以“生成+检验”特征的迭代搜索算法,是一种求解极值问题的仿生学自适应人工智能技术。1.1群体智能的产生针对自然界中一些社会性昆虫群体行为的不解,如蚂蚁和蜜蜂群体智能的来源,个体简单行为如何形成复杂的群体行为,成百上千的蜜蜂如何协调做出某个重要决定,是什么让一群鲱鱼在一瞬间改变行动方向,为什么蚂蚁数量会随着周围环境的变化而变化等群体行为,在过去的数十年里,研究人员有了一些有趣的发现。图1 蚂蚁群体斯坦
3、福大学的生物学家黛博拉M戈登( Deborah M. Gordon) 9博士在亚2利桑那州沙漠对红蚁的观察和研究中发现,单个的蚂蚁并不聪明,聪明的是它们的群体。蚂蚁通过触觉和嗅觉互相交流信息,后再做出决策。对于下一步工作如何安排,则由整个蚁群决定,而不是某个特定的个体。这就是蚂蚁“群体智慧”的工作原理。它们遵循简单的经验法则,个体以局部信息为行动依据,没有一个蚂蚁能够通观全局,也没有一只蚂蚁知道其他蚂蚁在做什么。对于它们来说,复杂的行为是通过个体间简单的接触完成的,它们不需要带头者。就个体而言,蚂蚁微小得不堪一击,但是从群体来看,它们能够对不同的环境做出迅速而有效的反应,其“武器”就是群体智能
4、。图2 蜜蜂群体康奈尔大学的生物学家托马斯西利( ThomasSeeley) 9经过长期观察蜜蜂,发现在一个蜂房里的工蜂虽然多达50000之多,但它们依然能统一分歧,为蜂群谋得最大的利益。它们依据“集思广益”、“各抒己见”的法则做出决策,使用一种有效的机制使选择最小化。同时,西利把从蜜蜂身上学到的决策方法运用到一些会议上,模拟蜜蜂的决策,让与会者考虑所有的可能性,提出各自的想法或意见,然后通过投票决定。事实证明,几乎所有遵循蜜蜂法则的团体都能使自己变得更加聪明,例如股票市场的投资者们,从事研究的科学家们,甚至猜测罐中豆子数量的小孩们,如果他们是一个多样化的、有着各自独立见解的群体,并使用表决、
5、求平均值之类的办法来获得决策,都可能成为聪明的群体。3图3 鸽子群体克雷格 雷诺兹( CraigReynolds) 9对鸽子的群体行为研究,以及成功创建的计算机模拟程序,不仅展示了动物的自组织模式,同时也为机器人工程拓展了道路。一组能够协调工作的机器人就像鸟群一样,比单一的机器人聪明。如果机器人群体遭遇某些意外的情况,即使它们的智能化程度不是很高,也能较为迅速地做出反应并进行调整。如果群体中一个机器人出现故障,其他机器人会替代它的位置。而且群体机器人的控制权是分散的,不依赖某个特定的领袖。正如宾夕法尼亚大学机械工程学教授维嘉库马尔( Vijay Kumar) 9 所说,在生物中有大批成员的群体
6、极少有中心领导的情况。图4 鹿群由赫乌尔 9对鹿群长达5个月的研究中可知,每只驯鹿都知道其邻伴将要做4什么,没有预见性,无因无果,一切就在瞬间发生了。尤其是鹿群遭遇狼时,就更显示出典型的群体智慧:驯鹿知道什么时候该跑,应该往哪个方向跑。整个过程中没有一头驯鹿去安排鹿群该往何处跑,它们仅仅遵循着数千年养成的简单的经验法则。华盛顿大学的生物学家丹尼尔格伦鲍姆(DanielGrnbaum) 9对海洋中的鱼群研究,发现也有类似的行为。这就是动物群体智能的非凡魅力。不论是蚂蚁、蜜蜂、鸽子、驯鹿,还是鱼群,这些智能群体基于自身经验的简单法则,为人类提供了解决复杂问题的策略,群体智能也由此产生。因此,把群体
7、智能(Swarm Intelligence)定义为:指由众多无智能的简单个体组成群体,通过相互之间简单的合作,表现出智能行为的特性。自然界中的动物、昆虫,常以集体的力量进行觅食生存,单个个体所表现出的行为是缺乏智能的,但由个体组成的群体却表现出了一种有效的复杂的智能行为。群集智能可以在适当的进化机制引导下,通过个体间交互,以某种突现的形式发挥作用,这是个体以及可能的智能个体难以做到的。因此,可以将自然界中这些呈现群体行为特征的生物的行为,用简单的几条规则在计算机中建模,动物以群落形式生存觅食时一般遵循三个规则 12:1) 分隔规则:尽量避免与临近的伙伴过于拥挤;2) 对准规则:尽量与临近的伙伴
8、的平均方向保持一致,向目的地运动;3) 内聚规则:尽量地朝临近伙伴的中心移动。 以上规则可归结为个体信息和群体信息两类,前者对应于分隔规则,也就是个体根据自身当前的状态进行决策;后者对应于对准规则和内聚规则,即个体根据群体的信息进行决策。另外,由于动物的行为一般具有适应性、盲目性、自治性和突现性以及并行性等特征,因此自组织性、突现性成为群集智能优化算法的两大基本特征。群居性的动物涌现出的群集智能正越来越受到人们的重视,一些启发于群居性生物的觅食、筑巢等行为而设计的优化算法吸引了大量的国内外学者的研究,成为解决传统结构优化问题的新方法。1.2 群体智能的现状丰富多彩而又纷繁复杂的自然界启迪了无数
9、的科学发明,群体智能来源于科学家们对群体性生物的观察和研究。作为近 年 来 发 展 迅 速 的 人 工 智 能 学 科 领域 , 利用群体智能解决各种问题的研究,越来越受到人们的重视。学 者 们 通 过研 究 分 散 的 、 自 组 织 的 动 物 群 体 和 人 类 社 会 的 智 能 行 为 , 关注群居动物的社会习性,提 出 了 许 多 迥 异 于 传 统 思 路 的 智 能 算 法 , 例如:聚类算法、遗传算法、蚁群算法、粒子群算法以及鱼群算法等,很 好 地 解 决 了 不 少 原 来 非 常 棘手 的 复 杂 工 程 问 题 , 在 某 些 领 域 得 到 了 广 泛 的 运 用 。
10、51.2.1 主要的群体智能算法介绍(1)蚁 群 算 法20世纪90年代初有意大利学者Dorigo ,Mahiezzo ,Colorni等人 13受到人们对自然界中真实蚁群的群集智能行为的研究成果的启发提出来的一种新型的模拟进化算法,并称为蚁群系统(AS)。蚁群算法充分利用蚂蚁寻找食物的过程与著名的旅行商问题(TSP)之间的相似性,通过模拟蚂蚁个体间的信息交流与相互协作,最终找到从蚁穴到食物源的最短路径来求解TSP问题。由于蚂蚁能适应环境的变化,诸如路上突然遇到障碍物,能快速重新找到最优路径;信息素不仅通过量反映路径被选择的概率,也随时间的推移逐渐挥发消失,因此,蚁群算法随后也在求解job-s
11、hop调度问题、指派问题等经典优化问题中取得了较好的效果,在求解离散优化问题中显示出优越性。然而,由于基本蚁群算法进化收敛速度慢,且易陷入局部最优或者出现停滞现象等缺陷,学者们也相继提出了各种改进的蚁群算法,具有代表性的主要有:1996 年Gambardella 和Dorig 提出了采用伪随机选择机制对AS的蚂蚁选择策略进行改进的自适应蚁群算法(AAS);随后,Stutzle等人就信息素更新机制进行改进提出了最大最小蚁群算法(MMAS)。(2)鱼群算法由李晓磊、邵之江 13等提出,算法中采用了自上而下的寻优模式魔法自然界的鱼群觅食行为,主要利用鱼的觅食、聚群和追尾行为,构造出了个体的底层行为;
12、通过鱼群中各个体的局部寻优,实现全局最优值在群体中突现出来的目的。在基本的鱼群算法中引入鱼群的生存机制、竞争机制以及协调行为,能够提高算法的优化效率。李晓磊等据此采用分解协调的思想又构造了一种改进的人工鱼群算法,并以换热器系统为例,验证该算法,结果表明该算法具有较好的收敛性 13。因此,人工鱼群算法,是又一类基于群集智能的有效寻优模式。(3)粒子群算法受人工生命研究结果的启迪,粒子群算法( PSO) 的基本概念来源于对鸟群和鱼群捕食行为的简化社会模型的模拟,1995 年由Kenndy 和Eberhart 13等人提出。由于PSO 算法在函数优化等领域具有广泛的应用前景,因此PSO 算法自提出以
13、来,引起了国际上相关领域众多学者的关注。目前国内外研究现状大致可分为三个方向:算法的改进、算法的分析和算法的应用 13。在PSO 算法中,每个优化问题的解都是搜索空间中的一只鸟(粒子),解群相当于一个鸟群,鸟群从一地飞行到另一地相当于解群的进化,“好消息”相当于解群每代中的最优解,食物源相当于全局最优解。PSO 算法中的每个粒子6均视为解空间中的一个解。它根据自己的飞行经验与同伴的飞行经验来调整自己的飞行。每个粒子在飞行过程中所经过的最好位置,就是粒子本身找到的最优解,称为个体极值( Pbest);整个群体所经历过的最好位置,就是整个群体目前所找到的最优解,称为全局极值( Gbest)。每个粒
14、子都是通过上述两个极值不断来更新自己,从而产生新一代的群体。在实际操作中,由优化问题所决定的适应度值(fitness),来评价粒子的“好坏”程度。每个粒子还有一个速度决定它们飞行的方向和距离,然后粒子就追随当前的最优粒子在解空间中搜索。群体智能算法经历了十多年的发展,逐渐凸现出其广泛的用途与强大的生命力。它本身所固有的并行性特征,正是目前基于网络的海量信息的分布式处理所需要的有效解决方法。它的开放性使得各种优化方法可以互相补充、优化算法的性能,使算法在处理不同问题的时候具有较强的适应能力与灵活性,这些优点正是群体智能优化算法研究不断取得进步与发展的原因。作为一类新型的进化算法,群体智能算法的主
15、要特点是利用群体搜索策略和群体之间的信息交换。这类算法对目标函数的形态没有特殊要求,特别适合用于传统方法解决不了的大规模复杂结构优化问题。1.2.2 存在的问题群体智能算法产生的灵感来源于自然界中生物群体的生活现象,没有成熟、严格的数学理论为指导,还有一些方面需要研究者去发展和完善 13:算法模型本身,算法的收敛性分析与证明以及如何提高解空间的搜索效率等算法的基本原理方面缺乏严格的数学理论基础;参数对算法性能影响太大,其选择和设置没有普遍适用的方法,往往依靠经验得出,这使得参数的设置对实际的问题依赖性过强;优化算法的思想来源于自然界,是模拟生物习性得到的计算方法。由于要解决的问题千差万别,在求
16、解实际问题的时候已陷入固有的模拟框架,使得一些问题在采用这些算法时表现得无能为力。因此,群体智能优化算法的发展,首先要从生物群体的基本生命自然机理进行深入研究,结合严谨的数学推理,使得算法具有坚实可靠的理论基础,建立算法的一整套理论体系,使得算法在使用过程中有章可循。然后,突破传统的算法模型的束缚,设计出新的更加智能化的算法模型。此外,还要深入研究群体智能优化算法之间以及群体智能优化算法与其它智能优化方法之间的互相结合,探讨一种或几种算法融和的统一机制,提高算法的性能,加深算法的应用研究,扩大其适用范围。综上所述,本文以“人工蜂群算法分析与实现”为题,将群体智能方法中的蜂群算法应用到智力题的求
17、解中,采用多个线程模拟多只蜜蜂,多个线程并7行运行,同时对不同的可能答案进行检测模拟多只采蜜蜂采蜜,并通过考虑所选智力题的特征和结合一些操作系统相关知识(进程、线程、信号量、互斥锁等)来设计算法模型,以提高程序的运行速度。在本文的算法中,通过在线程之间添加一些限制条件,使多个智能性不高的线程协作共同完成了一项大任务。由此,可考虑把各个线程实现的功能分别转移到不同角色的机器人,让它们同时去做一些事情。比如:通过生命体征寻找地震受难者、通过面部特征识别追查逃案犯、根据化学特性查寻某些有毒的化学泄露处、通过红外检测救火、根据垃圾的某些特性实现机器人打扫卫生、垃圾分类等。因此,对蜂群算法应用的研究具有
18、重要意义。1.3 本文工作本文在分析和掌握原有算法的基础上,结合操作系统方面的相关知识,将其应用到智力题的求解中,达到能够更加快速求解的目的。具体包括:(1)阅读文献,理清人工蜂群优化算法的基本原理和数学模型;(2)回顾操作系统中关于进程、线程、信号量、互斥锁方面的知识;(3)构造基于人工蜂群算法的智力题求解模型,画出处理过程的基本流程图;(4)在 VC+6.0环境中,实现算法,进行性能测试和比较。2 人工蜂群算法蜂群算法(Bee Colony Algorithm)是建立在蜜蜂自组织模型和群体智能基础上提出的一种非数值优化计算方法.Seely Error! Reference source n
19、ot found.于1995年第一个提出了蜂群的自组织模拟模型。在模型中,尽管每个社会阶层中的蜜蜂只完成单一任务,但蜜蜂相互间通过摇摆舞、气味等多种信息方式,使得整个蜂群能协同完成诸如构建蜂巢、收获花粉等多项任务。D.Karaboga Error! Reference source not found.于 2005年成功地把蜂群算法应用在函数的数值优化问题上,提出了比较系统且新颖的群体智能优化算法ABCA算法(Artificial Bee Colony Algorithm,简称ABCA) Error! Reference source not found.,算法主要模拟了蜂群的智能采蜜行为,蜜
20、蜂根据各自分工进行各自的采蜜活动,并且通过蜜源信息的共享和交流,从而找到问题的最优解。Basturk等人 Error! Reference source not found.于2006年又进一步将人工蜂群算法理论应用到解决限制性数值优化的问题上,并取得了较好的测试效果。人工蜂群在寻优等方面具有收敛速度快、求解质量高、鲁棒性好、通用性强等优点,但也可能有早熟收敛和后期容易陷入局部极值等不足。2.1 ABCA的描述在人工蜂群系统中,每一个备选解称之为食物源(food source),蜜蜂采蜜8(寻找食物源)的过程即为搜寻最优解的过程。在算法中,食物源的价值由收益度(nectar amount)体现
21、。蜜蜂的基本行为有:search(搜索食物源)、recruit(为食物源招募)和abandon(放弃食物源)。蜜蜂包含三种角色,即侦察蜂、引领蜂和采蜜蜂。采蜜蜂与正在采集的食物源相对应,食物源是采蜜蜂的引导目标。引领蜂与采蜜蜂分享信息,招募更多的采蜜蜂采集相应的食物源。信息的分享程度与食物源的收益度相关。侦察蜂随机搜索蜂巢附近的新食物源,增强了算法跳出局部最优的能力。采蜜蜂由引领蜂处获得食物源的收益度信息。蜂群算法中的各种蜜蜂在舞蹈区交流信息,侦察蜂通过摇摆舞完成食物源信息的分享,引领蜂通过摇摆舞完成为食物源的招募工作。所有采蜜蜂都等候在舞蹈区,根据观察到的舞蹈选择相应的食物源采集。2.2 各
22、种参数对算法结果的影响本小节重点分析摇摆舞算法和觅食算法中的参数,及其对ABCA的影响 8。(1) 摇摆舞算法算例中的目标函数是最大完工期,令 定义一个觅食蜂的收益率,计算ipf公式为(1)iicfmax1式(1)中, 为觅食蜂 对应调度的最大完工期。icmaxi蜂群的平均收益率 为olnypf(2)njcolnycf1max式(2)中, 为 时刻摇尾舞的次数; 为跳摇尾舞的觅食蜂 对应调t j if度的最大完工期。摇尾舞持续时间 的计算公式为id(3)colnyiipf(2) 觅食算法觅食算法在蜂群中定义了一个觅食蜂群,这些觅食蜂迭代地构造出作业车间调度的解。觅食蜂在拓扑图中沿着节点之间的边
23、行进,一次性地访遍图中从起点到终点所有的节点,由此得到的路径即代表了可行解。觅食蜂只能基于工序的优先权按照既定的可选节点清单选择下一节点,这样的移动准则表示为(4)可 选 节 点j ijijij dttp19式(4)中, 为路径从节点 扩展至节点 的概率; 为节点 和节点 之ijpijijij间连边的等级数; 为节点 和节点 之间的启发式距离。dj节点 至节点 之间有向边的等级数ij(5)mkij1式(5)中, 为偏好路径赋值, ; 为可选节点数; 为偏好路径数,0.m或0。1m由于首次觅食的觅食蜂的 值等于0,则所有可选节点的 赋值相同。ij3 人工蜂群算法的多线程并行实现技术在如今的信息社
24、会,计算机需要处理的信息量越来越庞大,需要解决的问题越来越复杂,使得计算量暴增。通过提高单个处理器的计算速度和采用传统的“顺序(串行)”计算技术已难以胜任。因此,需要功能更加强大的计算机系统和高效计算技术来支撑,并行计算机和并行计算技术由此应运而生。加上第四代编程语言的出现,比如面向对象编程语言C+、JAVA等都提供了多线程技术,不仅可以使编程者在单处理机上模拟并行计算,还可以在多处理机上实现并行计算。3.1进程、线程与多线程进程、线程和多线程都是操作系统的概念。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位,是应用程序的执行实例。进程在运行过程中创建的资源随着
25、进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭,即具有动态性,从被创建到被撤销有一个生命周期;是程序的一次执行,即在指定内存中的一组指令序列的执行过程。每个进程由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。一个进程至少包括一个线程(称为主线程),并且每个进程都由主线程开始,在运行过程中可以建立新的执行线程。线程是程序执行的基本单位,通过线程可以实现程序执行的并发性、独立性和异步性。每个线程都有自己的一套设备(CPU、寄存器和堆栈),操作系统给每个独立的线程安排一些CPU时间片,通过操作系统的调度,实现不同线程的切换。因此,为了充分利用CPU,引入了多线程。多线程是指程序
26、中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程是为了同步完成多项任务,不是为了提高运行效率,10而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。多线程技术的主要优势在于充分利用CPU的空闲时间片,用尽可能少的时间来对用户的要求作出响应,使系统整体运行效率得到一定的提高,增加了应用程序的灵活性。多线程提高了系统响应能力及平滑的后台处理。例如,一个字处理程序(进程)可以通过使用多线程来加强操作并简化与用户的交互。该应用程序可以包含3 个线程,第1 个线程可以用于响
27、应用户的键盘输入消息,将字符放入文档中;第2 个线程可以执行拼写检查及分页等后台操作;第3 个线程可以在后台将文档送到打印机打印。3.2互斥锁临界资源是指在系统中有很多资源是多个进程共享的资源中一次仅允许一个进程使用的那部分资源。互斥(间接相互制约关系)指多个进程都想使用一个临界资源,但是不能同时使用,于是只好一个进程用完了,才能给其他的进程用。 加锁法是对临界区加锁以实现互斥。当某个进程进入临界区后,就锁定临界区直到它退出临界区,其他进程要进入时,需要不断测试临界区是否被用着,直到临界区空着时才能进入。在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“
28、互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程。3.3信号量信号量S为可用临界资源数量,取值只允许为“0”和“1”的信号量称为二元信号量,主要用作互斥变量(mutex);取值允许为整数的信号量称为一般信号量(semaphore),主要用于进程间的同步问题。操作:最初是由芬兰学者Dijkstra 于1965年提出的两个)(/)(signalswt原子操作概念,信号量除初始化外仅能通过这两个标准的原子操作 和)(swait来访问。原子操作在执行时是不可中断的,即当一个进程在修改某信signal号量时,没有其他进程可同时对该信号量进行修改,以解决进程间同步和互斥的问题。操作:对某资源信号量 作 操作,表示申请资源,可用资源数)(swit swait;如果 ,表示无资源可用,本进程挂起,变成等待资源 的“等待”状s0 s态。操作:对某资源信号量 作 操作,表示释放资源,可用资)(signal signl