《蚁群算法模拟系统设计及实现.doc》由会员分享,可在线阅读,更多相关《蚁群算法模拟系统设计及实现.doc(63页珍藏版)》请在三一办公上搜索。
1、J I A N G S U U N I V E R S I T Y本 科 毕 业 论 文蚁群算法模拟系统的设计与实现Ant Colony Simulation System Design and Implementation学院名称: 专业班级: 学生姓名: XXXXX 指导教师姓名: XXXXX 指导教师职称: 2010年 6 月蚁群算法模拟系统的设计与实现专业班级:J计算机0601 学生姓名:汤琪 指导教师:蔡涛 职称:副教授摘要: 人工免疫算法具有快速随机的全局搜索能力,但对于系统中的反馈信息利用不足,往往做大量无为的冗余迭代,求解效率低。蚁群算法具有分布式并行全局搜索能力,但初始解随机
2、,易早熟且求解速度慢。本文提出免疫算法和蚁群算法的混合算法免疫蚁群算法,通过信息素更新获得全局最佳解。通过匹配检测仿真实验,结果证明该算法是计算精度较好的一种算法。本设计是在Linux环境下,用C语言编写的。Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。 关键
3、词:人工免疫算法 蚁群算法 匹配检测 LinuxAnt Colony Simulation System Design and ImplementationAbstractArtificial immune algorithm is fast random global search capability, but the feedback system is underutilized, often do a lot of inactive redundant iteration, solve the low efficiency.Ant colony algorithm has the d
4、istributed parallel global search capability, but the initial solution randomly, prematurity and slow to solve.In this paper, the immune algorithm and ant colony hybrid immune algorithm ant colony algorithm, pheromone update access to the global optimal solution.Detected by matching simulation resul
5、ts show that the algorithm is an algorithm for better accuracy.The design is in the Linux environment, using C language. Linux is a Unix-computer operating system collectively. Linux operating system kernels name is Linux. Linux operating system is free software and open source development in the mo
6、st famous example. Strictly speaking, Linux is only the word that Linux kernel itself, but in fact people have used to describe the use of Linux based on Linux kernel and GNU project using various tools and database operating systems. Linux is named after the computer amateur Linus Torvalds. Key Wor
7、dsArtificial immune algorithm ant colony algorithm matching test Linux目 录中文摘要IABSTRACTII目 录1第一章 引言31.1. 研究背景31.2. 本课题的开发意义4第二章 关键技术52.1. Linux 基本知识52.1.1 Linux的发展历史52.1.2 Linux的常用命令62.1.3 GCC基础知识要点72.2. 基本蚁群算法92.2.1 基本蚁群算法92.2.2 蚁群算法基本步骤112.2.3蚁群算法流程图112.2.4复杂度分析122.3. 基本人工免疫算法132.3.1 一般免疫算法的理论思想132
8、.3.2 人工免疫算法15第三章 系统的设计与实现173.1 人工免疫算法设计173.1.1 人工免疫算法基本步骤173.1.2 人工免疫算法流程图173.1.3人工免疫的相关设计183.2蚁群算法设计203.2.1 蚁群算法实现步骤203.2.2 蚁群算法流程图213.3随机检测设计21第四章 运行234.1各运行命令234.2检测器的添加244.3整体检测244.4随机选取检测器检测244.5蚁群算法选取检测器检测25第五章 总结27致 谢28参考文献29第一章 引言1.1. 研究背景人工智能经历了20世纪80年代整整10年的繁荣后,由于方法论上始终没有突破经典计算思想的樊篱,再次面临着寒
9、冬季节的考验。在这种背景下,社会性动物(如蚁群、蜂群、鸟群等)的自组织(Self-organization)行为引起了人们的广泛关注,许多学者对这种行为进行数学建模并用于计算机对其进行仿真,这就产生了所谓的“群体智能” (Swarm Intelligence,简称SI)。社会性动物的妙处在于:个体的行为都很简单,但当他们一起协同工作时,却能够“突现”出非常复杂(智能)的行为特征。例如,单只蚂蚁的能力极其有限,但当这些简单的蚂蚁组成蚁群时,却能完成像筑巢、觅食、迁徙、清扫蚁巢等复杂行为;一群行为显得盲目的蜂群能造出精美的蜂窝;鸟群在没有集中控制的情况下能够同步飞行等。这些自组织行为中,又以蚁群在
10、觅食过程中总能找到一条从蚁巢到食物源的最短路径最为引人注目。受其启发,意大利学者M.Dorigo,V.Maniezzo and A.colorni于20世纪90年代初提出的一种新型的智能优化算法蚁群优化 (Ant Colony Optimization,简称ACO)。它通过信息素的积累和更新来寻求最优解,主要特点是模拟自然界中蚂蚁的群体行为。目前国内外研究者用蚁群算法研究了旅行商问题,指派问题,调度问题等,取得了一系列较好的实验结果。蚁群算法具有分布式并行搜索能力,较强的鲁棒性和易于与其他算法结合等优点,但同时也存在着一些不足之处:(1)与其他算法相比该算法需要较长的搜索时间;(2)该算法容易
11、早熟,即搜索进行一定程度后,所有个体所发现的解完全一致,不能对解空间进行进一步搜索;(3)初始解和初始信息素随机。 近几年,人们提出了多种方法来解决蚁群算法的这三个缺点,其中蚁群算法与其他算法混合产生新的混合算法是一个研究方向,例如禁忌算法与蚁群算法混合,遗传算法与蚁群算法混合,粒子群算法与蚁群算法混合等。这些算法应用于TSP问题或函数优化问题的求解取得了较好效果。 人工免疫系统 (Artificial Immune System,简称AIS)是模仿生物免疫系统的免疫应答、免疫调节等机理,构造出的一类高性能、自组织、鲁棒性好的人工智能系统。目前,人工免疫系统的研究己经受到学者们越来越广泛的关注
12、,人工免疫算法也在实际工程应用中得到了推广。人工免疫成为继神经网络、模糊逻辑和进化计算后人工智能领域又一研究热点。免疫系统是一种复杂的分布式信息处理学习系统,这种系统具有免疫防护、免疫耐受、免疫记忆、免疫监视功能,这些功能和特点给予研究人员较多的灵感,促成许多学者建立了基于免疫机理的智能方法,解决大量的非线性科学问题。本文将人工免疫算法与蚁群算法混合产生新的算法免疫蚁群算法(Artificial Immune Ant Colony Algorithm,简称AIACA),并将该算法应用于匹配检测,计算机仿真结果证明该算法是计算精度都较好的一种算法。1.2. 本课题的开发意义 本课题通过蚁群优化算
13、法改进人工免疫算法,主要改进人工免疫算法中通过抗体与抗原之间的亲和力以及抗体与抗体之间的排斥力来选择抗体的方法。采用人工免疫算法生成信息素分布,利用蚁群算法求优化解,优势互补,在收敛速度和寻优能力两方面较原有算法都有明显改善。第二章 关键技术2.1. Linux 基本知识2.1.1 Linux的发展历史 Linux的历史可以追溯到1990年,Linus Torvalds还是芬兰赫尔辛基大学的一名学生,最初用汇编语言写了一个在80386保护模式下处理多任务切换的程序,后来从Linux(用于操作系统教学、很小的Unix)中得到灵感,发誓要写一个比Linux更好的Linux,于是开始写了一些硬件的设
14、备驱动程序、一个小的文件系统.,这样0.0.1版本的Linux就出来了,但是它必须在有Linux的机器上编译以后才能玩,这时候的Linus已经完全“走火入魔”了,决定踢开Linux “闹革命”,于是在1991年10月5号发布了Linux 0.0.2版本,这个版本已经可以运行bash(一种用户与操作系统内核通讯的软件)和gcc(GNU C编译器)了。 Linux从一开始,就决定自由扩散Linux、包括源代码,他把源代码发布在网上,随即就引起爱好者的注意,他们通过互连网也加入了Linux的内核开发工作,一大批高水平程序员的加入,使得Linux达到迅猛发展,到1993年底,Linux 1.0终于诞生
15、。Linux 1.0已经是一个功能完备的操作系统了,其内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好 很多人对Linux的认识有个误区,即总把Linux与低档硬件平台联系到一起,其实从2.1.xx系列内核开始,Linux就开始走高端的路子了,大约在1.3版本之后,开始向其他硬件平台上移植,包括号称最快的CPU-Digital Alpha(目前主频是最高的),目前Linux能将硬件的性能充分发挥出来,可以囊括低端到高端的所有应用。 Linux加入GNU并遵循公共版权许可证(GPL),由于不排斥商家对自由软件进一步开发,不排斥在Linux上开发商业软件,故而使
16、Linux又开始了一次飞跃,出现了很多的Linux发行版,如Slackware、Redhat、Suse、Turbo Linux、Open Linux等十多种,而且还在增加,还有一些公司在Linux上开发商业软件或把其他Unix平台的软件移植到Linux上来,如今很多IT界的大腕如IBM、Intel、Oracle、Infomix、Sysbase、Corel、Netscape、CA、Novell等都宣布支持Linux! 商家的加盟弥补了纯自由软件的不足和发展障碍,Linux得以迅速普及。2.1.2 Linux的常用命令 如果在Linux命令行模式下遇到不会用的命令,你可以打man command得
17、到该命令的帮助,如果想知道一个命令有哪些参数,可以打command -help来得到。 注意:Linux中的参数输入形式和dos不一样,在命令后面应该打一个空格,然后打-,最后再跟一个或多个参数;另外Linux下大小写是有区别的! 下面介绍几个Linux下最常用的命令,每个命令都与对应的dos命令作比较,并列出一些常用的参数。 命令参数 意 义 Ls -a列出系统中的隐含文件,linux下的隐含文件是靠文件名的格式来表示的,不同于dos是靠文件属性来表示,即只要该文件以“.”开头,那么它就是隐含文件。 -l以长式列出。就是把该文件或目录的所有信息都列出来,一个文件占一行 相当于dos下的dir
18、命令,是列文件列表的命令。 cd 和dos下的cd一样,转换目录的命令。 注意:linux下转到上级目录要打cd .而不是dos下的cd.,即cd后面要有个空格 pwd 列出当前目录命令,相当于dos下没有参数的cd命令。例如: rootttqq bin# pwd /usr/bin rootttqq bin# 这表示目前在/usr/bin目录下。 Mkdir -m mode表示建立目录时默认的目录模式。这个是dos和Windows所没有的功能,主要是关于权限的问题。 建立新目录,相当于dos的md命令。一般就用 mkdir dirname rmdir 删除目录,相当于dos的rd命令。 用法:
19、rmdir dirname cat 在文件后面追加文件,或在屏幕上打印文件内容,追加功能相当于dos的copy file1+file2,而在屏幕上打印文件内容可以和dos的typeml来类比。如果文件太大,在一屏上无法完全显示,则可用more命令 more 分屏显示文件内容,和dos下的more命令大致相同,但它可以和别的命令搭配使用。如:cat /home/eec/myfile | more。 cp -r相当于dos的xcopy/s。用于拷贝一个目录下的所有子目录和文件 拷贝文件,相当于dos下的copy,使用方法与dos下的copy一样。2.1.3 GCC基础知识要点 基本规则gcc所遵循
20、的部分约定规则: .c为后缀的文件,C语言源代码文件;.a为后缀的文件,是由目标文件构成的档案库文件;.C,.cc或.cxx 为后缀的文件,是C+源代码文件;.h为后缀的文件,是程序所包含的头文件;.i 为后缀的文件,是已经预处理过的C源代码文件;.ii为后缀的文件,是已经预处理过的C+源代码文件;.m为后缀的文件,是Objective-C源代码文件;.o为后缀的文件,是编译后的目标文件;.s为后缀的文件,是汇编语言源代码文件;.S为后缀的文件,是经过预编译的汇编语言源代码文件。 执行过程 虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,
21、而是要经历四个相互关联的步骤预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的
22、关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 基本用法在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。Gcc最基本的用法是gcc options filenames其中options就是编译器所需要的参数,filenames给出相关的文件名称。-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包
23、含主程序的子程序文件。-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。-Idirname,将dirname所指出的目录加入到程序
24、头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况A)#include B)#include “myinc.h”其中,A类使用尖括号(),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。2.2. 基本蚁群算法2.2.1 基本蚁群算法 蚁群优化算法是一种受自然界生物行为启发而产生“自然”算法。产生于对蚁群行为的研究。蚁群中的蚂蚁以“信息素”(pheromone)为媒介,间接异步的相互联系。这是蚁群优化算法的最大特点。蚂蚁在行动过程中(寻找食物或寻找
25、回巢的路径)中,会在他们经过的地方留下一些化学物资,称之为“信息素”。这些物资能被同一蚁群中后来的蚂蚁感受到并作为一种信号影响后者的行动。具体表现在后到的蚂蚁选择有这些物资的路径的可能性比选择没有这些物资的路径的可能性大得多。后到者留下的信息素会对原有的信息素进行加强,并循环下去。这样,经过蚂蚁越多的路径会被越多的蚂蚁访问,因而积累的信息素也就越多,在下一个时间内被其他蚂蚁选中的可能性也就越大。这个过程会一直持续到所有的蚂蚁都走最短的那一条路为止。 通过图2.1简单的了解蚂蚁的运动过程。假设一个蚂蚁外出寻找食物,蚂蚁从nest点出发,行走速度相同,食品在food点,蚂蚁可能行走的路线如图2.1
26、。由于无法预知道路中间的情况,蚂蚁出发时会随机选择nest-B-food或nest-C-food中的一条。假设初始每条路线上分别分配一只蚂蚁,每单位时间走一步。当行走7个单位时间后,为图2.1中上半部分的情形,已经有一个蚂蚁到达food点。当行走14个单位时间后,走nest-B-food的蚂蚁己经回到A点,而行走nest-C-food的蚂蚁到达food点。如果蚂蚁每经过一点都留下大小为1的信息素,这时nest-B-food路线的第一点聚集2点,而nest-C-food路线的第一点聚集1点。在行走28个单位时间后,这两点的信息素变化分别为4和2,比值为2:1,nest-C-food路线的蚂蚁返回
27、nest点。 如果按比值的比例,一群决定nest-B-food路线派两个蚂蚁,而nest-C-food路线上派一个蚂蚁。在每个蚂蚁再各行走28个单位时间后,nest-B-food和nest-C-food路线的第一个点各累计12和4,比值为3:1。如果再按比值分配蚂蚁数量,则nest-B-food路线分配三只蚂蚁,而nest-C-food路线分配一只蚂蚁。按原有的模式重复28个单位时间,nest-B-food和nest-C-food路线的第一点信息素各积累24和6,比值为4:1。如此重复下去,可以发现nest-B-food和nest-C-food路线的第一点信息素的比值会越来越大,最后的极限是所
28、有的蚂蚁只选择nest-B-food路线。 图2.1:蚂蚁寻物过程的简化图为了更好的描述蚁群算法,下面所有的符号和算法设计以TSP为基础,其它应用可以据此进行改进。令为n为搜索空间中第i只蚂蚁的位置。假设表示第i只蚂蚁可以去的所有位置的集合。等式(2.1)给出了第i只蚂蚁向第j个位置移动的概率函数,并且位置与位置之间的信息素的值越大、先验值的值越大选择路径i-j的概率越大,其中为,这里是由位置移动到位置的耗费,通常由目标函数决定,它可以是两点间的距离或花费的费用。等式中的,是两个系数,分别为残留信息素和转移耗费的相对重要程度。 (2.1)下一个位置可以根据的最大值来选择或是用轮盘赌来随机的选择
29、下一个位置。当一个蚂蚁走完了所选的路径,则按式(2.2)更新信息素值。在每一次循环结束后,每条路径上的信息数值都按(2.3)式进行更新,其中是全局信息素挥发系数,。 (2.2) (2.3)2.2.2 蚁群算法基本步骤以TSP为例,基本蚁群算法的具体实现步骤如下:(1)参数初始化。令时间t=0和循环次数Nc=0,设置最大循环次数Ncmax, 将m个蚂蚁置于n个元素(城市)上,令有向图上每条边(i, j)的初始化信息量ij(t)=const, 其中const表示常数,且初始时刻ij(0)=0 (2)循环次数Nc Nc+1。 (3)蚂蚁的禁忌表索引号k=1。 (4)蚂蚁数目 kk+1 。 (5)蚂蚁个体根据状态转移概率公式(1)计算的概率选择元素(城市) j 并前进,jC - tabuk。 (6)修改禁忌表指针,即选择好之后将蚂蚁移动到新的元素(城市),并把该元素(城市)移动到该蚂蚁个体的禁忌表中。 (7)若集合C中元素(城市)未遍历完,即k=antileng Y