当前位置:文档之家› 毕业论文 群蚁算法模拟系统的设计与实现

毕业论文 群蚁算法模拟系统的设计与实现

J I A N G S U U N I V E R S I T Y 本科毕业论文

蚁群算法模拟系统的设计与实现

Ant Colony Simulation System Design and Implementation

江苏大学2010届毕业设计(论文)

蚁群算法模拟系统的设计与实现

专业班级:J计算机0601 学生姓名:汤琪

指导教师:蔡涛职称:副教授

摘要:人工免疫算法具有快速随机的全局搜索能力,但对于系统中的反馈信息利用不足,往往做大量无为的冗余迭代,求解效率低。蚁群算法具有分布式并行全局搜索能力,但初始解随机,易早熟且求解速度慢。本文提出免疫算法和蚁群算法的混合算

法免疫蚁群算法,通过信息素更新获得全局最佳解。通过匹配检测仿真实验,结果证明该算法是计算精度较好的一种算法。

本设计是在Linux环境下,用C语言编写的。Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。

关键词:人工免疫算法蚁群算法匹配检测 Linux

英文摘要

Ant Colony Simulation System Design and Implementation

Abstract Artificial 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 distributed 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 results 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 kernel's name is "Linux". Linux operating system is free software and open source development in the most 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 Words Artificial immune algorithm ant colony algorithm matching test Linux

目录

中文摘要............................................................................................................................. I ABSTRACT ..................................................................................................................... II 目录 (1)

第一章引言 (3)

1.1.研究背景 (3)

1.2.本课题的开发意义 (4)

第二章关键技术 (5)

2.1.L INUX 基本知识 (5)

2.1.1 Linux的发展历史 (5)

2.1.2 Linux的常用命令 (6)

2.1.3 GCC基础知识要点 (7)

2.2.基本蚁群算法 (9)

2.2.1 基本蚁群算法 (9)

2.2.2 蚁群算法基本步骤 (11)

2.2.3蚁群算法流程图 (11)

2.2.4复杂度分析 (12)

2.3.基本人工免疫算法 (13)

2.3.1 一般免疫算法的理论思想 (13)

2.3.2 人工免疫算法 (15)

第三章系统的设计与实现 (17)

3.1人工免疫算法设计 (17)

3.1.1 人工免疫算法基本步骤 (17)

3.1.2 人工免疫算法流程图 (17)

3.1.3人工免疫的相关设计 (18)

3.2蚁群算法设计 (20)

3.2.1 蚁群算法实现步骤 (20)

3.2.2 蚁群算法流程图 (21)

3.3随机检测设计 (21)

第四章运行 (23)

4.1 各运行命令 (23)

4.2 检测器的添加 (24)

4.3整体检测 (24)

4.4随机选取检测器检测 (24)

4.5蚁群算法选取检测器检测 (25)

第五章总结 (27)

致谢 (28)

参考文献 (29)

第一章引言

1.1.研究背景

人工智能经历了20世纪80年代整整10年的繁荣后,由于方法论上始终没有突破经典计算思想的樊篱,再次面临着寒冬季节的考验。在这种背景下,社会性动物(如蚁群、蜂群、鸟群等)的自组织(Self-organization)行为引起了人们的广泛关注,许多学者对这种行为进行数学建模并用于计算机对其进行仿真,这就产生了所谓的“群体智能”(Swarm Intelligence,简称SI)。社会性动物的妙处在于:个体的行为都很简单,但当他们一起协同工作时,却能够“突现”出非常复杂(智能)的行为特征。例如,单只蚂蚁的能力极其有限,但当这些简单的蚂蚁组成蚁群时,却能完成像筑巢、觅食、迁徙、清扫蚁巢等复杂行为;一群行为显得盲目的蜂群能造出精美的蜂窝;鸟群在没有集中控制

的情况下能够同步飞行等。这些自组织行为中,又以蚁群在觅食过程中总能找到一条从蚁巢到食物源的最短路径最为引人注目。受其启发,意大利学者M.Dorigo,V.Maniezzo and A.colorni于20世纪90年代初提出的一种新型的智能优化算法蚁群优化 (Ant Colony Optimization,简称ACO)。它通过信息素的积累和更新来寻求最优解,主要特点是模拟自然界中蚂蚁的群体行为。目前国内外研究者用蚁群算法研究了旅行商问题,指派问题,调度问题等,取得了一系列较好的实验结果。蚁群算法具有分布式并行搜索能力,较强的鲁棒性和易于与其他算法结合等优点,但同时也存在着一些不足之处:(1)与其他算法相比该算法需要较长的搜索时间;(2)该算法容易早熟,即搜索进行一定程度后,所有个体所发现的解完全一致,不能对解空间进行进一步搜索;(3)初始解和初始信息素随机。

