matlab ismember_转载 | 蚁群算法(ACO)旅行商问题(TSP)路径规划MATLAB实现

转载自:

https://www.omegaxyz.com/2018/07/10/aco-tsp/

TSP问题

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

本文要实现的代码

①问题建模

31个省市自治区的首都画在笛卡尔坐标系上,用坐标表示,两个城市间的距离用二维距离公式表示。

②初始化参数

m是种群数量,n是节点的多少(这里指城市数量的多少)

③构建解空间

将每个个体随机放到不同的点上,进行迭代更新

④更新信息素

计算本轮中最短路径,更新信息素。

⑤判断是否终止

ACO的优点

①采用正反馈机制,不容易陷入局部最优。

②利用信息素达到个体间的交互,有利于进行信息共享。

③可以并行编程,多个个体并行计算,有效地减少时间

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 = 500;                      % 最大迭代次数

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('各代最短距离与平均距离对比')

效果:

78995b8b865bb1665575b8c1c77dbd54.png

dee5372d9e7db8bc73045f77e071faf2.png

TSP问题(旅行商)问题的Matlab实现!

转载自:https://www.omegaxyz.com/2018/07/10/aco-tsp/

作者:OmegaXYZ

https://www.omegaxyz.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值