蚁群优化算法与旅行商问题
文章目录
一、蚁群算法简介
蚁群算法(ant colony optimization, ACO)
又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。
ACO当前发展趋势
●1、动态问题,在问题求解过程中,它的实例数据,例如目标函数值、决策参数、约束条件都在发生变化。
●2、随机问题,在这类问题中,由于不确定性、噪音、近似性或其他因素,人们只能得到目标函数值、决策参数值与约束条件的概率信息。
●3、多目标问题,其中使用设个多目标函数作为评估解质量的标准。
二、蚁群算法规则
环境
蚂蚁所在的环境是一个虚拟的世界,其中有障碍物,有别的蚂蚁,还有信息素,信息素有两种,每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让信息素消失。
觅食规则
在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,这样,它就朝信息素多的地方走,蚂蚁找窝的规则和上面一样,只不过它对窝的信息素做出反应,而对食物信息素没反应。
移动规则
每只蚂蚁都朝向信息素最多的方向移,并且,当周围没有信息素指引的时候,蚂蚁会按照自己原来运动的方向惯性的运动下去,并且,在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈,它会记住刚才走过了哪些点,如果发现要走的下一点已经在之前走过了,它就会尽量避开。
避障规则
如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。
信息素规则
每只蚂蚁在刚找到食物或者窝的时候撒发的信息素最多,并随着它走远的距离,播撒的信息素越来越少。
三、旅行商问题思路
●构建图:构建图与问题描述图是一 致的,成份的集合C对应着点的集合(即: C=N),连接对应着边的集合(即L=4) ,且每一条边都带有-一个权值,代表点i和j之间的距离。
●约束条件:所有城市都要被访问且每个城市最多只能被访问一次。
●信息素和启发式信息: TSP问题中的信息素表示在访问城市i后直接访问城市j的期望度。启发式信息值一般与城市和城市j的距离成反比。
●解的构建:每只蚂蚁最初都从随机选择出来的城市出发,每经过一次迭代蚂蚁就向解中添加一个还没有访问过的城市。当所有城市都被蚂蚁访问过之后,解的构建就终止。
四、旅行商问题解决流程
具体实现
在具体实现上,假设对于旅行商问题而言,我们可以先定义数个固定的城市的坐标,然后分别计算彼此之间的距离,得到一个对称矩阵。
然后,我们再定义足量的蚂蚁(城市数量相同),按照相对随机的方式来选择城市的行走(但是不可以走重复的城市),并对最优路径长度进行记录。在走过之后,会对路径的信息素进行更新,包括对路径的信息素进行添加并计算路径蒸发的信息素。
将蚂蚁重新归位,然后再根据信息素的浓度,以此来寻找下一个所要到达城市,并对最优路径长度进行更新。
当整个算法的迭代次数达到了我们所要求的次数后,我们就可以停止算法,并且可以得到结论:目前找到的路径为最优路径。
AS算法对TSP的求解主要两大步骤
1、路径构建
2、信息素更新
五、旅行商和蚁群问题流程图
六、旅行商算法代码块(ACO.m)
%% 旅行商问题(TSP)优化
%% 清空环境变量
clear all
clc
%% 导入数据
load citys_data.mat
%% 计算城市间相互距离
fprintf('Computing Distance Matrix... \n');
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
%% 初始化参数
fprintf('Initializing Parameters... \n');
m = 50; % 蚂蚁数量
alpha = 4; % 信息素重要程度因子
beta = 8; % 启发函数重要程度因子
rho = 0.5; % 信息素挥发因子
Q = 1; % 常系数
Eta = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table = zeros(m,n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 150; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best =