近几年,人们提出了多种方法来解决蚁群算法的这三个缺点,其中蚁群算法与其

他算法混合产生新的混合算法是一个研究方向,例如禁忌算法与蚁群算法混合,遗传算法与蚁群算法混合,粒子群算法与蚁群算法混合等。这些算法应用于TSP问题或函数优化问题的求解取得了较好效果。

人工免疫系统 (Artificial Immune System,简称AIS)是模仿生物免疫系统的免疫应答、免疫调节等机理,构造出的一类高性能、自组织、鲁棒性好的人工智能系统。目

前,人工免疫系统的研究己经受到学者们越来越广泛的关注,人工免疫算法也在实际工程应用中得到了推广。人工免疫成为继神经网络、模糊逻辑和进化计算后人工智能领域又一研究热点。免疫系统是一种复杂的分布式信息处理学习系统,这种系统具有免疫防护、免疫耐受、免疫记忆、免疫监视功能,这些功能和特点给予研究人员较多的灵感,促成许多学者建立了基于免疫机理的智能方法,解决大量的非线性科学问题。本文将人工免疫算法与蚁群算法混合产生新的算法免疫蚁群算法(Artificial Immune Ant Colony Algorithm,简称AIACA),并将该算法应用于匹配检测,计算机仿真结果证明该算法是计算精度都较好的一种算法。

1.2.本课题的开发意义

本课题通过蚁群优化算法改进人工免疫算法,主要改进人工免疫算法中通过抗体与抗原之间的亲和力以及抗体与抗体之间的排斥力来选择抗体的方法。采用人工免疫算法生成信息素分布,利用蚁群算法求优化解,优势互补,在收敛速度和寻优能力两方面较原有算法都有明显改善。

第二章关键技术

2.1. Linux 基本知识

2.1.1 Linux的发展历史

Linux的历史可以追溯到1990年,Linus Torvalds还是芬兰赫尔辛基大学的一名学生,最初用汇编语言写了一个在80386保护模式下处理多任务切换的程序,后来从Linux(用于操作系统教学、很小的Unix)中得到灵感,发誓要写一个比Linux更好的Linux,于是开始写了一些硬件的设备驱动程序、一个小的文件系统......,这样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终于诞生。Linux 1.0已经是一个功能完备的操作系统了,其内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好

很多人对Linux的认识有个误区,即总把Linux与低档硬件平台联系到一起,其实从2.1.xx系列内核开始,Linux就开始走高端的路子了,大约在1.3版本之后,开始向其他硬件平台上移植,包括号称最快的CPU---Digital Alpha(目前主频是最高的),目前Linux能将硬件的性能充分发挥出来,可以囊括低端到高端的所有应用。

Linux加入GNU并遵循公共版权许可证(GPL),由于不排斥商家对自由软件进一步开发,不排斥在Linux上开发商业软件,故而使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]"得到该命令的帮助,如果想知道一个命令有哪些参数,可以打command -help来得到。

注意:Linux中的参数输入形式和dos不一样,在命令后面应该打一个空格,然后打"-",最后再跟一个或多个参数;另外Linux下大小写是有区别的!

下面介绍几个Linux下最常用的命令,每个命令都与对应的dos命令作比较,并列出一些常用的参数。

命令参数意义

Ls

-a列出系统中的隐含文件,linux下的隐含文件是靠文件名的格式来表示的,不同于dos是靠文件属性来表示,即只要该文件以“.”开头,那么它就是隐含文件。

-l以长式列出。就是把该文件或目录的所有信息都列出来,一个文件占一行

相当于dos下的dir命令,是列文件列表的命令。

cd 和dos下的cd一样,转换目录的命令。注意:linux下转到上级目录要打"cd .."而不是dos下的"cd..",即"cd"后面要有个空格

pwd 列出当前目录命令,相当于dos下没有参数的cd命令。例如:

[root@ttqq bin]# pwd /usr/bin [root@ttqq bin]# 这表示目前在"/usr/bin"目录下。 Mkdir

-m mode表示建立目录时默认的目录模式。这个是dos和Windows所没有的功能,主要是关于权限的问题。

建立新目录,相当于dos的md命令。一般就用 mkdir [dirname]

rmdir 删除目录,相当于dos的rd命令。

用法: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所遵循的部分约定规则:

.c为后缀的文件,C语言源代码文件;

.a为后缀的文件,是由目标文件构成的档案库文件;

.C,.cc或.cxx 为后缀的文件,是C++源代码文件;

.h为后缀的文件,是程序所包含的头文件;

.i 为后缀的文件,是已经预处理过的C源代码文件;

.ii为后缀的文件,是已经预处理过的C++源代码文件;

.m为后缀的文件,是Objective-C源代码文件;

.o为后缀的文件,是编译后的目标文件;

.s为后缀的文件,是汇编语言源代码文件;

