当前位置:文档之家› 95蚁群算法求解TSP的基本思想

95蚁群算法求解TSP的基本思想

95蚁群算法求解TSP的基本思想
95蚁群算法求解TSP的基本思想

Ch9 蚁群算法

9.1生物学知识

1、蚁群算法(Ant Colony Algorithm ,ACA)是由意大利M. Dorigo等人于1990到2000发展起来的,模拟进化算法。模拟了自然界蚂蚁群体的觅食行为。

2、蚁群社会

在昆虫世界中,蚂蚁的组成是一种群居的蓼袭大家庭,称为蚁群。蚁群中除了亲缘上的互助关系外,成蚁划分为世袭制的蚁王和工蚁两个等级,蚁群的大小从几十个到几千万个,蚁群具有高度组织的社会性,彼此间的沟通不仅可以借助触觉的的联系,在大规模的协调行动上,借助外激素之类的生化信息介质。

其中每个工蚁具有如下的职能:

平时在巢穴附近作无规则行走;

一旦发现食物,如果独自能搬的就往回搬,否则就回巢穴搬兵;

一路上它会留下外激至少的嗅迹,其强度与食物的品质和数量成正比;

其他工蚁遇到嗅迹,就会循迹前进,也会有一定的走失率(选择其他路径),走失率与嗅迹的强度成反比。

蚁群的行为表现出一种信息正反馈的现象;

某一路径上走过的蚂蚁越多,则后来选择该路径的概率就大,蚂蚁个体间就是通过这种信息的交流达到搜索食物的目的。

3、蚁群觅食过程

意大利学者M. Dorigo是最早发现蚂蚁的觅食习性的,蚂蚁总能找到巢穴与食物源之间的最短路径。

蚂蚁在寻找食物源后,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。当某些路径上走过的蚂蚁越来越多时,留下的信息素也会越来越多,以致后蚂蚁选择该路径的概率也越来越高,从而更增加了该路径的吸引强度,逐渐形成了一条它们自己事先并未意识到的最短路线。

蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径的信息素的浓度,形成一个正反馈。

路径上的信息浓度会随时间的推进,而不断挥发,从而不断降低,这似乎也是变异。

9.2ACA算法的基本思想

左图表示初始状态中,在结点A与C有30只蚂蚁,线上的数字(1,0)表示距离为1,

信息素为0。此时每条边上的信息素均为0,故蚂蚁按随机行走,A 、C 出发时,走两边的概率相等。

单位时间后,A 出发的蚂蚁,15只达到了B 、15只经D 到达C 。C 出发的蚂蚁,15只达到了B,15只经D 到达了A ,如右上图所示。各边的信息素如右图所示,A-B 有15只蚂蚁走过,留下的信息素是15个单位,C-B 也是15只蚂蚁,留下的信息素也是15,此时到B 的蚂蚁是15+15=30只。A-D-C 的蚂蚁是15只,C-D-A 的也是15只,故该条较短路线上的信息素为30个单位。

蚂蚁再往前走:

A 点:由于A-

B 的信息素是15个单位,A-D 是30单位,故A-D 的蚂蚁数是A-B 的2倍,因此A-B 的蚂蚁5只,A-D 是10只

C 点:C-B 是5只,C-

D 是10只 B 点:B-A 是15只,B-C 是15只 单位时间后: A 点:10+15=25 C 点:10+15=25 B 点:5+5=10 信息素:

A-B 为15+15+5=35,C-B 为15+15+5=35, A-D=30+10+10=50,C-D 为30+10+10=50

再出发

A 点:A-

B 方向=25*35/85=10 A-D 方向为15只。 两边各占0.41:0.59

C 点:C-B 是10只,C-

D 是15只 B 点:B-A 是5只,B-C 是5只 单位时间后: A 点:5+15=20 C 点:5+15=20 B 点:10+10=20 信息素:

A-B 为35+10+5=50,C-B 为35+5+10=50, A-D=50+15+15=80,C-D 为50+15+15=80

再出发50/130=0.46 80/130=0.54

