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的参数(如惯性权重、学习因子)较容易调节,能够在较短时间内找到合适的参数组合,提升算法性能。