matlab制作案例

更新时间:2024-06-23 02:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

蚁群算法的优化计算---旅行商问题(TSP)优化

一.理论基础

1.1蚁群算法基本思想

生物学家研究发现,自然界中的蚂蚁觅食是一种群体性行为,并非单只蚂蚁自行寻找食物源。蚂蚁在寻找食物源的时候,会在其经过的路径上释放一种信息素,并能够感知其他蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素越高,表示对应的路径距离越短。通常,蚂蚁会以比较大的概率优先选择信息素浓度比较高的路径,并释放一定的信息素,以增加该条路径上的信息素浓度,这样会形成一个正反馈。最终,蚂蚁能够找到一条从巢穴到食物源的最佳路径,既最短距离。值得一提的是,生物学家同时发现,路径上额信息素浓度会随着时间的推进而逐渐衰退。

将蚁群算法应用于解决优化问题的基本思路为:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化的问题的解空间。路径较短的蚂蚁释放的信息素较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时的便是待优化问题的最佳解。

1.2蚁群算法解决TSP问题基本原理

将用数学语言对上述蚁群算法的基本细想进行抽象描述,并仔细阐述蚁群算法用于解决TSP问题的基本原理。

不是一般性,设整个蚂蚁群中的蚂蚁个数为m,城市的数量为n,城市i与城市j之间的距离为dij(i,j?1,2,?n).t时刻城市i与城市j连接路径上的信息素浓度为?ij(t)。初始时刻,各个城市间连接路径上的信息素相同,不妨设?ij(0)??0

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

[?ij(t)]?[?ij(t)]?s?allowkk???Pij?k?[?is(t)]?[?is(t)],s?allowk------------------(1)

其中,?ij(t)为启发函数,?ij(t)=1?dij,表示蚂蚁从城市i转移到城市j的期望程度;allowk(k?1,2,?m)为蚂蚁k待访问城市的集合,开始时,allowk中有(n?1)个元素,即包括除了蚂蚁k出发城市的其他所有城市,随着时间的推进,allowk中的元素不断减少,直至为空,即表示所有的城市均访问完毕;?为信息素重要程度因子,其值越大,?表示启发函数在转移中的作用越大,即蚂蚁会以较大的概率转移到距离较短的城市。

如前文所述,在蚂蚁释放信息素的同时,各个城市间连接路径上的信息素逐渐消失,设参数?(0???1)表示信息素的挥发程度。因此,当所有蚂蚁完成一次循环后,各个城市间连接路径上的信息素浓度需进行实时更新,即

?ij(t?1)?(1??)?ij(t)??ij

n??ij????k?1kij,0?p?1 ----------------------(2)

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

针对蚂蚁释放信息素问题,M.Drifo等人曾给出3中不同的模型,分别称之为ant cycle system,ant quantity system和ant density system,其计算公式如下

k1.ant cycle system模型

ant cycle system模型中,??ij的计算公式为

k??ij=QLij,第k只蚂蚁从城市i访问城市j---------------(3)

k其中,Q为常数,表示蚂蚁循环一次所释放的信息素总量,Lk为第k只蚂蚁经过路径的长度。

2.ant quantity system模型

ant quantity system模型中,??ij的计算公式为

??ij?Qdij,第k只蚂蚁从城市i访问城市j----------------(4)

kk3.ant density system模型

ant density system模型中,??ij的计算公式为

??ij?Q,第k只蚂蚁从城市i访问城市j-------------------(5)

kk上述3中模型中,ant cycle system模型利用蚂蚁经过路径的整体信息(经过路径的总长)计算释放的信息素浓度;ant quantity system模型则利用蚂蚁经过路径的局部信息(经过各个城市之间的距离)计算释放的信息素浓度;而ant density system模型则更为简单的将信息素释放的浓度取为恒值,并没有考虑不同蚂蚁经过路径长短的影响。因此,一般选用ant cycle system模型计算释放的信息素浓度,即蚂蚁经过的路径越短释放的信息素越高。

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

基于上述原理,将蚁群算法应用于解决TSP问题一般需要以下几个步骤: 1.初始化参数

在计算之初,需要对相关的参数进行初始化,如蚁群规模(蚂蚁数量)m,信息素重要程度因子?、启发函数重要程度因子?、信息素挥发因子Q、最大迭代次数iter-max、迭代次数初值iter=1 2.构建解空间

将各个蚂蚁随机地置于不同出发点,对每个蚂蚁k(k=1,2,.....n),按照(1)式计算其下一个待访问的城市,直到所有蚂蚁访问完所有的城市。

3.更新信息素

计算各个蚂蚁经过的路径长度Lk(k?1,2,?,m),记录当前迭代次数的最优解(最短路径)。同时,根据式(2)和式(3)对各个城市连接路径上的信息素浓度进行更新。

4.判断是否终止

若iter

1.4 蚁群算法的特点

基于蚁群算法的基本思想及解决TSP问题的基本原理,不难发现,与其他优化算法相比,蚁群算法具有以下几个特点:

(1)采用正反馈极值,使得搜索过程不断收敛,最终逼近最优解。

(2)每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接的通讯。

(3)搜索过程采用分布式计算方式,多个个体同时进行计算,大大提高了算法的计算能力和运行效率。

(4)启发式的概率搜索方式不容易陷入局部最优,易于寻找全局最优解。

二.案例背景

2.1 问题描述

按照枚举法,我国31个直辖市、省会和自治区首府(未包括港、澳、台)的巡回路

应有约1.326*1032种,其中一条路径如图所示。试利用蚁群算法寻找到一条最佳或者较佳的路径。

2.2 解决思路及步骤

依据蚁群算法解决TSP问题的基本原理及步骤,实现中国TSP问题求解大体上可以分为以下几个步骤,如图所示

(1)计算城市间相互距离

根据城市的位置坐标,计算两两城市间的相互距离,从而得到对称的距离矩阵(维数为31的方阵)。需要说明的是,计算出得矩阵对角线上的元素为0,然而如前所述,由于启发函数?ij(t)?1dij,因此,为了保证分母不为0,将对角线上的元素修正为一个非常小的正数(如10或10等)

?4-5(2)初始化参数

如前文所述,在计算之前,需要对相关的参数进行初始化。

(3)迭代寻找最佳路径

首先构建空间,即各个蚂蚁根据转移概率公式(1)访问所有的城市。然后计算各个蚂蚁经过的长度,并在每次迭代后根据公式(2)和公式(3)实时更新各个城市连接路径上的信息素浓度。经过循环迭代,记录下最优的路径及其长度。

(4)结果分析

找到最优路径后,可以将之与其他方法得出的结果进行比较,从而对蚁群算法的性能进行评价。同时,也可以探究不同取值的参数对优化结果的影响,从而找到一组最佳或者较佳的参数组合。

三.MATLAB程序实现

清空环境变量 clear all clc 导入数据

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 = 50; % 蚂蚁数量

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)])]); 最短距离:15601.9195

最短路径: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 1 15 14 绘图 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('各代最短距离与平均距离对比')

本文来源:https://www.bwwdw.com/article/aaf3.html

Top