打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【优秀作业】蚁群优化算法
蚁群优化算法
一.概述
生物学家发现,自然界中的蚁群觅食是一种群体性行为,并非单只蚂蚁自行寻找食物源。蚂蚁在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征到食物源路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度较高的路径,并释放一定量的信息素,以增强该条路径上的信息素浓度,这样会形成一个正反馈。最终,蚂蚁能够找到一条从巢穴到食物源的最佳路径,即最短距离。值得一提的是,生物学家同时发现,路径上的信息素浓度会随着时间的推进而逐渐衰减。
20世纪90年代初,意大利学者M.Dorigo等人提出了模拟自然界蚂蚁群体觅食行为的蚁群算法。其基本思想是:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上积累的信息素浓度逐渐增高,选择该路径上的蚂蚁个数也越来越多。最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时对应的便是待优化问题的最优解。
二.蚁群算法解决TSP问题
1. 算法原理
M.Dorigo等人最早将蚁群算法用于解决旅行商问题(Traveling Salesman Problem,TSP),并取得了较好的实验结果。设整个蚂蚁群体中蚂蚁的数量为 ,城市的数量为,城市与城市之间的距离为,时刻城市与城市连接路径上的信息素浓度为。初始时刻,各个城市间连接路径上的信息素浓度相同,不妨设。
蚂蚁根据各个城市间连接路径上的信息素浓度决定下一个访问城市,设表示时刻蚂蚁从城市转移到城市的转移概率,其公式为:
其中:为启发函数,表示蚂蚁从城市转移到城市的期望程度;为蚂蚁待访问城市的集合,开始时,中有个元素,即包括除了蚂蚁出发城市的所有其它城市,随着时间的推进,中的元素不断减少,直至为空,即表示所有的城市均访问完毕;为信息素重要程度因子,其值越大,表示信息素的浓度在转移中起的作用越大;为启发函数重要程度因子,其值越大,表示启发函数在转移中的作用越大,即蚂蚁会以较大的概率转移到距离短的城市。当时,算法就是传统的贪心算法,而当时,就成了纯粹的正反馈的启发式算法。经过个时刻,蚂蚁可以走完所有的城市,完成一次循环,每只蚂蚁所走过的路径就是一个解。
由于蚂蚁释放信息素的同时,各个城市间连接路径上的信息素逐渐消失,设参数表示信息素的挥发程度。因此,当所有蚂蚁完成一次循环后,各个城市间连接路径上的信息素浓度需进行实时更新,即
其中,表示第只蚂蚁在城市与城市连接路径上释放的信息素浓度;表示所有蚂蚁在城市与城市连接路径上释放的信息素浓度之和。
针对蚂蚁释放信息素问题,M.Dorigo等人曾给出3种不同的模型,分别称之为Ant Cycle System、Ant Quantity System和Ant Density System,其计算公式如下:
(1)Ant Cycle System模型
其中,为常数,表示蚂蚁循环一次所释放的信息素总量;为第只蚂蚁经过路径的长度。
(2)Ant Quantity System
(3)Ant Density System
第只蚂蚁从城市访问城市,其它上述3种模型中,Ant Cycle System模型利用蚂蚁经过路径的整体信息(经过路径的总长)计算释放的信息素浓度;Ant Quantity System模型利用蚂蚁经过路径的局部信息(经过各个城市间的距离)计算释放的信息素浓度;Ant Density System模型更为简单地将信息素释放的浓度取为恒值,并没有考虑不同蚂蚁经过路径长度的影响。因此,一般选用Ant Cycle System模型计算释放的信息素浓度,即蚂蚁经过的路径越短,释放的信息素浓度越高。
2. 算法步骤
步骤1:初始化参数
在计算之初,需要对相关参数进行初始化,如蚁群规模(蚂蚁数量)、信息素重要程度因子、启发函数重要程度因子、信息素挥发程度因子、信息素释放总量、最大迭代次数。
注:在初始化之前需要根据城市位置坐标,计算两两城市间的相互距离,从而得到对称的距离矩阵。由于启发函数为,为了保证分母不为零,需要将对角线上的元素零,修正为一个非常小的正数(如或等)。
步骤2:构建解空间
将各个蚂蚁随机地置于不同出发点,对每个蚂蚁,按照转移概率计算公式,确定其下一个待访问的城市,直到所有蚂蚁访问完所有的城市,即构造完一组路径。
步骤3:更新信息素
计算各个蚂蚁经过的路径长度,根据信息素迭代公式对各个城市路径上的信息素浓度进行更新。同时,记录当前迭代次数中的最优解(最短路径)。
步骤4:判断是否终止
若达到最大迭代次数,则终止计算,输出最优解。否则,清空蚂蚁经过路径的记录表,并返回步骤2。
三. 利用蚁群算法求解旅行商问题
按照枚举法,我国 34 个直辖市、省会和自治区首府的巡回路径应有 34! 种。但是那种巡回路径最短呢,我们可以利用蚁群算法进行求解。
城市坐标如下表所示:
序号城市到0°经线距离(X)到赤道距离(Y)
1北京99324439
2天津101094351
3上海115523472
4重庆103023290
5拉萨87763333
6乌鲁木齐70404867
7银川92524278
8呼和浩特93954539
9南宁111012540
10哈尔滨98255087
11长春100474879
12沈阳102274648
13石家庄100274229
14太原98784211
15西宁90874065
16济南104384075
17郑州103823865
18南京111963563
19合肥110753543
20杭州115443365
21福州119152900
22南昌113053189
23长沙110733137
24武汉109503394
25广州115762575
26台北122392785
27海口115292226
28兰州93284006
29西安100123811
30成都99523410
31贵阳106122954
32昆明103492784
33香港117472469
34澳门116732461
代码如下:
%% 清空环境变量
clear
clc
close all
%% 导入数据
%表中34个城市的位置坐标保存在citys_data1.mat文件中,变量citys为34行2列的
%数据,第1列表示城市的横坐标,第2列表示城市的纵坐标。
load citys_data.mat
%% 计算城市间相互距离
n = size(citys,1);
D = zeros(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 = 35;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.1;                           % 信息素挥发因子
Q = 1;                               % 常系数
Eta = 1./D;                          % 启发函数
Tau = ones(n,n);                     % 信息素矩阵
Table = zeros(m,n);                  % 路径记录表
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);
for i = 1:m
temp = randperm(n);
start(i) = temp(1);
end
Table(:,1) = start;
% 构建解空间
citys_index = 1:n;
% 逐个蚂蚁路径选择
for i = 1:m
% 逐个城市路径选择
for j = 2:n
tabu = Table(i,1:(j - 1));         % 已访问的城市集合(禁忌表)
allow_index = ~ismember(citys_index,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);
for i = 1:m
Route = Table(i,:);
for j = 1:(n - 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('各代最短距离与平均距离对比')
结果分析:
蚁群算法优化路径从上图中可以清晰地看到,自起点出发,每个城市访问一次,遍历所有城市后,返回起点。寻找到的最短距离为16407.8008公里。最短路径为15,28,7,8,10,11,12,1,2,13,14,29,17,16,19,18,24,23,22,20,3,21,26,33,34,25,27,9,31,32,4,30,5,6,15。
各代的最短距离与平均距离对比各代的最短距离与平均距离如上图所示,从图中不难发现,随着迭代次数的增加,最短距离与平均距离均呈现不断下降的趋势。当迭代次数大于116时,最短距离已不再变化,表示已经寻找到最佳路径。
四. 练习
张三学习了蚁群算法之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
张三的图由 2021 个结点组成,依次编号 1 至 2021。
对于两个不同的结点 ,,如果 和 的差的绝对值大于 21,则两个结点之间没有边相连;如果 和 的差的绝对值小于等于 21,则两个点之间有一条 长度为 和 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。
利用蚁群算法确定最短的巡回路径,以及从结点 1 到结点 2021 之间的最短路径长度是多少。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MAT之ACA:利用ACA解决TSP优化最佳路径问题
双语:向蜜蜂学习或可解决堵车问题
聚类分析(二)——K中心点算法(k-mediods)
Dijkstra(迪杰斯特拉)算法求解最短路径
最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
一种改进的交通网络路径选择算法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服