1 简介
遗传算法是研究TSP问题中最为广泛的一种算法,它具有全局搜索的能力.而粒子群算法收敛速度较快,但容易造成局部最优的情况.本文基于遗传算法的交叉变异设计了混合粒子群算法,通过对TSP问题求解分析,证实该方法提高了标准粒子群的搜索能力,获得了较高的收敛速度和近似最优解.
标准粒子群算法在极值寻优的过程中,根据粒子的变化状况,除了自身的属性之外只能这个群体中粒子的属性,实验发现随着迭代次数的增加,粒子之间越来越相似,导致无法跳出局部解。而混合粒子群算法在保留粒子群算法原本的性质之外,通过引入遗传算法中的交叉、变异的方式 [2],粒子与个体极值与群体极值交叉以及自身的变异来对粒子种群的多样性问题进行改进,直接对粒子携带遍历城市的信息进行交叉、变异处理,从而直接改变粒子原本想要表达的遍历方案,从而搜索最优解。
1.1 个体编码
粒子个体编码采用整数编码的方式,将粒子的呈现形式转化为在 TSP 问题中的遍历路径,根据整数的数字来对应每一个城市,编码的位置则代表整个遍历方案的实际内容,每个粒子能够表达出遍历的方式,通过粒子的编码直接解读出遍历所有城市的方案。
1.2 交叉操作
个体通过和个体极值和群体极值交叉来更新,交叉方法采用整数交叉法 。既能够一定程度上保证粒子的独立性质,又能够保证粒子所反映出的方案是可行的。若交叉后存在位置重复的情况,使用个体中未包括的城市编号去代替原本重复出现的城市。
1.3 变异操作
变异方法采用个体内部两位互换方法,通过变异的形式去实现更多不同的遍历方式,从而增加遍历方式的多样性。当变异后的粒子适应度优于原来的粒子则完成更新过程,否则保持原来的粒子状态。
2 部分代码
clc %清空命令行窗口
clear %从当前工作区中删除所有变量,并将它们从系统内存中释放
close all %删除其句柄未隐藏的所有图窗
tic % 保存当前时间
%% GA-PSO算法求解TSP
%输入:
%City 需求点经纬度
%Distance 距离矩阵
%NIND 种群个数
%MAXGEN 遗传到第MAXGEN代时程序停止
%输出:
%Gbest 最短路径
%GbestDistance 最短路径长度
%% 加载数据
load('./test_data/City.mat') %需求点经纬度,用于画实际路径的XY坐标
load('./test_data/Distance.mat') %距离矩阵
%% 初始化问题参数
CityNum=size(City,1)-1; %需求点个数
%% 初始化算法参数
NIND=60; %粒子数量
MAXGEN=100; %最大迭代次数
best
PopDistance(i) = CalcDis(Population(i,:),Distance); %计算距离
if PopDistance(i) < PbestDistance(i) %若新路径长度变短
Pbest(i,:)=Population(i,:); %更新Pbest
PbestDistance(i)=PopDistance(i); %更新Pbest距离
end
%% 根据Pbest更新Gbest
[mindis,index] = min(PbestDistance); %找出Pbest中最短距离
if mindis < GbestDistance %若Pbest中最短距离小于Gbest距离
Gbest = Pbest(index,:); %更新Gbest
GbestDistance = mindis; %更新Gbest距离
end
end
%% 显示此代信息
fprintf('Iteration = %d, Min Distance = %.2f km \n',gen,GbestDistance)
%% 存储此代最短距离
GbestDisByGen(gen)=GbestDistance;
%% 更新迭代次数
gen=gen+1;
end
%% 计算结果数据输出到命令行
disp('-------------------------------------------------------------')
toc %显示运行时间
TextOutput(Gbest,GbestDistance) %显示最优路径
%% 迭代图
figure
plot(GbestDisByGen,'LineWidth',2) %展示目标函数值历史变化
xlim([1 gen-1]) %设置 x 坐标轴范围
set(gca, 'LineWidth',1)
xlabel('Iterations')
ylabel('Min Distance(km)')
title('HPSO Process')
%% 绘制实际路线
DrawPath(Gbest,City)
3 仿真结果
4 参考文献
[1]侯颖, 何建军, 米阁,等. 基于混合粒子群算法求解TSP问题[J]. 电子测试, 2016(8X):2.
5 MATLAB代码与数据下载地址
见博客主页