TSP的蚁群算法MATLAB实现

标签: Matlab
49人阅读 评论(0) 收藏 举报
分类:
%% 第9章 蚁群算法及MATLAB实现——TSP问题
% 程序9-1

%% 数据准备
% 清空环境变量
clear all
clc

% 程序运行计时开始
t0 = clock;

% 导入数据
citys = xlsread('D:\berlin52.xlsx','B2:C53');

%% 计算城市间距离
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 = 31;                     % 蚂蚁数量
alpha = 1;                  % 信息素重要程度因子
beta = 5;                   % 启发函数重要程度因子
vol = 0.2;                  % 信息素挥发(volatilization)因子
Q = 10;                     % 常系数
Heu_F = 1./D;               % 启发函数(heuristic function)
Tau = ones(n,n);            % 信息素矩阵
Table = zeros(n,n);         % 路径记录表
iter = 1;                   % 迭代次数初值
iter_max = 100;             % 最大迭代次数
Route_best = zeros(iter_max,n);     % 各代最佳路径
Length_best = zeros(iter_max,1);    % 各代最佳路径的长度
Length_ave = zeros(iter_max,1);     % 各代路径的平均长度
Limit_iter = 0;                     % 程序收敛时迭代次数

%% 迭代寻找最佳路径
while iter <= iter_max
    % 随机产生各个蚂蚁的起点城市
    start = zeros(m,1);
    for i = 1:m
        temp = randperm(n);
        start = 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);  % 参数说明1(程序底部)
            allow = citys_index(allow_index);           % 待访问的城市集合
            P = allow;
            % 计算城市间转移概率
            for k = 1:length(allow)
                P(k) = Tau(tabu(end),allow(k))^alpha *  Heu_F(tabu(end),allow(k))^beta;
            end
            P = P / sum(P);
            % 轮盘赌法选择下一个访问城市
            Pc = cumsum(P);             % 参数说明2(程序底部)
            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,:);
        Limit_iter = 1;
    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,:);
            Limit_iter = 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 - vol) * Tau + Delta_Tau;
    % 迭代次数加1,清空路径记录表
    iter = iter + 1;
    Table = zeros(m,n);
end

%% 结果显示
[Shortest_Length,index] = min(Length_best);
Shortest_Route = Route_best(index,:);
Time_Cost = etime(clock,t0);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str( [Shortest_Route Shortest_Route(1)] )]);
disp(['收敛迭代次数:' num2str(Limit_iter)]);
disp(['程序执行时间:' num2str(Time_Cost),'秒']);

%% 绘图
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(['ACA最优化路径(最短距离:' num2str(Shortest_Length) ')']);
figure(2);
plot(1:iter_max,Length_best,'b');
legend('最短距离');
xlabel('迭代次数');
ylabel('距离');
title('算法收敛轨迹');

%% 程序解释或说明
% 1.ismember函数判断一个变量中的元素是否在另一个变量中出现,返回0-1矩阵;
% 2.cumsum函数用于求变量中累加元素的和,如A=[1,2,3,4,5],那么cumsum(A)=[1,3,6,10,15]。

berlin52 数据集如下:

1 565 575
2 25 185
3 345 750
4 945 685
5 845 655
6 880 660
7 25 230
8 525 1000
9 580 1175
10 650 1130
11 1605 620
12 1220 580
13 1465 200
14 1530 5
15 845 680
16 725 370
17 145 665
18 415 635
19 510 875
20 560 365
21 300 465
22 520 585
23 480 415
24 835 625
25 975 580
26 1215 245
27 1320 315
28 1250 400
29 660 180
30 410 250
31 420 555
32 575 665
33 1150 1160
34 700 580
35 685 595
36 685 610
37 770 610
38 795 645
39 720 635
40 760 650
41 475 960
42 95 260
43 875 920
44 700 500
45 555 815
46 830 485
47 1170 65
48 830 610
49 605 625
50 595 360
51 1340 725
52 1740 245

查看评论

蚁群算法求解TSP问题的matlab程序

%蚁群算法求解TSP问题的matlab程序 clear all close all clc %初始化蚁群 m=31;%蚁群中蚂蚁的数量,当m接近或等于城市个数n时,本算法可以在最少的迭代次数...
  • DREAMOFPLUMBLOSSOM
  • DREAMOFPLUMBLOSSOM
  • 2014年06月24日 13:32
  • 3343

蚁群算法解TSP问题

代码来源于博客http://blog.sina.com.cn/s/blog_6bb1b4b001016pt0.html 添加了部分注释,几乎没有改动(参数和城市格式略做改动),原博主的代码写的很容易理...
  • WayToAccept
  • WayToAccept
  • 2016年04月17日 12:01
  • 2392

蚁群算法求解TSP问题的源代码

旅行商问题大都是用遗传算法求解,不过蚁群算法比它高效得多,在百度的蚁群算法吧里有人发了个注释清晰的代码,有兴趣的可以去研究一下蚁群算法和模拟退火算法,这两者都可以解决旅行商问题。而关于遗传算法和模拟退...
  • jjj19891128
  • jjj19891128
  • 2014年05月07日 17:25
  • 15840

蚁群算法解决tsp问题

控制蚁群算法走向的关键是信息素,信息素类似遗传算法的适应性函数,类似退火算法的评价函数,影响着其中一只蚂蚁的下一步的选择。 蚂蚁:类似遗传算法的染色体,就是一条解,在tsp问题中蚂蚁的路径就是tsp的...
  • fengsigaoju
  • fengsigaoju
  • 2016年03月20日 22:45
  • 3999

蚁群算法解决TSP问题

摘自matlab智能算法30个案例分析
  • guanhang89
  • guanhang89
  • 2016年04月06日 13:49
  • 1114

TSP问题之基本蚁群算法cpp实现

完整程序下载/*基本蚁群算法实现 *基本蚁群算法很容易出现早熟的现象 *几个参数的选择很关键,我在程序中使用的参数效果并不好 * *本程序写作时参考 重庆大学 黄茜 2008年硕士学位论文《蚁群算法及...
  • onezeros
  • onezeros
  • 2010年05月13日 12:26
  • 4960

ACO蚁群算法解决TSP旅行商问题

前言 蚁群算法也是一种利用了大自然规律的启发式算法,与之前学习过的GA遗传算法类似,遗传算法是用了生物进行理论,把更具适应性的基因传给下一代,最后就能得到一个最优解,常常用来寻找问题的最优解。当然,本...
  • Androidlushangderen
  • Androidlushangderen
  • 2015年04月30日 15:31
  • 7233

关于用C#实现蚁群算法解决TSP问题

学习了一个学期的人工智能,了解到了人工智能的强大力量.很多智能算法真是很令人向往! 下面是我实现的蚁群算法.下面介绍一下什么是蚁群算法:主要是一种模拟生物的进化:用信息素来引导蚂蚁向比较好的方向前进....
  • hora_bird
  • hora_bird
  • 2007年06月19日 23:50
  • 4079

TSP问题中,蚁群算法的应用

1. 蚁群算法简介      蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为...
  • qq_28088659
  • qq_28088659
  • 2016年04月01日 17:00
  • 1137

c++ 使用蚁群算法解决TSP问题。

TSP问题,旅行商问题:假如一个旅行商人要拜访n个城市,他必须选择所有要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。选择全部路径中的最小值。TSP具有NP计算复杂度(NP...
  • qq981932962
  • qq981932962
  • 2014年04月25日 21:33
  • 4493
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 776
    排名: 6万+
    文章存档
    最新评论