粒子群优化算法车辆路径问题

更新时间:2023-04-06 14:52:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1 粒子群优化算法 计算车辆路径问题

摘要

粒子群优化算法中,粒子群由多个粒子组成,每个粒子的位置代表优化问题在D 维搜索空间中潜在的解。根据各自的位置,每个粒子用一个速度来决定其飞行的方向和距离,然后通过优化函数计算出一个适应度函数值(fitness)。粒子是根据如下三条原则来更新自身的状态:(1)在飞行过程中始终保持自身的惯性;(2)按自身的最优位置来改变状态;(3)按群体的最优位置来改变状态。本文主要运用运筹学中粒子群优化算法解决车辆路径问题。车辆路径问题 由Dan tzig 和Ram ser 于1959年首次提出的, 它是指对一系列发货点(或收货点) , 组成适当的行车路径, 使车辆有序地通过它们, 在满足一定约束条件的情况下, 达到一定的目标(诸如路程最短、费用最小, 耗费时间尽量少等) , 属于完全N P 问题, 在运筹、计算机、物流、管理等学科均有重要意义。粒子群算法是最近出现的一种模拟鸟群飞行的仿生算法, 有着个体数目少、计算简单、鲁棒性好等优点, 在各类多维连续空间优化问题上均取得非常好的效果。本文将PSO 应用于车辆路径问题求解中, 取得了很好的效果。

针对本题,一个中心仓库、7个需求点、中心有3辆车,容量均为1,由这三辆车向7个需求点配送货物,出发点和收车点都是中心仓库。1233,1,7.k q q q l =====货物需求

量12345670.89,0.14,0.28,0.33,0.21,0.41,0.57

g g g g g g g =======,且m a x i k g q ≤。利用matlab 编程,求出需求点和中心仓库、需求点之间的各

个距离,用ij c 表示。求满足需求的最小的车辆行驶路径,就是求

m i n i j i j k i j k Z c x =∑∑∑

。经过初始化粒子群,将初始的适应值作为每个粒子的个

体最优解,并寻找子群内的最优解以及全局的最优解。重复以上步骤,直到满足终止条件。本题的最短路径由计算可知为217.81。

关键字:粒子群算法、车辆路径、速度

一、问题的重述

一个中心仓库序号为0,7个需求点序号为1~7,其位置坐标见表1,中心有3辆车,容量均为1,由这三辆车向7个需求点配送货物,出发点和收车点都是中心仓库。求满足需求的距离最小的车辆行驶路径。

表1 仓库中心坐标和需求点坐标及需求量

二、问题假设

1.现实生活中中心仓库以及各个需求点之间军事直线连接,两点之间距离即为坐标系中两点坐标间距离。

2.不因天气及失火等原因车辆停止运输。

3.每个需求点由一辆车供应货物。

三、符号说明

2

3

四、 问题分析

4.1算法分析