A点:A-B方向=20*50/130=6 A-D方向为14只。

C点:C-B是6只,C-D是14只

B点:B-A是10只,B-C是10只

单位时间后:

A点:10+14=24

C点:10+14=24

B点:6+6=12

信息素:

A-B为50+6+10=66,C-B为50+6+10=66,

A-D=80+14+14=108,C-D为80+14+14=108

两边浓度比为66/174=0.38 108/174=0.62

9.3优缺点

优点:

(1)蚁群算法是一种分布式内在并行算法。单个蚂蚁的搜索过程是彼此独立的,易于局部最优,通过个体间不断的信息交流和传递有利于发现较好解。

(2)蚁群算法是一种正反馈算法。路径上的信息素浓度较高,将吸引更多的蚂蚁沿这条路径运动,又使得信息素浓度增加,加快了算法的进化过程。

(3)蚁群算法具有较强的自适应性,对其模型稍做修改,可应用于其他问题。

(4)易于其他方法组合,以改善算法的效率。

缺点:

(1)需要较长时间搜索。主要是因为各蚂蚁的运动是随机的,当群体规模稍大时,需要很长时间才能收敛。

(2)易出现停滞现象,早熟现象。

9.4蚁群算法的研究进展

1、20世纪90年代意大利Dorigo、Maniezzo等人提出该算法。

2、1999年,Dorigo提出了蚁群优化(Ant Colony Optimization)的通用框架。

3、2002年8月,出版蚁群优化算法的特刊。

4、从1998年起,每隔二年在比利时的布鲁塞尔举行一次蚁群算法的国际会议。

5、涉及到领域有生物学、物理学、工程学、计算机科学。

6、Bichev和parmee提出了求解连续空间的蚁群算法模型。

7、2004年李士勇等蚁群算法的专著

8、2005年段海滨《蚁群算法原理及应用》专著

9、2006年吴启迪《智能蚁群算法及应用》

9.5蚁群算法求解TSP的基本思想

1、基本参数、信息素浓度公式、择路概率

设蚂蚁的数量为m,

城市的数量为n,

城市i与城市j之间的距离为dij,

t 时刻城市i 与城市j 之间的信息素浓度为t ij (t),初始时刻,各个城市间连接路径上的信息素浓度相同,不妨记为t ij (0)=t0.

蚂蚁k(k=1,2,..,m)根据各城市间连接路径上的信息素浓度,决定其下一个要访问的城市,设P ij k (t)表示t 时刻,蚂蚁k 从城市i 到城市j 的概率,其计算公式为如下:

ij [()][()][()][()]

P 0ij ij k k

ij ij s allow

k

t t t s allow t t t s allow αβαβηη∈??∈???=?????

其中:

ηij (t)为启发式函数,ηij (t)=1/dij ,表示蚂蚁从城市i 转移到城市j 的期望程序

allow k (k=1,2,…,m)表示蚂蚁k 待访问的城市的集合,开始时allow k 为其他n-1城市,随着时间推进,其中的元素不断减少,直至为空,表示所有城市访问完,即遍历所有城市。

α为信息素的重要程度因子,其值越大,转移中起的作用越大

β为启发函数的重要程度因子,其值越大,表示启发函数在转移中的作用越大,即蚂蚁以较大的概率转移到距离短的城市。

蚂蚁释放的信息素会随时间的推进而减少,设参数ρ(0<ρ<1)表示信息素的挥发度,当所有蚂蚁完成一次循环后,各个城市间连接路径上的信息素浓度,需要实时更新。

t ij (t+1)=(1-ρ)t ij (t)+?t ij ,?t ij =1n

k

ij k t =?∑

其中:

?t ij k 表示蚂蚁k 在城市i 与城市j 的连接路径上,释放的信息素浓度 ?t ij 表示所有蚂蚁在城市i 与城市j 的连接路径上,释放的信息素浓度。

2、?t ij k 的计算方法

Dorigo 曾给出了3种不同的模型,分别如下: (1)ant cycle system ?t ij k =/0

