基于粒子群算法求解旅行商问题

Posted 博主QQ2449341593

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于粒子群算法求解旅行商问题相关的知识,希望对你有一定的参考价值。

文章目录

 

一、理论基础

在TSP问题中,粒子的位置可以使用路径来表示,速度如何表示却是一个难题。基本粒子群算法的速度和位置更新公式不再适用,因此本文重新定义了速度和位置的更新公式。
基本粒子群算法速度位置更新公式:

二、MATLAB程序实现

1、问题描述

TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。

 

2、代码实现

  • 计算粒子适应度函数
function fitness = fun(pop, citys, D)
%% 计算粒子适应度函数
% 输入:pop      粒子群位置     citys   城市坐标   D    距离矩阵
% 输出:fitness  粒子的适应度值
m = size(pop, 1);
n = size(citys, 1);
fitness = zeros(m, 1);
for i = 1:m
    for j = 1:n-1
        fitness(i) = fitness(i) + D(pop(i, j), pop(i, j+1));
    end
    fitness(i) = fitness(i) + D(pop(i, end), pop(i, 1));
end
  • 记录将pop变成best的交换序列的函数
function change = position_minus_position(best, pop)
%% 记录将pop变成best的交换序列
for i = 1:size(best, 1)
    for j = 1:size(best, 2)
        change(i, j) = find(pop(i, :)==best(i, j));   % 找到最佳值索引
        temp = pop(i, j);
        pop(i, j) = pop(i, change(i, j));
        pop(i, change(i, j)) = temp;                  % 交换
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 利用速度记录的交换序列进行位置修正的函数
  • 以一定概率保留交换序列的函数
function change = constant_times_velocity(constant, change)
%% 以一定概率保留交换序列
for i = 1:size(change, 1)
    for j = 1:size(change, 2)
        if rand > constant
            change(i, j) = 0;
        end
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 主函数
%% 1.清空环境变量
clear;
clc;

%% 2.导入数据
load citys_data.mat;     % 数据集的变量名为citys

%% 3.计算城市间相互距离
n = size(citys, 1);
D = Distance(citys);

%% 4.初始化参数
c1 = 0.1;                           % 个体学习因子
c2 = 0.075;                         % 社会学习因子
w = 1;                              % 惯性权重
m = 500;                            % 粒子数量
pop = zeros(m, n);                  % 粒子位置
V = zeros(m,n);                     % 粒子速度
gen = 1;                            % 迭代计数器
maxgen = 2000;                      % 迭代次数
fitness = zeros(m, 1);              % 适应度函数值
pbest = zeros(m, n);                % 个体极值路径
fitnesspbest = zeros(m,1);          % 个体极值
gbest = zeros(maxgen, n);           % 群体极值路径
fitnessgbest = zeros(maxgen, 1);    % 群体极值
Length_ave = zeros(maxgen, 1);      % 各代路径的平均长度
ws = 0.9;                           % 惯性权重最大值
we = 0.4;                           % 惯性权重最小值

%% 5.产生初始粒子
% 随机产生粒子初始位置和速度
for i = 1:m
    pop(i, :) = randperm(n);
    V(i, :) = randperm(n);
end
% 计算粒子适应度函数值
fitness = fun(pop, citys, D);
% 计算个体极值和群体极值
fitnesspbest = fitness;         % 个体极值适应度值
pbest = pop;                    % 个体极值
[fitnessgbest(1), min_index] = min(fitness);
gbest(1, :) = pop(min_index, :);
Length_ave(1) = mean(fitness);

%% 6.迭代寻优
while gen < maxgen
    gen
    %% 更新迭代次数与惯性权重
    gen = gen+1;
    w = ws - (ws-we)*(gen/maxgen)^2;   

    %% 更新速度
    % 个体极值更新部分
    change1 = position_minus_position(pbest, pop);
    change1 = constant_times_velocity(c1, change1);
    % 群体极值修正部分
    change2 = position_minus_position(repmat(gbest(gen-1, :), m, 1), pop);
    change2 = constant_times_velocity(c2, change2);
    % 原速度部分
    V = constant_times_velocity(w, V);
    % 修正速度
    for i = 1:m
        for j = 1:n
            if change1(i, j) ~= 0
                V(i, j) = change1(i, j);
            end
            if change2(i, j) ~= 0
                V(i, j) = change2(i, j);
            end
        end
    end

    %% 更新位置
    pop = position_plus_velocity(pop, V);

    %% 适应度函数值更新
    fitness = fun(pop, citys, D);
    %% 个体极值与群体极值更新
    % 个体极值更新
    for i = 1:m
        if fitness(i) < fitnesspbest(i)
            fitnesspbest(i) = fitness(i);
            pbest(i, :) = pop(i, :);
        end
    end
    % 群体极值更新
    [minvalue, min_index] = min(fitness);
    if minvalue < fitnessgbest(gen-1)
        fitnessgbest(gen) = minvalue;
        gbest(gen, :) = pop(min_index, :);
    else
        fitnessgbest(gen) = fitnessgbest(gen-1);
        gbest(gen, :) = gbest(gen-1, :);
    end
    % 记录每代的平均路径长度
    Length_ave(gen)=mean(fitness);
end

%% 7.结果显示
[Shortest_Length, index] = min(fitnessgbest);
Shortest_Route = gbest(index, :);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

%% 8.绘图
figure(1)
plot([citys(Shortest_Route, 1); citys(Shortest_Route(1), 1)],...
     [citys(Shortest_Route, 2);citys(Shortest_Route(1), 2)], 'o-', 'linewidth', 2);
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:maxgen, fitnessgbest, 'b', 1:maxgen, Length_ave, 'r:', 'linewidth', 2);
legend('最短距离', '平均距离')
xlabel('迭代次数')
ylabel('路径距离')
title('各代最短距离与平均距离对比')
  • 结果显示
    Command Window中显示的结果为:
最短距离:17515.8526
最短路径:1  15  14  12  30  29  11  13   7   2   4  19  17  18   3  10   9   8  16   5   6  23  24  25  20  21  22  26  28  27  31   1
  • 1
  • 2
  • 绘图
    粒子群算法优化路径变化如图1所示。
    在这里插入图片描述

图1 PSO算法优化路径

各代最短距离与平均距离对比如图2所示。

在这里插入图片描述

图2 各代最短距离与平均距离对比

代码下载https://www.cnblogs.com/matlabxiao/p/14883637.html

三、参考文献

[1] Xia T , Guo W , Chen G . An Improved Particle Swarm Optimization for Data Streams Scheduling on Heterogeneous Cluster[C]// International Conference on Advances in Computation & Intelligence. Springer Berlin Heidelberg, 2007.

以上是关于基于粒子群算法求解旅行商问题的主要内容,如果未能解决你的问题,请参考以下文章

TSP基于matlab GUI粒子群算法求解旅行商问题含Matlab源码 1334期

MTSP基于matlab粒子群优化蚁群算法求解多旅行商问题含Matlab源码 1616期

MTSP基于matlab遗传和粒子群算法求解多旅行商问题含Matlab源码 1156期

路径优化基于人工蜂群(ABC)算法和粒子群优化算法的组合求解路径优化问题(Matlab代码实现)

TSP基于matlab蚁群算法求解旅行商问题含Matlab源码 1583期

路径规划基于粒子群优化蚁群的最短路径求解matlab源码