粒子群优化算法车辆路径问题.docx
《粒子群优化算法车辆路径问题.docx》由会员分享,可在线阅读,更多相关《粒子群优化算法车辆路径问题.docx(12页珍藏版)》请在冰豆网上搜索。
粒子群优化算法车辆路径问题
粒子群优化算法
计算车辆路径问题
摘要
粒子群优化算法中,粒子群由多个粒子组成,每个粒子的位置代表优化问题在D维搜索空间中潜在的解。
根据各自的位置,每个粒子用一个速度来决定其飞行的方向和距离,然后通过优化函数计算出一个适应度函数值(fitness)。
粒子是根据如下三条原则来更新自身的状态:
(1)在飞行过程中始终保持自身的惯性;
(2)按自身的最优位置来改变状态;(3)按群体的最优位置来改变状态。
本文主要运用运筹学中粒子群优化算法解决车辆路径问题。
车辆路径问题由Dantzig和Ramser于1959年首次提出的,它是指对一系列发货点(或收货点),组成适当的行车路径,使车辆有序地通过它们,在满足一定约束条件的情况下,达到一定的目标(诸如路程最短、费用最小,耗费时间尽量少等),属于完全NP问题,在运筹、计算机、物流、管理等学科均有重要意义。
粒子群算法是最近出现的一种模拟鸟群飞行的仿生算法,有着个体数目少、计算简单、鲁棒性好等优点,在各类多维连续空间优化问题上均取得非常好的效果。
本文将PSO应用于车辆路径问题求解中,取得了很好的效果。
针对本题,一个中心仓库、7个需求点、中心有3辆车,容量均为1,由这三辆车向7个需求点配送货物,出发点和收车点都是中心仓库。
货物需求量
,且
。
利用matlab编程,求出需求点和中心仓库、需求点之间的各个距离,用
表示。
求满足需求的最小的车辆行驶路径,就是求
。
经过初始化粒子群,将初始的适应值作为每个粒子的个体最优解,并寻找子群内的最优解以及全局的最优解。
重复以上步骤,直到满足终止条件。
本题的最短路径由计算可知为
。
关键字:
粒子群算法、车辆路径、速度
一、问题的重述
一个中心仓库序号为0,7个需求点序号为1~7,其位置坐标见表1,中心有3辆车,容量均为1,由这三辆车向7个需求点配送货物,出发点和收车点都是中心仓库。
求满足需求的距离最小的车辆行驶路径。
表1仓库中心坐标和需求点坐标及需求量
序号
0
1
2
3
4
5
6
7
坐标
(18,54)
(22,60)
(58,69)
(71,71)
(83,46)
(91,38)
(24,42)
(18,40)
需求量
0
0.89
0.14
0.28
0.33
0.21
0..41
0.57
二、问题假设
1.现实生活中中心仓库以及各个需求点之间军事直线连接,两点之间距离即为坐标系中两点坐标间距离。
2.不因天气及失火等原因车辆停止运输。
3.每个需求点由一辆车供应货物。
三、符号说明
配送货物车辆数
需求点个数
货物需求量
配送货物车辆的容量
从点i到j的距离
需求点i由k车配送
车k从i行驶到j
四、问题分析
4.1算法分析
车辆路径问题(VRP)可以描述为有一个中心仓库,拥有K辆车,容量分别为
,负责向L个需求点配送货物,货物需求量为
,且
;
表示从点i到j的距离。
求满足需求的距离最小的车辆行驶路径。
将中心仓库编号为0,需求点编号为1,2,…,L。
数学模型为:
s.t.
其中,
,
在本题中,
货物需求量
,利用粒子群优化算法,经过初始化粒子群,将初始的适应值作为每个粒子的个体最优解,并寻找子群内的最优解以及全局的最优解。
重复以上步骤,直到满足终止条件。
4.2举例具体演算分析
例如,设VRP问题中发货点任务数为7,车辆数为3,若某粒子的位置向量X为:
发货点任务号:
1234567
Xv:
1222233
Xr:
1431221
则该粒子对应解路径为:
车1:
0→1→0
车2:
0→4→5→3→2→0
车3:
0→7→6→0
粒子速度向量V与之对应表示为Vv和Vr
该表示方法的最大优点是使每个发货点都得到车辆的配送服务,并限制每个发货点的需求仅能由某一车辆来完成,使解的可行化过程计算大大减少Z虽然该表示方法的维数较高,但由于PSO算法在多维寻优问题有着非常好的特性,维数的增加并未增加计算的复杂性,这一点在实验结果中可以看到
五、模型的建立与求解
在本题中,需要分别计算以下几个内容,计算需求点与中心仓库及各需求点间距离,利用粒子群优化算法,求出函数的全局最优位置和最后得到的优化极值。
5.1需求点与中心仓库及各需求点间距离
利用直角三角形勾股定理,求斜边长度。
,直角坐标系中求A,B两点之间距离
距离
0
1
2
3
4
5
6
7
0
0
7.2111
42.72
55.66
65.49
74.733
13.416
14
1
7.2111
0
37.108
50.22
62.586
72.422
18.111
20.396
2
42.72
37.108
0
13.153
33.971
45.277
43.417
49.406
3
55.66
50.22
13.153
0
27.731
38.588
55.227
61.4
4
65.49
62.586
33.971
27.731
0
11.314
59.135
65.276
5
74.733
72.422
45.277
38.588
11.314
0
67.119
73.027
6
13.416
18.111
43.417
55.227
59.135
67.119
0
6.3246
7
14
20.396
49.406
61.4
65.276
73.027
6.3246
0
5.2粒子群优化算法
5.2.1算法实现过程
步骤1 初始化粒子群
① 粒子群划分成若干个两两相互重叠的相邻子群;
② 每个粒子位置向量Xv的每一维随机取1~K(车辆数)之间的整数,Xr的每一维随机取1~L(发货点任务数)之间的实数;
③ 每个速度向量Vv的每一维随机取-(K-1)~(K-1)(车辆数)之间的整数,Vr的每一维随机取-(L-1)~(L-1)之间的实数;
④ 用评价函数Eval评价所有粒子;
⑤ 将初始评价值作为个体历史最优解Pi,并寻找各子群内的最优解Pl和总群体内最优解Pg
步骤2 重复执行以下步骤,直到满足终止条件或达到最大迭代次数
①对每一个粒子,计算Vv、Vr;计算Xv、Xr,其中Xv向上取整;当V、X超过其范围时按边界取值
②用评价函数Eval评价所有粒子;
③若某个粒子的当前评价值优于其历史最优评价值,则记当前评价值为该历史最优评价值,同时将当前位置向量记为该粒子历史最优位置Pi;
④寻找当前各相邻子群内最优和总群体内最优解,若优于历史最优解则更新Pl、Pg
5.2.2针对本题
0表示中心仓库,设车辆容量皆为q=1.0,由3辆车完成所有任务,初始化群体个数n=40;惯性权重w=0.729;学习因子c1=c2=1.49445;最大代数
;搜索空间维数(未知数个数)
算法得到的最优值的代数及所得到的最优解,预计迭代次数50,共进行20次运算
运算次数
1
2
3
4
5
6
7
8
9
10
总距离
217.81
230.41
217.81
217.81
303.04
217.81
303.04
217.81
217.81
230.41
运算次数
11
12
13
14
15
16
17
18
19
20
总距离
217.81
217.81
230.41
217.81
217.81
217.81
217.81
217.81
217.81
217.81
从实验结果分析,15次达到已知最优解,得到的最优总路径为:
对应的行车路线为:
车辆一:
车辆二:
车辆三:
行车总距离
粒子群优化算法达到最优路径50次的代数
7
23
2
17
7
17
13
7
41
19
28
11
33
14
21
23
11
71
82
24
13
58
36
20
10
3
8
5
65
35
9
2
15
76
25
67
30
55
9
29
21
6
38
9
43
148
1
29
3
79
六、模型的评价
粒子群优化算法结果分析
方法
达到最优路径次数
未达最优路径次数
达到最优路径平均代数
达到最优路径平均时间(S)
粒子群
50
0
28.36
3.04
分析PSO方法,可以看出它与GA等其他演化算法的最大不同在于
1)迭代运算中只涉及到初等运算,且运算量非常少;
2)每个粒子能直接获取群体历史经验和个体历史经验,比在其他方法中使用精英集(elitism)的方法更有效;
3)整个粒子群被划分为几个的子群,且子群之间有一定重叠,从而使收敛于局部最优解的几率大大减少L
正因为如此,本文将PSO应用于带时间窗车辆路径问题求解中,取得了很好的效果,有着运算速度快、解的质量与个体数目相关性小、所获得的解质量高等诸多优点
七、模型的改进和推广
7.1模型的改进
针对粒子群优化算法存在的问题,提出了一种新的改进算法—基于粒子进化的多粒子群优化算法。
该算法采用局部版的粒子群优化方法,从“粒子进化”和“多种群”两个方面对标准粒子群算法进行改进。
多个粒子群彼此独立地搜索解空间,保持了粒子种群的多样性,从而增强了全局搜索能力而适当的“粒子进化”可以使陷入局部最优的粒子迅速跳出,有效的避免了算法“早熟”,提高了算法的稳定性。
将基于粒子进化的多粒子群优化算法用于求解非线性方程组。
该算法求解精度高、收敛速度快,而且克服了一些算法对初值的敏感和需要函数可导的困难,能较快地求出复杂非线性方程组的最优解。
数值仿真结果显示了该算法的有效性和可行性,为求解非线性方程组提供了一种实用的方法。
7.2模型的推广
作为物流系统优化中的重要一环,合理安排车辆路径、进行物流车辆优化调度可以提高物流经济效益、实现物流科学化。
粒子群算法在多维寻优中有着非常好的特性,加入“邻居算子”的粒子群算法能使算法更好的全局寻优。
本文的研究表明,改进局部办粒子群算法,能过有效地解决车辆路径问题。
八、参考文献
[1] 李军,郭耀煌.物流配送车辆优化调度理论与方法[M].北京:
中国物资出版社,2001.
[2]马炫,彭芃,刘庆.求解带时间窗车辆路径问题的改进粒子群算法.计算机工程与应用,2009,45(27):
200-202
[3]姜启源,《数学建模》,高教出版社,2000年
附录
需求点与中心仓库及各需求点间距离
c=[];
zuobiao=[1854
2260
5869
7171
8346
9138
2442
1840];
fori=1:
8
forj=1:
8
c(i,j)=sqrt((zuobiao(j,2)-zuobiao(i,2))^2+(zuobiao(j,1)-zuobiao(i,1))^2);
end
end
c
粒子群优化算法求解
主算法
clearall;
clc;
formatlong;
%------给定初始化条件----------------------------------------------
c1=1.4962;%学习因子1
c2=1.4962;%学习因子2
w=0.7298;%惯性权重
MaxDT=50;%最大迭代次数
D=7;%搜索空间维数(未知数个数)
N=40;%初始化群体个体数目
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
fori=1:
N
forj=1:
D
x1(i,j)=ceil(3*rand());%随机初始化位置ceil是向离它最近的大整数圆整
x2(i,j)=ceil(7*rand());
v1(i,j)=2*(2*rand()-1);%随机初始化速度
%v2(i,j)=6*(2*rand()-1);
end
end
%------先计算各个粒子的适应度,并初始化Pbest和gbest----------------------
fori=1:
N
y1(i,:
)=x1(i,:
);
y2(i,:
)=x2(i,:
);
pbest(i)=fitness(y1(i,:
),y2(i,:
),D);
end
pg1=x1(1,:
);%Pg为全局最优
pg2=x2(1,:
);
fori=2:
N
iffitness(x1(i,:
),x2(i,:
),D)pg1=x1(i,:
);
pg2=x2(i,:
);
gbest=fitness(pg1,pg2,D);
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
fort=1:
MaxDT
fori=1:
N
v1(i,:
)=w*v1(i,:
)+c1*rand*(y1(i,:
)-x1(i,:
))+c2*rand*(pg1-x1(i,:
));
x1(i,:
)=x1(i,:
)+v1(i,:
);
x1(i,:
)=ceil(x1(i,:
));
forj=1:
D
ifx1(i,j)<1
x1(i,j)=1;
end
ifx1(i,j)>3
x1(i,j)=3;
end
end
forj=1:
D
x2(i,j)=ceil(7*rand());
end
iffitness(x1(i,:
),x2(i,:
),D)y1(i,:
)=x1(i,:
);
y2(i,:
)=x2(i,:
);
pbest(i)=fitness(y1(i,:
),y2(i,:
),D);
end
ifpbest(i)pg1=x1(i,:
);
pg2=x2(i,:
);
end
end
end
%------最后给出计算结果
disp('*************************************************************')
disp('函数的全局最优位置为:
')
Solution1=pg1
Solution2=pg2
disp('最后得到的优化极值为:
')
Result=fitness(pg1,pg2,D)
disp('*************************************************************')
辅助算法一
functionresult=fitness(x1,x2,D);
aa=[infinfinfinfinfinfinf];
bb=[infinfinfinfinfinfinf];
cc=[infinfinfinfinfinfinf];
fori=1:
D
ifx1(i)==1
aa(i)=x2(i);
elseifx1(i)==2
bb(i)=x2(i);
else
cc(i)=x2(i);
end
end
end
result=f(cc)+f(bb)+f(aa);
辅助算法二
functionff=f(x);
loadc.mat
sum=0;
[yind]=sort(x);
fori=1:
7
ify(i)==inf
j=i-1;
break;
else
j=7;
end
end
ifj<1
sum=inf;
elseifj==1
sum=sum+2*c(1,ind(j)+1);
else
sum=sum+c(1,ind(j)+1)+c(1,ind
(1)+1);
fori=1:
j-1
sum=sum+c(ind(i)+1,ind(i+1)+1);
end
end
end
ff=sum;