智能计算之蚁群算法.docx
《智能计算之蚁群算法.docx》由会员分享,可在线阅读,更多相关《智能计算之蚁群算法.docx(17页珍藏版)》请在冰豆网上搜索。
![智能计算之蚁群算法.docx](https://file1.bdocx.com/fileroot1/2023-6/14/82a5aa71-a306-445c-bd7e-320dc47eb860/82a5aa71-a306-445c-bd7e-320dc47eb8601.gif)
智能计算之蚁群算法
第三章根本蚁群算法原理
3.1自然界中的蚂蚁
在蚂蚁寻找食物的过程中,总能找到一条从蚁穴到随机分布的距离很远的食物源之间的最短路径。
仿生学家经过研究发现,蚂蚁没有视觉,但是在寻找食物的行进过程中,会不断分泌一种化学刺激物一一信息素,蚂蚁之间通过它来相互通信。
信息素量与路径长度有关,路径越长,释放的信息素浓度就越低。
信息素可以吸引后来的蚂蚁沿信息素浓度高的路径行进。
某一路径上走过的蚂蚁越多,留下的信息素就越多,后来者选择该路径的概率就越大,蚂蚁个体之间就是通过这种信息的交流搜索食物,这样,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反应现象,整个蚁群最终会选择出最短路径行进。
图3.1现实蚂蚁寻找食物
如图3.1(a)所示,蚂蚁在点A和E之间的路径上行走,路径突然被
出现的障碍物截断,如3.1(b)所示。
因此,蚂蚁从A至E步行至位置B
(或以相反的方向在位置D处)必须决定是否要向左或向右转。
一开始蚂
蚁按同等概率选择路径,不管路径长短。
第一只蚂蚁到达B点〔或D〕具
有相同的概率向左或向右转。
由于路径BCD比BHD短,以路径BCD第
一个到达的蚂蚁比以路径BHD到达的早。
由于一半蚂蚁是以偶然的方式
通过DCBA障碍的或者已经通过路径BCD到达的,于是,一个蚂蚁从E
到D返回会在路径DCB上找到一个更强有力的线索。
因此他们极大概率上选择通过路径DCB而不是DHB。
因此,单位时间内通过路径BCD的蚂蚁要比通过路径BHD的蚂蚁多的多,如图3.1〔c〕。
这将导致较短路径上的信息素量增长地比拟长路径上的快得多,因此单一蚂蚁路径的选择很快偏向于较短路径。
最后的结果是很快所有的蚂蚁会选择较短的路径[1]。
不仅如此,作为一种化学物质,信息素还具有挥发性,这使得寻径初期距离较长的路径和长期没有经过的路径对蚂蚁的影响逐渐减小。
可
见,在整个寻找食物的过程中,虽然单个蚂蚁的选择能力有限,但是通过信息素的作用是整个蚁群行为具有非常高的自组织性,蚂蚁之间交换着路径信息,最终通过蚁群的集体自催化行为找出最优路径[3,4]。
3.2算法中的蚂蚁
蚁群算法是对自然界蚂蚁的寻径方式进行模拟而得出的一种仿生算法。
此算法的本质在于:
选择机制:
信息素越多的路径,被选择的概率越大;
更新机制:
路径上的信息素会随蚂蚁的经过次数增加而增长,而且同
时也会随时间的推移逐渐挥发消失;
协调机制:
蚂蚁之间实际上是通过信息素来相互通信、协同工作的。
作为一种应用于组合优化问题的算法,根本蚁群算法的逻辑结构〔如图3.2所示〕可以表述为:
先将具体的优化组合问题表述成标准的格式,然后利用蚁群算法在“探索〞和“利用〞之间根据信息素这一反应载体确定决策点,同时按照相应的信息素更新规那么对每只蚂蚁个体的信息素进行增量构建,随后从整体角度规划出蚁群活动的行为方向,周而复始,即可求
出组合优化问题的最优解
[3]
>蚂蚁活动规划
决策点
问题表达
图3.2根本蚁群算法的逻辑结构
第四章根本蚁群算法的数学模型
4.1TSP问题[3,4]
旅行商问题,可以描述为:
给定n个城市,任何两个城市之间皆有路
连通,且城市间距离,某旅行商从其中某城市出发,要经过每个城市一次,且只能一次,最后乂必须返回出发城市,要求找出最短的巡回路径。
旅行商问题是运筹学中有代表的组合优化问题,也是典型NP-complete
类问题.虽然陈述起来很简单,但求解却很困难。
对丁具有n个城市规模
的TSP问题,其可能的闭合路径数目为(n-1)!
/2。
在理论上枚举法可以解决
这一问题,但是当n较大时,解题所需的计算时间和存储空间的消耗会使枚举法显得没有任何实际价值。
4.2数学模型
4.2.1模型建立
蚁群算法是对现实蚂蚁觅食行为的模拟,因此需要对现实蚂蚁进行抽象。
现实蚂蚁存在丁三维空间中,而问题空间抽象为一个二维平■面一一图。
蚂蚁在连续平■面运动,其运动经过的总是离散点,连续的平■面可以离散化为由一组点组成的离散平■面,可供计算机处理。
现实蚂蚁在觅食过程中主要按照所处环境的信息素量来决定前进方向,在算法构造过程中,信息素被抽象为图的边上的轨迹,蚂蚁到达每一节点处根据边上的信息素浓度选择下一节点。
蚂蚁从初始节点(巢穴)按照一定转移概率选择下一节点,最终选择行走到目标节点(食物源),这样便得到了TSP问题的一个可行
解。
给出一个n个城市组成的集合,TSP问题可以被描述为访问每个城市
一次找到最短路程的封闭式旅行问题。
bi(t)(i=1,...,n)表示t时刻在城市i
中的蚂蚁数量,mbi(t)是蚂蚁的总数。
Tij(t)为t时刻从城市i到城市j
i=1
路径上的信息量,初(0)可以设置为任意数值(在实验中是每条路径上的一
个很小的数值)。
城市i和城市j之间的距离定义为dij(dij=[(xi-xj)2+
(yi-yD2]1/2)。
为了约束蚂蚁访问所有的城市而不重复访问(即确定一个n城市的循
环),我们为每个蚂蚁定义一个数据结构用丁记录蚂蚁k访问过的城市,
称为禁忌表tabuko在蚂蚁行动过程中tabuk动态调整,当一次循环结束后
活空禁忌表,蚂蚁重新选择路径,重新填充禁忌表。
在行进过程中,蚂蚁根据每条路径上的信息素量及路径的启发信息来计算转移概率pij。
启发函数*等丁1/dj,表示蚂蚁从城市i转移到城市j
的期望程度。
城市i到城市j的转移概率定义为
jallowedk
[ij(t)「*[J
'、[is(t)「*[is]'
shallowedk
(4.1)
其中,allowedk={C-tabuk}表示蚂蚁k下一步允许选择的城市。
a和E分别
是表示允许用户控制轨迹和能见度的相对重要性的参数,«反映了蚂蚁在
运动过程中所积累的信息在运动时所起的作用,P反映了蚂蚁在运动过程
中启发信息在选择路径时的受重视程度。
4.2.2信息素更新[3,5]
现实蚂蚁在经过的路径上不断地留下信息素,而信息素随着时间的推
移不断地挥发改变。
在计算机中,当蚂蚁完成一次对n个城市遍历的循环
后需要对信息素含量进行一次更新。
ij(t+n)=(1-/*ij(t)+「ij(t)
(4.2)
mij(t)=ZArijk(t)
kM
(4.3)
其中,P表示信息素挥发系数,1-P那么表示信息素残留因子。
ijk(t)表示第
k只蚂蚁在本次循环中留在路径(i,j)上的信息素量。
为了防止某条路段因为信息素浓度过低而不能被蚂蚁选择,每条道路上的信息素浓度设立取值的下限Tmin。
当某路段上的信息素浓度小丁下限
Sin时,那么将其强制更正,同样也设置其上限Tmaxo
关丁如何计算Aiijk(t)和何时更新莉(t)的不同选择出现了三种不同的蚁群算法模型:
ANT-density模型,ANT-quantity模型和ANT-cycle模型。
在ANT-quantity模型中
krQ/dij,假设第k只蚂蚁在本次循环中经过路径(i,j)
A"(t)L0,否那么
(4.4)
在ANT-density模型中我们有
kJQ,假设第k只蚂蚁在本次循环中经过路径(i,j)
△〞(t)L0,否那么
(4.5)
在ANT-cycle模型中
k「Q/Lk,假设第k只蚂蚁在本次循环中经过路径(i,j)
:
j(t)=
L0,否那么
(4.6)
式中,Q表示信息素强度,在一定程度上影响算法的收敛速度。
Lk表
示蚂蚁k在本次循环中所走路径的总长度。
式(4.4)(4.5)中利用的是局部信息,蚂蚁完成每一步后需更新路径上的信息素量;式(4.6)中利用的是整体信息信息,信息素量在一个循环后而不是每一步单独的移动后更新,求解TSP问题性能较好,本文中就采用这种模型作为蚁群算法的根本模型。
4.2.3参数设置[5]
采用ANT-cycle模型执行时优丁其他两种模型,对参数的变化也更为明智。
信息启发式因子a:
S时的值小导致了收敛速度慢,«>2时会较早
收敛到次优,最正确取值范围为1^xv1.5
期望启发式因子口:
0>5时收敛过快,系统迅速在次优循环处卡住,
时收敛缓慢,1v5时值增大收敛速度加快。
信息素挥发系数P:
值低丁0.2或大丁0.5时收敛速度较慢,约。
.3时最正确
信息素强度Q:
效果不显著,本次实验取100。
第五章根本蚁群算法的算法流程
5.1算法运行步骤
以TSP问题为例,根本蚁群算法的具体实现步骤如下:
1.参数初始化:
令t=0
设置最大循环次数NcMax,循环次数Nc=0
将m只蚂蚁置丁n个节点上,在每个节点i放置bi(t)只蚂蚁
初始化每条边(i,j)上的信息素量Tij(0)=C为一个常量,初始时刻.ijk(0)=0
初始化禁忌表tabuk及路线表routek
2.设置索引号s=1,对k=1~m将蚂蚁k的起始城市放入禁忌表中,并
重复以下步骤直至禁忌表填充完整:
对k=1~m,利用式(4.1)计算转移概率pij,根据伪随机比例规那么选择下一城市,将蚂蚁k移动到下一城市j并将其填入禁忌表,同时记录蚂蚁k的路线
s++
3.对k=1~m,根据routek的记录计算蚂蚁k所走循环路径的总长度,
找到最正确路线
4.按式(4.6)计算每只蚂蚁的信息素增量&ijk(t)
5.更新每条路径上的信息素量Tij(t+n)
6.活空禁忌表及路线表
7.Nc++,假设Nc5.2算法运行流程
以TSP问题为例,根本蚁群算法的程序结构流程如图
5.1所示:
开始
图5.1根本蚁群算法的程序流程图
1.计算启发函数nij=1/dij:
for(i=0;ifor(intj=0;j(
if(j!
=i)
yita[i][j]=1/distance[i][j];
}
2.路线及禁忌表更新
路线表route[][]初始值为-1,禁忌表tabu[][]初始值为0。
将蚂蚁分别放置在初始节点(城市)上,记录路线及修改禁忌表第一
项:
for(k=0;k{—
route[k][0]=(k+m_N)%m_N;
tabu[k][route[k][0]]=1;
}
所有蚂蚁开始寻找下一节点,利用公式4.1计算转移概率p,当p大
于随机生成的(0,1)中的数时,那么可选择此节点,记录路线,修改禁忌表:
for(intk=0;k{
intjrand=rand()%3000;
drand=double(jrand)/3001;
partsum=0;p=0;
for(intj=0;j{
if(tabu[k][j]==0)
partsum+=pow(T[route[k][s-1]][j],m_alfa)*pow(yita[route[k][s-1]][j],m_beta);
}
for(j=0;j{
if(tabu[k][j]==0)
p+=pow(T[route[k][s-1]][j],m_alfa)*pow(yita[route[k][s-1]][j],m_beta)/partsum;
if(p>drand)break;
}
tabu[k][j]=1;
route[k][s]=j;}
3.m只蚂蚁进行一次遍历后,计算所有蚂蚁循环路线的总长度,比拟
得出最短路径长度,记录最正确路线:
for(k=0;k{—
doubled=0;
for(i=0;id+=distance[route[k][(i+m_N)%m_N]][route[k][(i+m_N+1)%m_
N]];__——
solution[k]=d;
}
for(k=1;kif(solution[k]{
bestsolution=solution[k];//最短路径长度
for(s=0;sbestroute[s]=route[k][s];//最正确路线
}
4.信息素量的更新:
使用ANT-cycle模型,&ij(t)的计算依照公式4.6,
可依照公式4.2计算。
此外,为了防止某条路段因为信息素浓度过低或过高影响蚂蚁选择结果,每条道路上的信息素浓度设立取值的上下限。
当某路段上的信息素浓度超过此区间时,那么将其强制更正。
doubleT[50][50];//信息量
doubledetaT[50][50];//信息量增量
doubledistance[50][50];//两城市间距离
doubleyita[50][50];//启发函数
inttabu[30][50];//禁忌表
introute[30][50];//路线
doublesolution[30];//路径长度
intbestroute[50];//最正确路径记录
doublebestsolution=10000000000;//记录最正确路径长度
〃城市坐标
intx[50]=
{
37,49,52,20,40,21,17,31,52,51,
42,31,5,12,36,52,27,17,13,57,
62,42,16,8,7,27,30,43,58,58,
37,38,46,61,62,63,32,45,59,5,
10,21,5,30,39,32,25,25,48,56
};
inty[50]={
52,49,64,26,30,47,63,62,33,21,41,32,25,42,16,41,23,33,13,58,42,57,57,52,38,68,48,67,48,27,69,46,10,33,63,69,22,35,15,6,17,10,64,15,10,39,32,55,28,37
};
for(inti=0;idistance[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));distance[i][j]=distance[j][i];
}
for(i=0;iT[i][j]=m_inittao;//初始信息素量
if(j!
=i)yita[i][j]=1/distance[i][j];
}
for(intk=0;kfor(i=0;i}
for(k=0;k{
route[k][0]=(k+m_N)%m_N;
tabu[k][route[k][0]]=1;
}
srand(time(NULL));
intNc=0;do{
ints=1;
doubledrand;
doublepartsum;
doublep;
while(s{
for(intk=0;k{—
intjrand=rand()%3000;
drand=double(jrand)/3001;
partsum=0;p=0;
for(intj=0;j{
if(tabu[k][j]==0)
partsum+=pow(T[route[k][s-1]][j],m_alfa)*pow(yita[route[k][s-1]][j],m_beta);
}
for(j=0;j{
if(tabu[k][j]==0)
p+=pow(T[route[k][s-1]][j],m_alfa)*pow(yita[route[k][s-1]][j],m_beta)/partsum;
if(p>drand)break;
}
tabu[k][j]=1;
route[k][s]=j;
}
s++;
}
for(k=0;k{
doubled=0;
for(i=0;id+=distance[route[k][(i+m_N)%m_N]][route[k][(i+m_N+1)%m_N]];
solution[k]=d;
}
for(k=1;kif(solution[k]{
bestsolution=solution[k];
for(s=0;sbestroute[s]=route[k][s];
}
for(i=0;ifor(intj=0;jdetaT[i][j]=0;
}
for(k=0;k{—
for(s=0;sdetaT[route[k][s]][route[k][s+1]]+=m_Q/solution[k];
detaT[route[k][m_N-1]][route[k][0]]+=m_Q/solution[k];
}
for(i=0;ifor(intj=0;j{
T[i][j]=(1-m_rou)*T[i][j]+detaT[i][j];
if(T[i][j]<0.00001)
T[i][j]=0.00001;
if(T[i][j]>20)
T[i][j]=20;
}
for(intk=0;kfor(intj=1;j{
tabu[k][route[k][j]]=0;
route[k][j]=-1;
}
Nc++;
}while(Nc