1 模型
带时间窗的车辆路径问题是典型的NP难题,一种常用的求解方法是先对顾客分组,后进行路径优化的两阶段启发式算法.传统算法在顾客分组时主要考虑顾客的空间位置关系,但是忽略了顾客对服务时间窗口的要求.本文同时考虑顾客的时间和空间特性,提出了一种基于时空度量的顾客分组方法.在路径优化阶段,本文提出了一种禁忌搜索算法来进行求解,该算法中禁忌的对象不是解,而是这些解的目标函数值的区间,以便于提高收敛效率.作为验证,本文以Solomon标杆问题集为算例进行演算,结果表明,在窄时间窗约束下,基于时空距离的两阶段启发式算法明显优于基于空间距离的算法,且部分算例的解达到了国内外已发表的最好解.
2 部分代码
clear
clc
%% 用importdata这个函数来读取文件
tic
rc207=importdata('rc207.txt');
cap=1000; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%车辆负荷
E=rc207(1,5); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%仓库时间窗开始时间
L=rc207(1,6); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%仓库时间窗结束时间
vertexs=rc207(:,2:3); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%所有点的坐标x和y
customer=vertexs(2:end,:); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%顾客坐标
cusnum=size(customer,1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%顾客数
vecnum=cusnum; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%车辆数
demands=rc207(2:end,4); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%需求量
a=rc207(2:end,5); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%顾客时间窗开始时间[a[i],b[i]]
b=rc207(2:end,6); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%顾客时间窗结束时间[a[i],b[i]]
s=rc207(2:end,7); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%客户点的服务时间
h=pdist(vertexs);
dist=squareform(h); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??%距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
vehicles_customer=cell(vecnum,1); ? ? ? ? ? ? ? ? ? ? ? ? ??%每辆车所经过的顾客
%% 设置参数
alpha=1;
belta=1;
lamda=0.015;
delta=0.5;
maxIter=1500; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%最大迭代次数
%% 初始路径
%% CW法构造VRPTW初始解
%输出init_vc ? ? 每辆车所经过的顾客
%输出init_TD ? ? 所有车行驶的总距离
%输出init_vl ? ? 每辆车的装载量
%输出violate_INTW 判断是否违背时间窗约束,0代表不违背,1代表违背
% [init_vc,init_TD] = init_TW(rc207,L,demands,a,b,s,dist,cap);
[init_vc] =?init(cusnum,a,demands,cap);
S=init_vc;
Sbest=S; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%全局最优解
[f]=costFuction(S,a,b,s,L,dist,demands,cap,alpha,belta); ? ? ? ? ? ?% 计算初始解的成本
fBest=f;
%% Tabu Search
TbList=zeros(cusnum,cusnum); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%禁忌表
TbLength=20; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%禁忌长度
NS=neighborhood(S,cusnum,a,b,s,L,dist,demands,cap,alpha,belta,lamda); ? ??%S的邻域
[subNS]=subNeighbor(TbList,NS,fBest); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??% non-tabu or allowed by aspiration
iter=0;
while?iter<maxIter
? ?if?~isempty(subNS)
? ? ? [minValue,minIndex]=min(subNS(:,5)); ? ? ? ? ??%从邻域中找出车辆总行驶距离最小的行序号
? ? ? ?value=subNS(minIndex,:); ? ? ? ? ? ? ? ? ? ? ??%提取最小行序号的这一行数组
? ? ? ?i=value(1);
? ? ? ?j=value(2);
? ? ? ?k=value(3);
? ? ? ?p=value(4);
? ? ? ?fS=value(5);
? ? ? ?cS=travel_distance(S,dist);
? ? ? [S_copy]=insert(S,i,j,k,p);
? ? ? ?S_copy=deal_vehicles_customer(S_copy);
? ? ? ?if?fS<fBest
? ? ? ? ? ?fBest=fS;
? ? ? ? ? ?Sbest=deal_vehicles_customer(S_copy);
? ? ? ? ? [feasBest]=decide_Feasible(Sbest,a,b,s,L,dist,demands,cap);
? ? ? ? ? ?S=deal_vehicles_customer(S_copy);?
? ? ? ? ? ?NS=neighborhood(S_copy,cusnum,a,b,s,L,dist,demands,cap,alpha,belta,lamda);
? ? ? ? ? [subNS]=subNeighbor(TbList,NS,fBest);
? ? ? ? ? ?%更新禁忌表
? ? ? ? ? ?for?l=1:cusnum
? ? ? ? ? ? ? ?for?h=1:cusnum
? ? ? ? ? ? ? ? ? ?if?TbList(l,h)~=0
? ? ? ? ? ? ? ? ? ? ? ?TbList(l,h)=TbList(l,h)-1;
? ? ? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?end
? ? ? ? ? ?end
? ? ? ? ? ?if?TbList(i,j)==0
? ? ? ? ? ? ? ?TbList(i,j)=TbLength;
? ? ? ? ? ?else
? ? ? ? ? ? ? ?TbList(i,j)=0;
? ? ? ? ? ?end
? ? ? ? ? ?
? ? ? ?else?
? ? ? ? ? ?if?TbList(i,j)==0
? ? ? ? ? ? ? ?S=S_copy;
? ? ? ? ? ? ? ?q=violateLoad(S,demands,cap);
? ? ? ? ? ? ? ?w=violateTW(S,a,b,s,L,dist);
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?if?q>0
? ? ? ? ? ? ? ? ? ?alpha=alpha*(1+delta);
? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?if?w>0
? ? ? ? ? ? ? ? ? ?belta=belta*(1+delta);
? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?NS=neighborhood(S,cusnum,a,b,s,L,dist,demands,cap,alpha,belta,lamda);
? ? ? ? ? ? ? [subNS]=subNeighbor(TbList,NS,fBest);
? ? ? ? ? ? ? ?% 更新禁忌表
? ? ? ? ? ? ? ?for?l=1:cusnum
? ? ? ? ? ? ? ? ? ?for?h=1:cusnum
? ? ? ? ? ? ? ? ? ? ? ?if?TbList(l,h)~=0
? ? ? ? ? ? ? ? ? ? ? ? ? ?TbList(l,h)=TbList(l,h)-1;
? ? ? ? ? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?TbList(i,j)=TbLength;?
? ? ? ? ? ?end
? ? ? ?end
? ?else
? ? ? ?break
? ?end
? ?iter=iter+1;
end
%% 判断当前解是否存在元素丢失情况以及是否存在违反约束的情况
DEL=Judge_Del(Sbest);
[feasible]=decide_Feasible(Sbest,a,b,s,L,dist,demands,cap); ? ?%feasible=0 表示不满足,feasible=1表示满足
bestNV=size(Sbest,1);
bestTD=travel_distance(Sbest,dist);
%% 打印全局最优解路线图
draw_Best(Sbest,vertexs);
toc
3 仿真结果
4 参考文献
[1]戚铭尧, 丁国祥, 周游,等. 一种基于时空距离的带时间窗车辆路径问题算法[J]. 交通运输系统工程与信息, 2011(01):89-93.
|