车辆路径问题(VRP )可以描述为有一个中心仓库,拥有K 辆车,容量分别为),,2,1(K k q k =,负责向L 个需求点配送货物,货物需求量为

),,2,1(L i g i =,且k i q g m a x m

a x ≤;ij c 表示从点i 到j 的距离。求满足需求的距离最小的车辆行驶路径。

将中心仓库编号为0,需求点编号为1,2,…,L 。

数学模型为:

m in ij ijk i j k Z c

x =∑∑∑

s.t.k q y g i k ki i ?≤∑,

L i y k ki ,,2,1,1 ==∑

k L j y x kj i ijk ?==∑;,,1,0,

k L i y x

ki j ijk

?==∑;,,1,0,

4 S x X ijk ∈=)(

k

L j i x ijk ?==;,,1,0,,10 或 k L i y ki ?==;,,1,0,10 或

其中,???=否则车配送由需求点01k i y ki

,???=否则0行驶驶从车1j i k x ijk 在本题中,1233,1,7.k q q q l =====货物

需求量12345670.89,0.14,0.28,0.33,0.21,0.41,0.57g g g g g g g =======,利用粒子群

优化算法,经过初始化粒子群,将初始的适应值作为每个粒子的个体最优解,并寻找子群内的最优解以及全局的最优解。重复以上步骤,直到满足终止条件。

4.2举例具体演算分析

例如, 设VRP 问题中发货点任务数为7, 车辆数为3, 若某粒子的位置向量X 为:

发货点任务号: 1 2 3 4 5 6 7

X v : 1 2 2 2 2 3 3

X r : 1 4 3 1 2 2 1

则该粒子对应解路径为:

车1: 0 → 1 → 0

车2: 0 → 4 →5 → 3→ 2→ 0

车3: 0 → 7→ 6→ 0

粒子速度向量V 与之对应表示为V v 和V r

该表示方法的最大优点是使每个发货点都得到车辆的配送服务, 并限制每个发货点的需求仅能由某一车辆来完成, 使解的可行化过程计算大大减少Z 虽然该表示方法的维数较高, 但由于PSO 算法在多维寻优问题有着非常好的特性, 维数的增加并未增加计算的复杂性, 这一点在实验结果中可以看到

五、 模型的建立与求解

5

在本题中,需要分别计算以下几个内容,计算需求点与中心仓库及各需求点间距离,利用粒子群优化算法,求出函数的全局最优位置和最后得到的优化极值。

5.1需求点与中心仓库及各需求点间距离

利用直角三角形勾股定理,求斜边长度。1122(,)(,)A x y B x y ,,直角坐标系中求A,B

两点之间距离AB =

5.2粒子群优化算法 5.2.1算法实现过程 步骤1 初始化粒子群

① 粒子群划分成若干个两两相互重叠的相邻子群;

② 每个粒子位置向量X v 的每一维随机取1~ K (车辆数) 之间的整数, X r 的每一维随机取1~L (发货点任务数) 之间的实数;

③ 每个速度向量V v 的每一维随机取- (K - 1)~ (K - 1) (车辆数) 之间的整数,V r 的每一维随机取- (L - 1)~ (L - 1) 之间的实数; ④ 用评价函数Eval 评价所有粒子;

⑤ 将初始评价值作为个体历史最优解P i , 并寻找各子群内的最优解P l 和

6 总群体内最优解P g

步骤2 重复执行以下步骤, 直到满足终止条件或达到最大迭代次数

①对每一个粒子, 计算V v 、V r ; 计算X v 、X r , 其中X v 向上取整; 当V 、X 超过其范围时按边界取值

② 用评价函数E va l 评价所有粒子;

③ 若某个粒子的当前评价值优于其历史最优评价值, 则记当前评价值为该历史最优评价值, 同时将当前位置向量记为该粒子历史最优位置P i ;

④ 寻找当前各相邻子群内最优和总群体内最优解, 若优于历史最优解则更新P l 、P g

5.2.2针对本题

0表示中心仓库, 设车辆容量皆为q = 1. 0, 由3辆车完成所有任务,初始化

群体个数n = 40; 惯性权重w = 0. 729;学习因子 c 1= c 2= 1. 49445; 最大代数50MaxDT =;搜索空间维数(未知数个数)7;D =

算法得到的最优值的代数及所得到的最优解,预计迭代次数50,共进行20次运算

从实验结果分析,15次达到已知最优解,得到的最优总路径为:

0760*******→→→→→→→→→→

对应的行车路线为:

车辆一:0760→→→

车辆二:010→→

车辆三:023450→→→→→

行车总距离 217.81

粒子群优化算法达到最优路径50次的代数

六、模型的评价

粒子群优化算法结果分析

分析PSO 方法, 可以看出它与GA 等其他演化算法的最大不同在于

1) 迭代运算中只涉及到初等运算, 且运算量非常少;

2) 每个粒子能直接获取群体历史经验和个体历史经验, 比在其他方法中使用精英集(elit ism ) 的方法更有效;

3) 整个粒子群被划分为几个的子群, 且子群之间有一定重叠, 从而使收敛于局部最优解的几率大大减少L

正因为如此, 本文将PSO 应用于带时间窗车辆路径问题求解中, 取得了很好的效果, 有着运算速度快、解的质量与个体数目相关性小、所获得的解质量高等诸多优点

七、模型的改进和推广

7.1模型的改进

7

针对粒子群优化算法存在的问题,提出了一种新的改进算法—基于粒子进化的多粒子群优化算法。该算法采用局部版的粒子群优化方法,从“粒子进化”和“多种群”两个方面对标准粒子群算法进行改进。多个粒子群彼此独立地搜索解空间,保持了粒子种群的多样性,从而增强了全局搜索能力而适当的“粒子进化”可以使陷入局部最优的粒子迅速跳出,有效的避免了算法“早熟”,提高了算法的稳定性。

