一、实践目的
运用粒子群优化算法解决TSP问题。
二、实践内容
1、问题定义
旅行商问题,即TSP问题(Traveling Salesman Problem)又为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
2、实验数据
3、实验要求
(1)输出最终优化路径;输出搜索过程中路径变化曲线(初始,第100次,第200次,最终)。
(2)讨论遗传算法中各类参数对搜索性能的影响。
4、粒子群优化算法基本介绍
(1)起源
粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法、微粒群算法、或微粒群优化算法。是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。通常认为它是群集智能 (Swarm intelligence, SI) 的一种。它可以被纳入多主体优化系统(Multiagent Optimization System, MAOS)。粒子群优化算法是由Eberhart博士和kennedy博士发明。
(2)基本思想
粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。如下图1,设想这样一个场景:鸟群在森林中随机搜索食物,它们想要找到食物量最多的位置。但是所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。
3、实验要求
(1)输出最终优化路径;输出搜索过程中路径变化曲线(初始,第100次,第200次,最终)。
(2)讨论遗传算法中各类参数对搜索性能的影响。
4、粒子群优化算法基本介绍
(1)起源
粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法、微粒群算法、或微粒群优化算法。是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。通常认为它是群集智能 (Swarm intelligence, SI) 的一种。它可以被纳入多主体优化系统(Multiagent Optimization System, MAOS)。粒子群优化算法是由Eberhart博士和kennedy博士发明。
(2)基本思想
粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。如下图1,设想这样一个场景:鸟群在森林中随机搜索食物,它们想要找到食物量最多的位置。但是所有的鸟都不知道食物具体在哪个位置,只能感受到食物大概在哪个方向。每只鸟沿着自己判定的方向进行搜索,并在搜索的过程中记录自己曾经找到过食物且量最多的位置,同时所有的鸟都共享自己每一次发现食物的位置以及食物的量,这样鸟群就知道当前在哪个位置食物的量最多。在搜索的过程中每只鸟都会根据自己记忆中食物量最多的位置和当前鸟群记录的食物量最多的位置调整自己接下来搜索的方向。鸟群经过一段时间的搜索后就可以找到森林中哪个位置的食物量最多(全局最优解)。
(3)求解思路
粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。
在TSP问题中,我们将每一条访问城市的顺序编码为一个个体,每个种群有n个个体,即有n种访问顺序,同时,每个个体又有13个染色体,即[2,13]的随机排列(城市1作为起始和终止城市,不进行粒子操作),代表访问城市的顺序。 通过每一代的演化,对粒子群进行位置、速度更新操作,选择合适个体(最优的顺序)。
编码:位置(巡回顺序):符号编码。速度编码:定义为交换子序列。单个交换子 si ={n,m}对个体的第n个和第m个元素进行交换,则速度表示为交换子序列ss = {s1,s2…sm}由m个交换子组成,同时交换子序列有顺序,从第一个交换子操作。
适应度:为了能够让适应度高的个体保存下来,定义适应度为:
其中 distance 为每个个体(路径)的距离。显然,如果距离最短,则适应度最高,更利于遗传给后代。
速度更新:
三、实践结果
1、代码实现
使用matlab语言编写程序:
city =[16.47 96.10;
16.47 94.44;
20.09 92.54;
22.39 93.37;
25.23 97.24;
22.00 96.05;
20.47 97.02;
17.20 96.29;
16.30 97.38;
14.05 98.12;
16.53 97.38;
21.52 95.59;
19.41 97.13;
20.09 94.55;];
citynum = size(city,1); %城市数量
dist_city = zeros(citynum,citynum); %初始化城市距离
for i = 1:citynum %计算城市之间的距离
for j = 1:citynum
link = (city(j,1)-city(i,1)).^2+(city(j,2)-city(i,2)).^2;
dist_city(i,j)=sqrt(link);
end
end
padai = 2000; %演化代数
pasize = 100; %粒子数目
padim = citynum-1; %维度
pos = initpos( pasize,padim ); %初始化位置
v = initv( pasize,padim );%初始化速度
pbest =zeros(pasize,1); %单个粒子最优适应度
pid =zeros(size(pos)); %单个粒子对应的位置
w = 0.9; %权重
maxgbest = zeros(1); %整个过程中最优适应度
maxpgd = zeros(1,size(pos,2)); %整个过程全局最优位置
maxfitvalueall = []; %各代最优适应度
for item = 1:padai %演化
fitvalue = fit_cal(pos,dist_city); %适应度计算
%%%%%% 更新个体最优和全局最优 %%%%%%
[ pbest,pid,gbest,pgd ] = fit_cmp(pos,fitvalue,pbest,pid);
v = updatev( v,w,pos,pid,pgd); %更新速度
pos = updatepos( pos,v ); %更新位置
w = w - (w-0.01)/padai; %权重更新
maxfitvalueall =[maxfitvalueall,maxgbest];
if (gbest>maxgbest) %保留最优粒子
maxgbest = gbest; %最优适应度
maxpgd = pgd; %最优粒子
end
end
[fin_fit,max_fit_index] =max(fitvalue);
lu_bin = pos(max_fit_index,:); %适应度最大的路径
if(maxgbest>fin_fit) %最优粒子
lu_bin = pgd;
end
%%%%%% 计算最短路径 %%%%%%
min_distance = 0;
for j = 1:length(lu_bin)-1