1 简介
现有的区域内多配送中心配送多采用分区域独立配送模式.多个配送中心虽同属于一家企业,但一般情况下,企业会根据行政区划为每个配送中心划分一个业务范围,各配送中心间相对独立.在分区域独立配送模式下,一个客户会固定从属于某一特定配送中心,而不会根据客户的地理分布和需求特性进行调整,易导致各配送中心间任务分配不均.从理论研究 的 角 度 来 看,此 类 求 解 MDVRP 的 方 法 是“先分组后路径”,即分区域规划思想,将各配送中心割裂开来.分区的结果会直接影响区内路径的规划结果,不合理的分区算法常常会导致较差的路径规划.为避免此 类 问 题 的 出 现,本 文 采 用 整 体 配 送 模式,引入一个与所有的实际配送中心相连且距离为0的虚拟配送中心,所有车辆均从该虚拟配送中 心出发,经过实际配送中心对客户进行服务,然后再经实际配送中心返回该虚拟配送中心。
2 部分代码
% % clear clc close all tic %% 用importdata这个函数来读取文件 c101=importdata('c101.txt'); c102=importdata('c102.txt'); c103=importdata('c103.txt'); cap=200; %车辆最大装载量 v_num=4; %车辆最多使用数目 %% 提取配送中心1数据信息 E1=c101(1,5); %配送中心时间窗开始时间 L1=c101(1,6); %配送中心时间窗结束时间 vertexs1=c101(:,2:3); %所有点的坐标x和y customer1=vertexs1(2:end,:); %顾客坐标 cusnum1=size(customer1,1); %顾客数 demands1=c101(2:end,4); %需求量 a1=c101(2:end,5); %顾客时间窗开始时间[a[i],b[i]] b1=c101(2:end,6); %顾客时间窗结束时间[a[i],b[i]] s1=c101(2:end,7); %客户点的服务时间 h1=pdist(vertexs1); dist1=squareform(h1); %距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j] %% 提取配送中心2数据信息 E2=c102(1,5); %配送中心时间窗开始时间 L2=c102(1,6); %配送中心时间窗结束时间 vertexs2=c102(:,2:3); %所有点的坐标x和y customer2=vertexs2(2:end,:); %顾客坐标 cusnum2=size(customer2,1); %顾客数 demands2=c102(2:end,4); %需求量 a2=c102(2:end,5); %顾客时间窗开始时间[a[i],b[i]] b2=c102(2:end,6); %顾客时间窗结束时间[a[i],b[i]] s2=c102(2:end,7); %客户点的服务时间 h2=pdist(vertexs2); dist2=squareform(h2); %距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j] %% 提取配送中心3数据信息 E3=c103(1,5); %配送中心时间窗开始时间 L3=c103(1,6); %配送中心时间窗结束时间 vertexs3=c103(:,2:3); %所有点的坐标x和y customer3=vertexs3(2:end,:); %顾客坐标 cusnum3=size(customer3,1); %顾客数 demands3=c103(2:end,4); %需求量 a3=c103(2:end,5); %顾客时间窗开始时间[a[i],b[i]] b3=c103(2:end,6); %顾客时间窗结束时间[a[i],b[i]] s3=c103(2:end,7); %客户点的服务时间 h3=pdist(vertexs3); dist3=squareform(h3); %距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j] %% 遗传算法参数设置 alpha=5; %违反的容量约束的惩罚函数系数 belta=5; %违反时间窗约束的惩罚函数系数 NIND=30; %种群大小 MAXGEN=100; %迭代次数 Pc=0.7; %交叉概率 Pm=0.1; %变异概率 GGAP=0.9; %代沟(Generation gap) N1=cusnum1+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1 N2=cusnum2+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1 N3=cusnum3+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1 %% 初始化种群 init_vc1=init(cusnum1,a1,demands1,cap); %构造初始解 Chrom1=InitPopCW(NIND,N1,cusnum1,init_vc1); init_vc2=init(cusnum2,a2,demands2,cap); %构造初始解 Chrom2=InitPopCW(NIND,N2,cusnum2,init_vc2); init_vc3=init(cusnum3,a3,demands3,cap); %构造初始解 Chrom3=InitPopCW(NIND,N3,cusnum3,init_vc3); % disp(['总距离:',num2str(TD)]); % disp(['车辆使用数目:',num2str(NV),',车辆行驶总距离:',num2str(TD),',违反约束路径数目:',num2str(violate_num),',违反约束顾客数目:',num2str(violate_cus)]); % disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~') %% 优化 gen=1; gen=gen+1 end % %% 画出最优解的路线图 % ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta); %计算种群目标函数值 % [minObjV,minInd]=min(ObjV); % %% 输出最优解的路线和总距离 % disp('最优解:') % bestChrom=Chrom(minInd(1),:); % [bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist); % disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD),',违反约束路径数目:',num2str(best_vionum),',违反约束顾客数目:',num2str(best_viocus)]); % disp('-------------------------------------------------------------') % %% 判断最优解是否满足时间窗约束和载重量约束,0表示违反约束,1表示满足全部约束 % flag=Judge(bestVC,cap,demands,a,b,L,s,dist); % %% 检查最优解中是否存在元素丢失的情况,丢失元素,如果没有则为空 % DEL=Judge_Del(bestVC); %% 画出最终路线图 figure hold on;box on title('最优配送方案路线图') draw_Best(bestVC1,vertexs1,'A'); draw_Best(bestVC2,vertexs2,'B'); draw_Best(bestVC3,vertexs3,'C'); xlabel('横坐标') ylabel('纵坐标') % save c101.mat img =gcf; %获取当前画图的句柄 print(img, '-dpng', '-r600', './运行结果1.png') %即可得到对应格式和期望dpi的图像 figure plot(y) xlabel('代数') ylabel('适应度值') title('适应度曲线') toc img =gcf; %获取当前画图的句柄 print(img, '-dpng', '-r600', './运行结果.png') %即可得到对应格式和期望dpi的图像
3 仿真结果
4 参考文献
[1]张露. (2020). 基于改进遗传算法求解带时间窗车辆路径规划问题. 中国物流与采购(14).