将基于粒子进化的多粒子群优化算法用于求解非线性方程组。该算法求解精度高、收敛速度快,而且克服了一些算法对初值的敏感和需要函数可导的困难,能较快地求出复杂非线性方程组的最优解。数值仿真结果显示了该算法的有效性和可行性,为求解非线性方程组提供了一种实用的方法。

7.2模型的推广

作为物流系统优化中的重要一环,合理安排车辆路径、进行物流车辆优化调度可以提高物流经济效益、实现物流科学化。粒子群算法在多维寻优中有着非常好的特性,加入“邻居算子”的粒子群算法能使算法更好的全局寻优。本文的研究表明,改进局部办粒子群算法,能过有效地解决车辆路径问题。

八、参考文献

[1] 李军, 郭耀煌. 物流配送车辆优化调度理论与方法[M ]. 北京: 中国物资出版社, 2001.

[2] 马炫,彭芃,刘庆. 求解带时间窗车辆路径问题的改进粒子群算法.计

算机工程与应用,2009,45(27):200-202

[3]姜启源,《数学建模》,高教出版社,2000年

8

附录

需求点与中心仓库及各需求点间距离

c=[];

zuobiao=[18 54

22 60

58 69

71 71

83 46

91 38

24 42

18 40];

for i=1:8

for j=1:8

c(i,j)=sqrt((zuobiao(j,2)-zuobiao(i,2))^2+(zuobiao(j,1)-zuobiao(i,1)) ^2);

end

end

c

粒子群优化算法求解

主算法

clear all;

clc;

format long;

%------给定初始化条件----------------------------------------------

c1=1.4962; %学习因子1

c2=1.4962; %学习因子2

w=0.7298; %惯性权重

MaxDT=50; %最大迭代次数

D=7; %搜索空间维数(未知数个数)

N=40; %初始化群体个体数目

%------初始化种群的个体(可以在这里限定位置和速度的范围)------------

for i=1:N

for j=1:D

x1(i,j)=ceil(3*rand()); %随机初始化位置

x2(i,j)=ceil(7*rand());

9

v1(i,j)=2*(2*rand()-1); %随机初始化速度

%v2(i,j)=6*(2*rand()-1);

end

end

%------先计算各个粒子的适应度,并初始化Pbest和gbest---------------------- for i=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,:);

for i=2:N

if fitness(x1(i,:),x2(i,:),D)

pg1=x1(i,:);

pg2=x2(i,:);

gbest=fitness(pg1,pg2,D);

end

end

%------进入主要循环,按照公式依次迭代,直到满足精度要求------------

for t=1:MaxDT

for i=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,:));

for j=1:D

if x1(i,j)<1

x1(i,j)=1;

end

if x1(i,j)>3

x1(i,j)=3;

end

end

for j=1:D

x2(i,j)=ceil(7*rand());

end

if fitness(x1(i,:),x2(i,:),D)

y1(i,:)=x1(i,:);

y2(i,:)=x2(i,:);

pbest(i)=fitness(y1(i,:),y2(i,:),D);

end

if pbest(i)

pg1=x1(i,:);

10

pg2=x2(i,:);

end

end

end

%------最后给出计算结果

disp('*************************************************************') disp('函数的全局最优位置为:')

Solution1=pg1

Solution2=pg2

disp('最后得到的优化极值为:')

Result=fitness(pg1,pg2,D)

disp('*************************************************************') 辅助算法一

function result=fitness(x1,x2,D);

aa=[inf inf inf inf inf inf inf];

bb=[inf inf inf inf inf inf inf];

cc=[inf inf inf inf inf inf inf];

for i=1:D

if x1(i)==1

aa(i)=x2(i);

else if x1(i)==2

bb(i)=x2(i);

else

cc(i)=x2(i);

end

end

end

result=f(cc)+f(bb)+f(aa);

辅助算法二

function ff=f(x);

load c.mat

sum=0;

[y ind]=sort(x);

for i=1:7

if y(i)==inf

j=i-1;

break;

else

j=7;

end

end

if j<1

sum=inf;

11

else if j==1

sum=sum+2*c(1,ind(j)+1);

else

sum=sum+c(1,ind(j)+1)+c(1,ind(1)+1);

for i=1:j-1

sum=sum+c(ind(i)+1,ind(i+1)+1);

end

end

end

ff=sum;

12

本文来源:https://www.bwwdw.com/article/it2l.html

Top