k Q L k ??

?第只蚂蚁从城市i访问城市j

其他

其中:

Q 为常数,表示蚂蚁循环一次释放的信息素的总量 d ij 为第k 只蚂蚁经过路径的长度,Length 一般选用该模型

(2)ant quantity system ?t ij k =/0Q dij k ??

?

第只蚂蚁从城市i访问城市j

其他

其中:

Q 为常数,表示蚂蚁循环一次释放的信息素的总量 dij 为城市i 到城市j 的距离。

(3)ant density system ?t ij k =0Q k ??

?

第只蚂蚁从城市i访问城市j

其他

其中:

Q 为常数,表示蚂蚁循环一次释放的信息素的总量

9.6蚁群算法解决TSP 问题的基本步骤

1、初始化参数

蚂蚁数量m ,信息素重要程度α,启发函数重要程度β,信息素挥发因子ρ,信息素释放总量Q ,最大迭代次数iter_max 。获取各城市之间的距离dij ,为了保证启发式函数ηij =1/dij 能顺利进行,对于i=j 即自己到自己的距离不能给为0,而是给成一个很小的距离,如10-4或10-5。

2、构建解空间

将各个蚂蚁随机地置于不同出发点,对每个蚂蚁按归照下式,确定下一城市。

ij [()][()][()][()]

P 0ij ij k k ij ij s allow

k

t t t s allow t t t s allow αβηη∈??∈??

?=?????

3、更新信息素

计算各个蚂蚁经过的路径长度Lk ,记录当前迭代次数中的最优解(即最短路径),根据如下公式更新信息素:

t ij (t+1)=(1-ρ)t ij (t)+?t ij ,?t ij =1n

k

ij k t =?∑

?t ij k =/0

k

Q L k ??

?第只蚂蚁从城市i访问城市j

其他

4、判断是否终止

若没有到最大次数,则清空蚂蚁经过路径的记录表,返回步骤2。

9.7TSP 实例

1、访问我国每个省会城市一次也仅一次的最短路径,共有31个

2、如果采用枚举法,巡回路径可能1.326?1032种。

3、城市的坐标citys ,这是直角坐标,根据二个城市的坐标值,可以用

可计算出任意二个城市间的距离。 citys = 1304 2312 3639 1315 4177 2244 3712 1399 3488 1535 3326 1556 3238 1229 4196 1004 4312 790 4386 570 3007 1970 2562 1756 2788 1491 2381 1676

1332 695

3715 1678

3918 2179

4061 2370

3780 2212

3676 2578

4029 2838

4263 2931

3429 1908

3507 2367

3394 2643

3439 3201

2935 3240

3140 3550

2545 2357

2778 2826

2370 2975

程序清单

%% 蚁群算法计算旅行商问题(TSP)

%% 清空环境变量

clear all

clc

%% 导入数据

load citys_data.mat

%% 计算城市间相互距离

n = size(citys,1); %城市的个数

D = zeros(n,n); %n行n列的矩阵,即任意二个城市之间的距离for i = 1:n

for j = 1:n

if i ~= j

D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));

else

D(i,j) = 1e-4;

end

end

end

%% 初始化参数

m = 50; % 蚂蚁数量

alpha = 1; % 信息素重要程度因子beta = 5; % 启发函数重要程度因子

rho = 0.1; % 信息素挥发因子

Q = 1; % 常系数

Eta = 1./D; % 启发函数

Tau = ones(n,n); % 信息素矩阵,全1矩阵

Table = zeros(m,n); % 路径记录表,全0矩阵,每只蚂蚁依次走过的城市

iter = 1; % 迭代次数初值

iter_max = 200; % 最大迭代次数

Route_best = zeros(iter_max,n); % 各代最佳路径

Length_best = zeros(iter_max,1); % 各代最佳路径的长度

Length_ave = zeros(iter_max,1); % 各代路径的平均长度

%% 迭代寻找最佳路径

while iter <= iter_max

% 随机产生各个蚂蚁的起点城市