.S为后缀的文件,是经过预编译的汇编语言源代码文件。

执行过程

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有

的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

基本用法

在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc 编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。

Gcc最基本的用法是∶gcc [options] [filenames]

其中options就是编译器所需要的参数,filenames给出相关的文件名称。

-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。

-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶

A)#include

B)#include “myinc.h”

其中,A类使用尖括号(< >),B类使用双引号(“”)。对于A类,预处理程序cpp 在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。

2.2. 基本蚁群算法

2.2.1 基本蚁群算法

蚁群优化算法是一种受自然界生物行为启发而产生“自然”算法。产生于对蚁群行为的研究。蚁群中的蚂蚁以“信息素”(pheromone)为媒介,间接异步的相互联系。这是蚁群优化算法的最大特点。蚂蚁在行动过程中(寻找食物或寻找回巢的路径)中,会在他们经过的地方留下一些化学物资,称之为“信息素”。这些物资能被同一蚁群中后来的蚂蚁感受到并作为一种信号影响后者的行动。具体表现在后到的蚂蚁选择有这些物资的路径的可能性比选择没有这些物资的路径的可能性大得多。后到者留下的信息素会对原有的信息素进行加强,并循环下去。这样,经过蚂蚁越多的路径会被越多的蚂蚁访问,因而积累的信息素也就越多,在下一个时间内被其他蚂蚁选中的可能性也就越大。这个过程会一直持续到所有的蚂蚁都走最短的那一条路为止。

通过图2.1简单的了解蚂蚁的运动过程。假设一个蚂蚁外出寻找食物,蚂蚁从nest 点出发,行走速度相同,食品在food点,蚂蚁可能行走的路线如图2.1。由于无法预知道路中间的情况,蚂蚁出发时会随机选择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路线的蚂蚁返回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路线的第一点信息素的比值会越来越大,最后的极限是所有的蚂蚁只选择nest-B-food路线。

图2.1:蚂蚁寻物过程的简化图

为了更好的描述蚁群算法,下面所有的符号和算法设计以TSP 为基础,其它应用可以据此进行改进。令),,,,(1in id i i x x x x =为n 为搜索空间中第i 只蚂蚁的位置。假设),,,,(1s

j j

i x x x i s =≠表示第i 只蚂蚁可以去的所有位置的集合。等式(2.1)给出了第i 只蚂蚁向第j 个位置移动的概率函数,并且位置i x 与位置

j x 之间的信息素ij τ的值越大、先验值ij η的值越大选择路径i-j 的概率越大,其中ij η为j i x x J -1,这里j i x x J -1

是由位置i x 移

动到位置j x 的耗费,通常由目标函数决定,它可以是两点间的距离或花费的费用。等式中的α,β是两个系数,分别为残留信息素和转移耗费的相对重要程度。

∑=-??=s l il il ij ij x x t t t t t P j i 1)]([)]([)]([)]([)(β

αβαητ

ητ (2.1)下一个位置可以根据)(t P j i x x -的最大值来选择或是用轮盘赌来随机的选择下一个位置。

当一个蚂蚁走完了所选的路径,则按式(2.2)更新信息素值。在每一次循环结束后,每条路径上的信息数值都按(2.3)式进行更新,其中是g ρ全局信息素挥发系数,10≤≤g ρ。

10);()()1()1(≤≤??+?-=+ρτρτρτt t t ij ij ij (2.2) )()1()1(t t g τρτ?-=+ (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)蚂蚁数目 k ←k+1 。

(5)蚂蚁个体根据状态转移概率公式(1)计算的概率选择元素(城市) j 并前进,j ∈{C - tabuk}。

(6)修改禁忌表指针,即选择好之后将蚂蚁移动到新的元素(城市),并把该元素(城

市)移动到该蚂蚁个体的禁忌表中。

(7)若集合C 中元素(城市)未遍历完,即k

(8)根据公式(2.2)和式(2.3)更新每条路径上的信息量。

(9)若满足结束条件,即如果循环次数Nc ≥ Ncmax 则循环结束并输出程序计算结果,否则清空禁忌表并跳转到第(2)步。

2.2.3蚁群算法流程图

图2.2 基本蚁群算法程序流程图

2.2.4复杂度分析

对于TSP ,所有可行的路径共有(n-1)!/2条,以此路径比较为基本操作,则需要(n-1)!/2-1次基本操作才能保证得到绝对最优解。

若1M FLOPS ,当n=10, 需要0.19秒

n=20, 需要1929年 输出程序计算结果 按式(2)和式(3)进行信息量更新 修改禁忌表 按式(1)选择下一元素 蚂蚁k=1 循环次数Nc← Nc+1 初始化 开始

结束 K≥m 满足结束条件 蚂蚁k=k+1 N Y Y N

相关主题
文本预览
相关文档 最新文档