粒子群优化算法(PSO)在解决旅行商问题(TSP)时效果不佳

1. 适应度函数的复杂性

  • 离散优化问题:TSP是一个离散优化问题,而PSO最初是为连续优化问题设计的。适应度函数的复杂性和离散性导致PSO在处理TSP时面临挑战。
  • 路径有效性:在PSO中,粒子的更新通常基于连续空间的速度和位置更新公式,这在TSP的离散路径更新中不易直接应用,可能导致生成无效路径。

2. 速度和位置更新机制

  • 排列问题:TSP的解是一个城市排列顺序,而PSO的速度和位置更新机制适用于连续变量。将连续变量的更新机制应用于排列问题时,容易导致路径无效或不合理。
  • 交换操作复杂性:为了适应TSP的路径更新,需要特殊的交换操作(如逆序、插入、交换等),而这些操作的实现和应用增加了算法的复杂性。

3. 局部最优陷阱

  • 全局与局部探索的平衡:PSO容易陷入局部最优解,特别是在高维和复杂的搜索空间中。对于TSP这样的复杂优化问题,如何平衡全局探索和局部开发是一个挑战。
  • 信息交换不足:PSO依赖于全局最佳和个体最佳信息的交换,如果信息交换不足,可能导致搜索停滞在局部最优。

4. 参数选择和调整

  • 参数敏感性:PSO的性能对惯性权重、学习因子等参数非常敏感,不同参数的选择会显著影响算法的效果。对于TSP,需要仔细调整这些参数以获得较好的效果。
  • 参数调整困难:对于不同规模和复杂度的TSP实例,可能需要不同的参数设置,参数调整的过程复杂且耗时。

5. 缺乏针对性的改进

  • 专用策略缺失:对于TSP这样的问题,存在很多专用的启发式和元启发式算法(如蚁群算法、遗传算法等),这些算法具有针对性强的搜索策略,而PSO缺乏专门针对TSP优化的策略。
clc;
clear all;
%%%%%%%%%绘制加工区域中心图%%%%%%%%%%%%%%%%%
file_path = '..\chapter2\data.csv';
Location = csvread(file_path, 1, 1);
% figure
% for i = 1 : size(Location,1)
%     scatter3(Location(i,1),Location(i,2),Location(i,3),'blue','filled')
%     hold on;
% end
% xlabel('x');
% ylabel('y');
% zlabel('z');
% title("加工区域中心");
%%%%%%%%粒子群算法解决3DTSP问题,假设加工区域开始在中心,且最后回到中心%%%%%%%%
n=size(Location,1);                    %TSP问题的规模
D=zeros(n);                     %任意两个加工区域的距离间隔矩阵
%%%%%%%%%%%%%%%%%%%%%求任意两个城市距离间隔矩阵%%%%%%%%%%%%%%%%%%%%%
for i=1:n
    for j=1:n
        D(i,j)=((Location(i,1)-Location(j,1))^2+(Location(i,2)-Location(j,2))^2+(Location(i,3)-Location(j,3)))^0.5;
    end
end
%% 初始化参数
c1 = 0.2;                           % 个体学习因子
c2 = 0.2;                         % 社会学习因子
w = 1;                              % 惯性权重
m = 500;                            % 粒子数量
pop = zeros(m, n);                  % 粒子位置
V = zeros(m,n);                     % 粒子速度
gen = 1;                            % 迭代计数器
maxgen = 5000;                      % 迭代次数
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;                           % 惯性权重最小值
% 随机产生粒子初始位置和速度
for i = 1:m
    pop(i, :) = randperm(n);
    V(i, :) = randperm(n);
end
% 计算粒子适应度函数值
for i=1:m
    fitness(i,1)=D(pop(i,n),pop(i,1));
    for j=1:(n-1)
        fitness(i,1)=fitness(i,1)+D(pop(i,j),pop(i,j+1));
    end
end
% 计算个体极值和群体极值
fitnesspbest = fitness;         % 个体极值适应度值
pbest = pop;                    % 个体极值
[fitnessgbest(1), min_index] = min(fitness); %群体极值适应度值
gbest(1, :) = pop(min_index, :); % 群体极值
while gen < maxgen
    gen = gen+1;
    w = ws - (ws-we)*(gen/maxgen)^2;  
    %% 更新速度

    %%%%%%
    % 个体极值更新部分
    change1=zeros(m,n);
    pop_copy1=pop;
    for i = 1:m
        for j = 1:n
            if pbest(i, j) ~=  pop_copy1(i,j)
                change1(i, j) = find(pop_copy1(i, :)==pbest(i, j));   % 找到最佳值索引
                temp = pop_copy1(i, j);
                pop_copy1(i, j) = pop_copy1(i, change1(i, j));
                pop_copy1(i, change1(i, j)) = temp;                  % 交换
            end
        end
    end
    %以一定概率保留交换序列
    for i = 1:size(change1, 1)
        for j = 1:size(change1, 2)
            if rand > c1
                change1(i, j) = 0;
            end
        end
    end
    % 群体极值修正部分
    change2=zeros(m,n);
    pop_copy2=pop;
    for i = 1:m
        for j = 1:n
            if pop_copy2(i, j) ~= gbest(gen-1, j)
                change2(i, j) = find(pop_copy2(i, :)==gbest(gen-1, j));   % 找到最佳值索引
                temp = pop_copy2(i, j);
                pop_copy2(i, j) = pop_copy2(i, change2(i, j));
                pop_copy2(i, change2(i, j)) = temp;                  % 交换
            end
        end
    end
     %以一定概率保留交换序列
    for i = 1:size(change2, 1)
        for j = 1:size(change2, 2)
            if rand > c2
                change2(i, j) = 0;
            end
        end
    end
    % 原速度部分
    for i = 1:size(V, 1)
        for j = 1:size(V, 2)
            if rand > w
                change2(i, j) = 0;
            end
        end
    end
    % 修正速度
    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

    %% 更新位置
    for i = 1:size(pop,1)
        for j = 1:size(pop,2)
            if V(i, j) ~= 0
                temp = pop(i, j);
                pop(i, j) = pop(i, V(i,j));
                pop(i, V(i,j)) = temp;
            end
        end
    end
    
    %% 适应度函数值更新
    for i=1:m
        fitness(i,1)=D(pop(i,n),pop(i,1));
        for j=1:(n-1)
            fitness(i,1)=fitness(i,1)+D(pop(i,j),pop(i,j+1));
        end
    end
  
    %% 个体极值与群体极值更新
    % 个体极值更新
    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
   



end
[Shortest_Length, index] = min(fitnessgbest);
Shortest_Route = gbest(index, :);
disp(['最短距离:' num2str(Shortest_Length)]);
disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

 

事实上, 粒子群优化(PSO)算法在解决小规模的旅行商问题(TSP)时效果通常是不错的。这是因为:

1. 搜索空间较小

  • 可行解数量:小规模TSP问题的解空间相对较小,因此PSO能够更有效地探索整个搜索空间,找到较优解。
  • 计算负担较轻:计算每个粒子的适应度和更新速度的负担较轻,算法运行速度较快。

2. 全局与局部探索的平衡

  • 收敛速度快:在小规模问题中,PSO能够较快地收敛到一个较优解,避免在大规模问题中可能遇到的长时间收敛问题。
  • 局部最优问题:虽然PSO可能会陷入局部最优,但在小规模问题中,全局最优和局部最优之间的差异可能较小,影响不大。

3. 参数调节简单

  • 参数设置灵活:对于小规模问题,PSO的参数(如惯性权重、学习因子)较容易调节,能够在较短时间内找到合适的参数组合,提升算法性能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值