start = zeros(m,1); %m是蚂蚁的个数,m行1列的矩阵,记录每个蚂蚁的城市编号

for i = 1:m

temp = randperm(n);

start(i) = temp(1);

end

Table(:,1) = start; %路径记录表的1列,为每个蚂蚁的起点城市

% 构建解空间

citys_index = 1:n;

% 逐个蚂蚁路径选择

for i = 1:m

% 逐个城市路径选择

for j = 2:n

tabu = Table(i,1:(j - 1)); % 已访问的城市集合(禁忌表)

allow_index = ~ismember(citys_index,tabu);%不是tabu城市就是要访问的城市

allow = citys_index(allow_index); % 待访问的城市集合

P = allow;

% 计算城市间转移概率

for k = 1:length(allow)

P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;

end

P = P/sum(P);%规一化

% 轮盘赌法选择下一个访问城市

Pc = cumsum(P);%依次累加,是实现轮盘赌法选择的方法

target_index = find(Pc >= rand);

target = allow(target_index(1));

Table(i,j) = target;

end

end

% 计算各个蚂蚁的路径距离

Length = zeros(m,1);%m行1列的矩阵

for i = 1:m

Route = Table(i,:);%第i只蚂蚁的路线

for j = 1:(n - 1)

%依次计算第i只蚂蚁所走过的各城市间的距离j-j+1

Length(i) = Length(i) + D(Route(j),Route(j + 1));

end

Length(i) = Length(i) + D(Route(n),Route(1));%加上最后城市到首个城市的距离end

% 计算最短路径距离及平均距离

if iter == 1

[min_Length,min_index] = min(Length); %各只蚂义中路长的最小值

Length_best(iter) = min_Length;

Length_ave(iter) = mean(Length);

Route_best(iter,:) = Table(min_index,:);%取取最短路线

else

[min_Length,min_index] = min(Length);

%如果不是第一轮,则要与上轮最小路长进行比较

Length_best(iter) = min(Length_best(iter - 1),min_Length);

Length_ave(iter) = mean(Length);

if Length_best(iter) == min_Length

Route_best(iter,:) = Table(min_index,:);

else

Route_best(iter,:) = Route_best((iter-1),:);

end

end

% 更新信息素

Delta_Tau = zeros(n,n);

% 逐个蚂蚁计算

for i = 1:m

% 逐个城市计算

for j = 1:(n - 1)

Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);

end

Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);

end

Tau = (1-rho) * Tau + Delta_Tau;

% 迭代次数加1,清空路径记录表

iter = iter + 1;

Table = zeros(m,n);

end

%% 结果显示

[Shortest_Length,index] = min(Length_best);

Shortest_Route = Route_best(index,:);

disp(['最短距离:' num2str(Shortest_Length)]);

disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

%% 绘图

figure(1)

plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...

[citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');

grid on

for i = 1:size(citys,1)

text(citys(i,1),citys(i,2),[' ' num2str(i)]);

end

text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),' 起点');

text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),' 终点');

xlabel('城市位置横坐标')

ylabel('城市位置纵坐标')

title(['蚁群算法优化路径(最短距离:' num2str(Shortest_Length) ')'])

figure(2)

plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')

legend('最短距离','平均距离')

xlabel('迭代次数')

ylabel('距离')

title('各代最短距离与平均距离对比')

结果

最短距离:15828.7082

最短路径:15 14 12 13 11 23 16 4 2 5 6 7 8 9 10 3 18 17 19 24 25 20 21 22 26 28 27 30 31 29 1 15

依次为城市的序号

为了研究参数:蚂蚁数目m ,信息素重要程度α,启发式函数β,信息素挥发度ρ对算法的影响,可以做系列实验

固定其他参数,让蚂蚁数目m 从5~50,对于每个m 运行20次,记录这20次中每次的最小路径长度,除以20做为平均值,同时记录这20个数中最大与最小值,从而得到一个实验数据表,会发现最短距离出现的位置。

其他参数也可同样研究,从而发现规律

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