TSP是什么?TSP全称Travelling salesman problem。中文名:旅行商问题。就是模拟退火中讲到的14个城市之间巡回旅行,求路径最短的问题。
为什么偏偏找他呢?因为这是一个衡量算法的“金标准”,而且他简单,用来介绍一个算法的基本思想再好不过。
下面我们用同样的方法看看蚁群算法。
参考资料:https://baike.baidu.com/item/TSP/2905216#viewPageContent
我尽量用白话去解释我所理解的蚁群算法:
这个是参数和概率计算公式的说明:(这个先大致看看,留个印象)
m = 200; % 蚂蚁数量
M=31 %31个城市(大致模拟了中国省会城市的分布)
alpha =4; % 信息素重要程度因子
beta =1; % 启发函数重要程度因子
rho(就是ρ) = 0.1; % 信息素挥发因子
Q = 1; % 常系数
Eta(就是τ)= 1./D; % 启发函数
Tau(就是η) = ones(n,n); % 信息素矩阵
Table = zeros(m,n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 300; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
以上是参数和公式,以下是网上介绍的过程,大致了解一下:
以上图片来源于:http://www.dataguru.cn/article-11200-1.html
我的理解:
蚂蚁在自然界里,知道怎么去选择路径,很大程度上是因为之前有蚂蚁在路径上留下了信息素去指导后面的蚂蚁运动,信息素在算法里就是τ。当然信息素作为一种化学物质,他是会挥发的,所以算法里面与之对应有一个ρ。
这个算法还加了一点什么呢?就是η,这是两个城市之间距离的倒数,意味着蚂蚁在城市A选择下一个城市的时候,会更有可能选择离城市A更近的城市。
开始,有200(m=200)只蚂蚁,但是这些蚂蚁,寿命很短,只够他们不重复爬一圈所有的城市,回到起点就死了,他们一生追求就是“世界那么大,我想去看看”,这一辈子就只想把31个城市看完然后回归故土。这些蚂蚁呢,我们一开始要为他们在这31(M=31)个城市中随机分布起点,也就是相对于出生了。之后他们一辈子还有三十个城市要走。然后,我们一次性要把200只蚂蚁接下来所有的行程安排好。怎么做呢?比如有一只蚂蚁1(1是该蚂蚁的序号,就是公式中的k),他被分到了第6个城市出生,接下来怎么去安排他的第二个“旅游地点”呢?这就要请出我们的转移概率公式啦,就是那个在第一章图片中看上去很可怕的p(还有i,j作为下标,k作为上标,t作为输入参数),但是不用怕,i其实就是当前城市序号,j是下一步城市序号,k是蚂蚁序号,t是代数序号,就是算法迭代的代数。咱们只要把分子弄懂了,分母不过就是分子加起来的一个和。
我们要记得,城市不能重复,所以图片中才会有判断j从属关系的一个条件,如果j之前没有去过,就可以用公式算出概率,去参与概率竞争,否则概率就为0,就不去了。
重点是:分子是什么意思呢?一个是τ,一个是η,τ一开始全部是1,所有路径上的信息素都是1,在之后由于各个蚂蚁爬动产生的影响,以及信息素在每一次迭代之后都会挥发的效果,信息素在各个城市之间会差别越来越大,这是显然的。有一些路线由于很少有蚂蚁去爬动,导致挥发越来越多,渐渐就没有信息素了。其他那些有蚂蚁去爬动的路线上由于有信息素的补充,信息素能够维持在一个水平。信息素越大,选择的概率也就越大。
η是两个城市之间距离的倒数,也就是有更大的概率去到那些离自己更近的城市。这个η称为启发式因子。η=1/d称为启发函数。
α,β是信息素和启发式因子的权重因子,值越大在概率公式中也越重要。
回归正题,蚂蚁到了第6个城市后,会得到的一个禁忌列表(Taboo),就是他以前走过的城市的列表,总的城市列表减去这个禁忌列表就会得到允许列表即(Allow列表),然后就根据允许列表中的所有可能(比如6-7,6-9,6-25,6-10等等有三十个“数对”)产生他们所对应的η,τ,然后算出他们mij=(τ^α)*(η^β),上面举了四个“数对”,就有四个不同的m67,m69,m625,m610然后每一个的概率pij=mij/,分母是所有“可能”的m之和,因为Taboo列表里面m为0。这样第1只蚂蚁走完了第一个城市,又产生第二个城市的概率,那么电脑根据概率随机生成下一个城市,又用同样的方法随机生成第三,第四第五直到第三十一个城市。紧接着第2只蚂蚁重复上述过程,直到全部200只蚂蚁全部安排完31个城市旅行顺序。
这里需要注意的是,在同一批次,即同一代的蚂蚁,互相之间是不会受到之前蚂蚁留下信息素浓度的影响,他们计算概率时所用到的τ是上一代蚂蚁留下的信息素。(第一代蚂蚁用的信息素用的是初始值,初始值是所有城市之间信息素浓度一样。)
接下来是更新信息素了。更新信息素学术界有三种方法
第一种是:ant cycle system
△τ=Q/L
第二种是:ant quantity system
△τ=Q/dij
第三种是:ant density system
△τ=Q
首先我们脑海里要先有一个31*31的矩阵(矩阵是关于对角线对称的,对角线上我们取0.0001,不取0因为到时候这个矩阵要全部取倒数,0.0001还是0.1都没有关系,反正这个数据不会用到,只是为了分母不为零),用来描述这个三十一城市互相之间的信息素浓度。一开始都是1。上面所说的第一代蚂蚁爬过之后信息素会怎么变化呢?
首先,所有τ=τ*(1-rho(就是ρ)),先挥发掉一部分。挥发操作的频率是每一代完成之后进行一次。这是环境因素使信息素变少。
之后再讲生物因素,这里我介绍第一种方法ant cycle system。“在每一次迭代之后”(注意频率),对于蚂蚁1来说,算出他旅行的总长度L,这是分母。然后分子Q在程序中永远是一个常数,用来描述蚂蚁释放信息素的能力,然后相除算出△τ,之后在每一个通过的路径都加上这个△τ,于是我们脑海中的那个矩阵就会有62项加上了这个△τ(因为这个矩阵是关于对角线对称的)。比如6-7-1-2-3-。。。。。(省略)-25-30-6,那么6-7,7-1,1-2等等等一直到30-6都会加上这个相同的△τ,那么紧接着再更新蚂蚁2走过的所有路径的τ,加上蚂蚁2算出来的△τ(与蚂蚁1的△τ区分开来,不同蚂蚁的L不同,△τ自然也不同),紧接着蚂蚁3,4,5。。。200,的信息素全部更新完成。
至此,第一代完成,第一代蚂蚁全部死亡。
程序随机产生第二代200只蚂蚁,随机初始出生地,再重复上述规则。完成
直到达到最大迭代次数。iter_max。(iteration 迭代 )
下面再说说第二种生物因素更新规则,ant quantity system,我们注意到在第一种方法中,对于同一只蚂蚁,所有的路径上△τ是一样的,△τ的计算频率是每一代计算一次,第二种规则就不同了,△τ的分母是两个城市之间的距离,所以是每经过一个城市就计算一次,对于同一个蚂蚁,不同“城市数对”之间的信息素增量△τ是不同的。每一个城市数对单独计算信息素增量,再在矩阵中单独加上去,规则一计算了200个△τ,规则一计算了6200个△τ。
第三种规则,△τ只有一种,对于所有蚂蚁的所有路径都是一模一样的Q常数。
还说一下,Q越大,那么没有蚂蚁爬过的路径和有蚂蚁爬过的路径之间的信息素差距就越大,也就是说这个时候蚂蚁爬过起到的作用就越大,相当于在增大α。换句话说α起到的作用也是使路径有没有蚂蚁爬过所产生的影响越来越大。
Q,α太大会使得早期一些碰巧被蚂蚁爬过的路径迅速占据大部分的概率,使得模型快速局部收敛,削弱了模型的全局搜索能力。
代码如下:参考自《matlab在数学建模中的应用》
tic%计时
%% I. 清空环境变量
%clear all
%clc
% data2=0;
for circle=11:20%将每一次的一些数据专门保存在data2矩阵里面
%% II. 导入数据
load citys_data.mat
%##
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
%##
%% III. 计算城市间相互距离
n = size(citys,1);%n是城市的个数
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
%% IV. 初始化参数
m = 100; % 蚂蚁数量
alpha =4; % 信息素重要程度因子
beta =2; % 启发函数重要程度因子
rho = 0.1; % 信息素挥发因子
Q = 1; % 常系数
Eta = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table = zeros(m,n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 120; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
best_length =zeros(iter_max,1);
iter_limit=1;
%% V. 迭代寻找最佳路径
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,:);
best_length = min_Length;
else
[min_Length,min_index] = min(Length);
Length_best(iter) = min(Length_best(iter – 1),min_Length);
Length_ave(iter) = mean(Length);
best_length(iter)=min_Length;
if Length_best(iter) == min_Length
Route_best(iter,:) = Table(min_index,:);
iter_limit=iter;
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
toc
disp([‘运行时间’,num2str(toc)])
%% VI. 结果显示
[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
disp([‘最短距离:’ num2str(Shortest_Length)]);
disp([‘最短路径:’ num2str([Shortest_Route Shortest_Route(1)])]);
%% VII. 绘图
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:’,1:iter_max,best_length,’*-‘)
legend(‘最短距离’,’平均距离’,’每一代最短距离’)
xlabel(‘迭代次数’)
ylabel(‘距离’)
title(‘各代最短距离与平均距离对比’)
text(iter_limit,best_length(iter_limit)-200,[‘最后一次收敛点:’,num2str(iter_limit),’ ‘,num2str(best_length(iter_limit))]);
text(80,best_length(end)+400,[‘收敛距离’,num2str(best_length(end))]);
differ=best_length(end)-best_length(iter_limit);
text(50,best_length(end)+2000,[[‘m: ‘,num2str(m),’ ‘],[‘a: ‘,num2str(alpha),’ ‘],[‘b: ‘,num2str(beta)]…
,[‘ differ: ‘,num2str(differ)]]);
data2(circle,[1,2,3,4,5,6,7,8])=[circle,m,alpha,beta,best_length(end),best_length(iter_limit),iter_limit,differ]
end
图像展示:
第一组(alpha=2,beta=1,2,3)
第二组:(alpha=4,beta=1,2,3)
第三组(alpha=6,beta=1,2,3)
第四组(alpha=8,beta=1,2,3):
一些研究alpha,beta关系的实验数据:
序号 | m | alpha | beta | 最终收敛距离 | 最优距离 | 收敛代数 | 收敛距离与最优距离之差 | ||||||||
1 | 100 | 2 | 3 | 16736.20592 | 15916.06068 | 58 | 820.1452332 | ||||||||
2 | 100 | 2 | 3 | 17686.93107 | 16044.98222 | 68 | 1641.948856 | ||||||||
3 | 100 | 2 | 3 | 16892.05248 | 16061.92693 | 82 | 830.1255536 | ||||||||
4 | 100 | 2 | 3 | 16938.67079 | 16146.82319 | 68 | 791.8476035 | ||||||||
5 | 100 | 2 | 3 | 16723.3089 | 15972.76483 | 76 | 750.5440694 | ||||||||
6 | 100 | 2 | 3 | 16576.59246 | 16229.89732 | 66 | 346.6951386 | ||||||||
7 | 100 | 2 | 3 | 17019.38577 | 16148.37981 | 72 | 871.0059614 | ||||||||
8 | 100 | 2 | 3 | 16736.20592 | 15933.52937 | 65 | 802.6765511 | ||||||||
9 | 100 | 2 | 3 | 16950.59937 | 16437.51976 | 87 | 513.0796111 | ||||||||
10 | 100 | 2 | 3 | 16747.9256 | 15799.86992 | 51 | 948.0556819 | ||||||||
11 | 100 | 4 | 3 | 17445.80492 | 16137.68187 | 56 | 1308.123054 | ||||||||
12 | 100 | 4 | 3 | 17525.47982 | 16199.55352 | 49 | 1325.9263 | ||||||||
13 | 100 | 4 | 3 | 17212.9734 | 16215.2312 | 44 | 997.7422011 | ||||||||
14 | 100 | 4 | 3 | 16977.25263 | 15799.86992 | 49 | 1177.382707 | ||||||||
15 | 100 | 4 | 3 | 17777.6653 | 16187.93244 | 47 | 1589.732858 | ||||||||
16 | 100 | 4 | 3 | 17083.83221 | 16216.05078 | 49 | 867.7814298 | ||||||||
17 | 100 | 4 | 3 | 17083.83221 | 16413.34046 | 50 | 670.4917501 | ||||||||
18 | 100 | 4 | 3 | 17231.47197 | 16337.0178 | 44 | 894.4541724 | ||||||||
19 | 100 | 4 | 3 | 17354.68804 | 16148.37981 | 51 | 1206.308236 | ||||||||
20 | 100 | 4 | 3 | 17158.22167 | 16092.24924 | 59 | 1065.972426 | ||||||||
21 | 100 | 6 | 3 | 17211.17601 | 15970.4102 | 44 | 1240.765808 | ||||||||
22 | 100 | 6 | 3 | 17042.59006 | 16148.37981 | 53 | 894.2102526 | ||||||||
23 | 100 | 6 | 3 | 17354.90786 | 15799.86992 | 38 | 1555.037936 | ||||||||
24 | 100 | 6 | 3 | 17354.68804 | 16146.82319 | 47 | 1207.864854 | ||||||||
25 | 100 | 6 | 3 | 16993.62824 | 16100.27272 | 46 | 893.3555238 | ||||||||
26 | 100 | 6 | 3 | 17793.51066 | 16358.89523 | 41 | 1434.615434 | ||||||||
27 | 100 | 6 | 3 | 17511.25507 | 16224.12107 | 43 | 1287.133993 | ||||||||
28 | 100 | 6 | 3 | 17752.2685 | 16236.27968 | 43 | 1515.988829 | ||||||||
29 | 100 | 6 | 3 | 17793.51066 | 16263.04147 | 40 | 1530.46919 | ||||||||
30 | 100 | 6 | 3 | 17797.04008 | 15933.14161 | 42 | 1863.898471 | ||||||||
31 | 100 | 8 | 3 | 17752.2685 | 16351.45228 | 37 | 1400.816222 | ||||||||
32 | 100 | 8 | 3 | 17268.45689 | 15772.45981 | 40 | 1495.997074 | ||||||||
33 | 100 | 8 | 3 | 17313.6657 | 16086.81108 | 43 | 1226.854618 | ||||||||
34 | 100 | 8 | 3 | 17042.59006 | 16216.05078 | 44 | 826.5392744 | ||||||||
35 | 100 | 8 | 3 | 17899.75737 | 16259.20932 | 35 | 1640.548045 | ||||||||
36 | 100 | 8 | 3 | 17793.51066 | 16134.24984 | 41 | 1659.260819 | ||||||||
37 | 100 | 8 | 3 | 17752.2685 | 16215.52249 | 40 | 1536.746009 | ||||||||
38 | 100 | 8 | 3 | 17042.59006 | 15598.7619 | 38 | 1443.828164 | ||||||||
39 | 100 | 8 | 3 | 17042.59006 | 16096.85739 | 29 | 945.7326658 | ||||||||
40 | 100 | 8 | 3 | 17212.9734 | 16657.71827 | 39 | 555.255132 | ||||||||
序号 | m | alpha | beta | 最终收敛距离 | 最优距离 | 收敛代数 | 收敛距离与最优距离之差 |
| |||||||
1 | 100 | 2 | 1 | 17184.53773 | 16370.6179 | 79 | 813.9198383 |
| |||||||
2 | 100 | 2 | 1 | 16568.48569 | 16184.36831 | 85 | 384.1173771 |
| |||||||
3 | 100 | 2 | 1 | 16900.40442 | 16102.0638 | 75 | 798.3406173 |
| |||||||
4 | 100 | 2 | 1 | 17013.42748 | 15879.1221 | 82 | 1134.305378 |
| |||||||
5 | 100 | 2 | 1 | 16685.96127 | 15972.76483 | 80 | 713.1964377 |
| |||||||
6 | 100 | 2 | 1 | 16597.08252 | 15972.76483 | 90 | 624.3176914 |
| |||||||
7 | 100 | 2 | 1 | 16780.84258 | 15663.97551 | 85 | 1116.867071 |
| |||||||
8 | 100 | 2 | 1 | 16992.58852 | 16148.37981 | 79 | 844.2087146 |
| |||||||
9 | 100 | 2 | 1 | 17157.18482 | 15601.91953 | 83 | 1555.265286 |
| |||||||
10 | 100 | 2 | 1 | 16885.77627 | 16016.14392 | 78 | 869.6323537 |
| |||||||
11 | 100 | 4 | 1 | 17774.67895 | 15617.38628 | 65 | 2157.292666 |
| |||||||
12 | 100 | 4 | 1 | 17544.1018 | 16270.49445 | 61 | 1273.607348 |
| |||||||
13 | 100 | 4 | 1 | 17269.81009 | 15674.0867 | 62 | 1595.723389 |
| |||||||
14 | 100 | 4 | 1 | 18460.03323 | 16629.30535 | 68 | 1830.727871 |
| |||||||
15 | 100 | 4 | 1 | 17088.69644 | 15989.03619 | 63 | 1099.66025 |
| |||||||
16 | 100 | 4 | 1 | 17381.6804 | 16203.06238 | 68 | 1178.618022 |
| |||||||
17 | 100 | 4 | 1 | 16593.41722 | 15993.09276 | 64 | 600.3244633 |
| |||||||
18 | 100 | 4 | 1 | 16667.078 | 15717.25537 | 66 | 949.8226294 |
| |||||||
19 | 100 | 4 | 1 | 17488.04733 | 16127.50559 | 62 | 1360.541744 |
| |||||||
20 | 100 | 4 | 1 | 16682.81042 | 15970.0754 | 67 | 712.7350148 |
| |||||||
21 | 100 | 6 | 1 | 17762.91146 | 16369.12259 | 58 | 1393.788868 |
| |||||||
22 | 100 | 6 | 1 | 17474.63981 | 16060.31484 | 57 | 1414.32497 |
| |||||||
23 | 100 | 6 | 1 | 16784.70679 | 16253.27722 | 61 | 531.4295693 |
| |||||||
24 | 100 | 6 | 1 | 16256.24802 | 15775.69457 | 54 | 480.5534549 |
| |||||||
25 | 100 | 6 | 1 | 17857.01288 | 16219.31096 | 58 | 1637.701922 |
| |||||||
26 | 100 | 6 | 1 | 17527.42659 | 16795.37959 | 56 | 732.0470046 |
| |||||||
27 | 100 | 6 | 1 | 17471.05044 | 16632.93343 | 59 | 838.1170083 |
| |||||||
28 | 100 | 6 | 1 | 16894.68065 | 16431.28283 | 54 | 463.3978147 |
| |||||||
29 | 100 | 6 | 1 | 17914.70443 | 16669.80846 | 60 | 1244.895966 |
| |||||||
30 | 100 | 6 | 1 | 17591.50904 | 16778.13135 | 56 | 813.3776987 |
| |||||||
31 | 100 | 8 | 1 | 16788.39688 | 15989.98205 | 57 | 798.4148271 |
| |||||||
32 | 100 | 8 | 1 | 18173.782 | 16369.99307 | 49 | 1803.788931 |
| |||||||
33 | 100 | 8 | 1 | 17313.16471 | 15848.71831 | 51 | 1464.4464 |
| |||||||
34 | 100 | 8 | 1 | 17771.76138 | 16122.53006 | 49 | 1649.231326 |
| |||||||
35 | 100 | 8 | 1 | 19056.70798 | 16346.99029 | 55 | 2709.717693 |
| |||||||
36 | 100 | 8 | 1 | 17694.22627 | 16056.6427 | 52 | 1637.58357 |
| |||||||
37 | 100 | 8 | 1 | 17553.25189 | 15952.16778 | 49 | 1601.084107 |
| |||||||
38 | 100 | 8 | 1 | 16465.67402 | 16172.13873 | 50 | 293.5352914 |
| |||||||
39 | 100 | 8 | 1 | 17187.88132 | 16495.91377 | 50 | 691.9675478 |
| |||||||
40 | 100 | 8 | 1 | 16734.95925 | 16332.74969 | 49 | 402.2095505 |
| |||||||
☆平均数:
序号 | m | alpha | beta | 最终收敛距离 | 最优距离 | 收敛代数 | 收敛距离与最优距离之差 |
5.5 | 100 | 2 | 1 | 16876.62913 | 15991.21205 | 81.6 | 885.4170764 |
15.5 | 100 | 4 | 1 | 17295.03539 | 16019.13005 | 64.6 | 1275.90534 |
25.5 | 100 | 6 | 1 | 17353.48901 | 16398.52558 | 57.3 | 954.9634276 |
35.5 | 100 | 8 | 1 | 17473.98057 | 16168.78265 | 51.1 | 1305.197924 |
序号 | m | alpha | beta | 最终收敛距离 | 最优距离 | 收敛代数 | 收敛距离与最优距离之差 |
5.5 | 100 | 2 | 3 | 16900.78783 | 16069.1754 | 69.3 | 831.612426 |
15.5 | 100 | 4 | 3 | 17285.12222 | 16174.7307 | 49.8 | 1110.391513 |
25.5 | 100 | 6 | 3 | 17460.45752 | 16118.12349 | 43.7 | 1342.334029 |
35.5 | 100 | 8 | 3 | 17412.06712 | 16138.90932 | 38.6 | 1273.157802 |
小结:当alpha增大的时候,全局搜索能力下降,局部搜索上升,收敛速度加快。刚开始几代随机性很强,那么先撒下信息素的路径就会由于alpha而产生巨大优势,从而以后很多代都会围绕着他们收敛,向外发散能力减弱,能很快收敛。收敛代数会越来越小,如数据。
在同样alpha的情况下,增大beta可以使模型加快收敛,因为alpha和beta的扩大都会增加数据差异所带来的收益,差一点点可能就在概率上差很多,那么有一些路径信息素和η总体来讲都不错的话,就会在巨大的alpha和beta下很快拉开差距,从而加快收敛。
第三,图像中还反映了一个现象,最优路径往往在50代左右就出现, 但是后面由于波动,最终收敛于一个较大距离的路径。为什么?这正体现了概率是由信息素和η两方面去决定的,我们反过来想想,当一个路径最短时,毫无以为信息素浓度浓度是最大的,但是你得有蚂蚁去爬啊,蚂蚁选择你这条路径一是由于信息素,二是他与下一个城市的距离,我们反过来想想,总路径最小,等不等价于每一次选择城市时都是最近的呢?显然不一定吧,那么η产生的概率就会夺走那些最短路径的优势,而有些“较短路径”,虽然不是最短的,信息素分布也还比较多,但是总距离上的牺牲换来的却是η从总体来讲的提高。所以笑到最后的,一定是那些“文武双全”的路径,两方面制衡下达到了一个比较好的值,从而称霸。
第四,我们再去看看第一组的图像。很明显,当beta=1时,最终收敛的距离与最优距离相差无几,但是随着beta增大,差距越来越大,因为beta=1时,η占的权重比较小,这个时候信息素是决定性因素,那么随后收敛的时候偏来偏去,总不会离最优距离太远,最优距离的优势是很明显的,但是beta增大,最优距离的信息素优势被“冲淡”了,就偏得越来越远。这佐证了第三点。
第五,再从数据的波动性看第一组的图像。达到最优距离点之后,beta=1时,波动比较缓慢,几乎很平滑。beta=2,波动明显剧烈了一点,beta=3,波动更剧烈了,这就说明beta破坏了最短距离所建造的“平衡体系”,向外发散的可能性大大增加,越大,效果越明显。
第六,增大m,蚂蚁的数量,会一定程度上增加全局搜索能力。样本多了嘛。
第七,很重要的一点,以上的大小都是“相对”的,并且很多都是基于实验结果的经验之谈,算法分析不好定量分析,大多数情况下只能定性分析。
第八,书上给出的参考值:m/M(城市数)=1.5,较稳妥,alpha属于[1,4],beta属于[3,4.5],rho属于[0.2,0.5],Q属于[10,1000]。
迭代次数选择,一般来讲,先取200,执行程序看算法收敛轨迹,再判断。
第九,蚁群算法对于TSP及其类似问题有很好的适应性,对于其他问题还有待考虑,有一定局限性,这个“城市”“距离”怎么抽象出来嫁接到另一个情况下的实体是关键问题。
语法总结:
##
1、[A,B]=max(P),当P为一列或一行的时候,对应的行数(A),列数(B)会变成值。因为此时行数和列数肯定是1,没有必要再说行数和列数了。
##
2、mean()函数总结
参考链接:https://zhidao.baidu.com/question/51932148.html
matlab中的mean函数函数功能是求数组的平均数或者均值。
使用方法如下:
M = mean(A)
返回沿数组中不同维的元素的平均值。
如果A是一个向量,mean(A)返回A中元素的平均值。
如果A是一个矩阵,mean(A)将其中的各列视为向量,把矩阵中的每列看成一个向量,返
M = mean(A,dim)
返回A中沿着标量dim指定的维数上的元素的平均值。对于矩阵,mean(A,2)就是包含每一行的平均值的列向量。
比如:
A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
mean(A):相当于mean(A,1),求每一列所有行的平均值。这个1表示是以行为对象去求平均值。
ans =
3.0000 4.5000 6.0000
mean(A,2):
ans =
2.0000
4.0000
6.0000
6.0000
##
3、在MATLAB中如何计算程序运行时间
参考链接:https://blog.csdn.net/colourful_sky/article/details/70437001
1、tic和toc组合
tic
%代码块
toc
%disp([‘运行时间: ‘,num2str(toc)]);
程序遇到tic时Matlab自动开始计时,运行到toc时自动计算此时与最近一次tic之间的时间
2、etime()与clock组合
t1=clock;
%代码块
t2=clock;
etime(t2,t1)
计算t1,t2之间的时间差,它是通过调用windows系统的时钟进行时间差计算得到运行时间的。
3、cputime函数
t0=cputime
%代码块
t1=cputime-t0
上以上三种方法,都是可以进行程序运行时间的计算,但是Matlab官方推荐使用tic,toc组合。但是使用tic/toc的时候一定要注意,toc计算的是与最后一次(即离它最近)运行的tic之间的时间。(和if else对应关系一样的)
##
4、matlab代码有“节”这个概念,调试的时候在编辑器中有运行当前节,运行下一节的选项。建立节的方法是用%%加换行的方式:
%%
正文
%%
正文
##
- 如何更改图像坐标轴的属性
参考链接:https://jingyan.baidu.com/article/948f5924231210d80ff5f9db.html
先用get(gca)得到坐标图的各个属性再去设置,熟悉之后就可以不看了。
set(gca,’属性名’,’属性值’)
set(gca,’box’,’on’,’xlim’,[02*pi],’YDir’,’reverse’)后,图形变成下图所示,出现坐标边界(box),x轴显示坐标范围缩小(xlim),y轴方向反转(ydir)
m/M约为1.5时,比较合理
时间已过 25.728734 秒。
运行时间25.7289
最短距离:15601.9195
最短路径:29 1 15 14 12 13 11 23 16 5 6 7 2 4 8 9 10 3 18 17 19 24 25 20 21 22 26 28 27 30 31 29
##
- Legend是图线的图标
x = 0:pi/50:2*pi;
y = sin(x);
y1=cos(x);
figure
plot(x,y,’r’)
hold on
plot(x,y1,’b’)
legend(‘a’,’b’);
这里的对应关系是用位置关系来传达的。即参数的先后关系。
- 加了分号可以抑制变量在窗口栏的输出
x = 0:pi/50:2*pi;
x = 0:pi/50:2*pi (会输出x)
8、轮盘赌法是个很常见很常用的方法。
先算出各个情况的概率,然后依次相加。
0.00144420638923246 0.0122002605472786 0.0681045118239203 0.0814283585181726 0.0977425110049918 0.111676411900531 0.118714416724746 0.124147333734136 0.127994554381832 0.130889461704665 0.144406233096476 0.149649194261840 0.155546015598805 0.159497127626474 0.160566366422886 0.191211982730686 0.631695720512809 0.717028980967632 0.778285709428712 0.797824613344900 0.809645018666816 0.850774702749089 0.940758458789103 0.967250090309183 0.975353382420096 0.980361409312193 0.984392722029262 0.990128055314803 0.996549676670898 1.00000000000000
这是其中某只蚂蚁的三十个城市的“轮盘赌”概率。第一个数据为p1,第二个数据为p1+p2,第三个数据为p1+p2+p3,。。。所以最后一项为1。第一个区间是0到第一个数据,第二个区间是第一个数据到第二个数据,以此类推。
然后用rand产生随机数(0,1),随机数在第k个区间就去第k个城市。