资源简介
使用节约里程法求解有载重约束的CVRP,源码由matlab 语音编写,有注释,可以用来学习和使用节约里程法。源码来源于一个项目,亲测无误,压缩包里面有完整的数据和参考文献,值得新手学习使用,欢迎大家下载评论。
代码片段和文件信息
clear
%A点集合,第一个点表示配送中心。
% A=[50 19 49 49 53 85 33 59 33 82 70;
% 50 16 92 30 42 90 74 32 23 59 41;
% 0 1.15 1.34 0.53 1.79 1.47 0.01 0.95 0.26 1.21 0.69];
% A=[];
load A.mat
rong=3500;
% rong=2100;%最大负载
m=size(A2);%客户数量
c=zeros(mm);%距离表
for j=1:m
for i=(j+1):m
c(ij)=sqrt((A(1i)-A(1j))^2+(A(2i)-A(2j))^2);
end
end
p=zeros(m-1m-1);%节约里程表去掉第一个配送中心
for j=2:(m-1)
for i=(j+1):m
p(i-1j-1)=c(i1)+c(j1)-c(ij);
end
end
s=p(:);
[hswz]=sort(s1‘descend‘);%降序排序,hs值,wz对应的索引
hs(find(hs==0))=[]; %去掉值为0的元素
for i=1:size(hs)
[sub(i1)sub(i2)]=ind2sub(size(p)wz(i)); %将P矩阵各元素索引转换成坐标,并存储到sub矩阵
end;
svt=[hssub];%%得到节约里程的降序表,值,行号,列号。
route=zeros(m-1m-1);
sv=0;
Zhuang=[];
for j=1:m-1
for i=1:size(svt1) %求从最大节约值开始,可一起配送的两个客户,作为初始解
if A(3(svt(i2)+1))+A(3(svt(i3)+1))<=rong
solut=[svt(i2)svt(i3)];
sv=sv+svt(i1);%存累计节约值
zhuang=A(3(solut(11)+1))+A(3(solut(12)+1));%存当前载重量
ii=i;
break
end
end
for i=(ii+1):size(svt)
if (svt(i2)==solut(11))&&(isempty(find(svt(i3)==solut))==1)&&((A(3(svt(i3)+1))+zhuang)<=rong); %从最大的小于初始解对应的最大节约值对应的坐标判断(左坐标等于最优解的左坐标,并且右坐标不等于最优解的右坐标,并且容量不超)
solut=[svt(i3)solut]; %如满足条件,将右坐标加到路径的左侧
sv=sv+svt(i1);
zhuang=A(3(svt(i3)+1))+zhuang;
elseif (svt(i2)==solut(1length(solut)))&&(isempty(find(svt(i3)==solut))==1)&&((A(3(svt(i3)+1))+zhuang)<=rong);
solut=[solutsvt(i3)];%如满足条件,将右坐标加到路径的右侧
sv=sv+svt(i1);
zhuang=A(3(svt(i3)+1))+zhuang;
elseif (svt(i3)==solut(11))&&(isempty(find(svt(i2)==solut))==1)&&((A(3(svt(i2)+1))+zhuang)<=rong);
solut=[svt(i2)solut];
sv=sv+svt(i1);
zhuang=A(3(svt(i2)+1))+zhuang;
elseif (svt(i3)==solut(1length(solut)))&&(isempty(find(svt(i2)==solut))==1)&&((A(3(svt(i2)+1))+zhuang)<=rong);
solut=[solutsvt(i2)];
sv=sv+svt(i1);
zhuang=A(3(svt(i2)+1))+zhuang;
else
continue
end
end
for i=size(svt):-1:1 %删除已经选到路径中的点
if ((isempty(find(svt(i2)==solut))==0)||(isempty(find(svt(i3)==solut))==0));
svt(i:)=[];
else
continue
end
end
route(j(1:length(solut)))=solut; %将确定好的某一条路径存到route矩阵的一行中
Zhuang=[Zhuangzhuang];
if isempty(svt) %直到判断svt无元素,退出
break
end
end
for i=1:m-1 %判断route中没有的单一用户,增加一行,加入到route中
if (isempty(find(route(:)==i))==1)
route(j+11)=i;
j=j+1;
end
end
opt=2*sum(c(:1))-sv;%行驶距离
plot(A(11)A(21)‘s‘)
% text(A(11)A(21)[‘(‘num2str(A(11))‘‘num2str(A(21))‘)‘])
hold on;
for i=2:m
plot (A(1i)A(2i)‘o‘)
% text(A(1i)A(2i)[‘(‘num2s
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1572 2020-02-16 15:53 节约里程法\A.mat
文件 4276 2020-04-26 16:03 节约里程法\cw.m
文件 10918 2020-02-16 19:48 节约里程法\data(1).xlsx
文件 1085 2020-02-16 16:35 节约里程法\dis2dot.m
文件 2127855 2020-02-16 14:53 节约里程法\考虑碳排放的多车场多车型VRP模型及算法研究_刘丽姣.caj
目录 0 2020-02-16 19:48 节约里程法\
- 上一篇:模糊推理系统的matlab代码
- 下一篇:matlab实现手写数字识别
评论
共有 条评论