路径规划基于节约算法实现CVRP问题

Posted Matlab走起

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路径规划基于节约算法实现CVRP问题相关的知识,希望对你有一定的参考价值。

带有容量约束的车辆路径问题(CVRP)

该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进。

C-W节约算法:

一、算法思想

节约里程法,顾名思义,是根据里程的节约值的大小来规划线路的。假设有一个单配送中心以及10个客户节点构成的配送系统,在满足载重约束的情况下,计算最少的车辆数和最短的总路径长度,如果用节约里程法进行求解,其算法思想解析如下:

1、首先将10个点分别和配送中心连线构成一个环路,计算从配送中心出发到达该点并回到配送中心的总里程。

2、然后,从任意点开始,做节点的合并,即将相邻的两个点的两条子路径合并成一条子路径,合并后的环路的总里程一定比原来两条子路径的总里程之和要少,计算减少的里程数。其实也就是得到10个点中任意两个点合并成一条子路径后的节约里程表。

3、对得到的节约里程表按照节约值降序排列,然后进行节点的合并和约束判断。

4、优先合并节约值大的两点,合并完一对点之后就要对节约里程表进行修订,去掉已合并的点和对应的节约值,重新降序排列,继续合并剩余的未合并的节点,注意,在合并的时候要分辨是在节点的左边还是右边进行插入,另外,考虑到载重约束,某一条子路径的总的转载量达到载重要求时就立即回到配送中心,停止加入新的节点。

5、如此,按照步骤4不断操作,等所有的节点都被合并之后,就完成了节约里程法的cvrp的求解了。

插入核心的合并过程的代码,如下图中代码所示:

 

 
clear
clc
tic
%% 用importdata这个函数来读取文件 
rc208=importdata('rc208.txt');
cap=1000;
%% 提取数据信息
vertexs=rc208(:,2:3);                                            %所有点的坐标x和y
customer=vertexs(2:end,:);                                       %顾客坐标
cusnum=size(customer,1);                                         %顾客数
demands=rc208(2:end,4);                                          %需求量
h=pdist(vertexs);
dist=squareform(h);                                             %距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
%% CW法构造CVRP初始解
[init_vc,init_TD,init_vl]=init_CVRP(rc208,cap);
initNV=size(init_vc,1);
str1=['车辆行驶总距离 =  ' num2str(init_TD)];
disp(str1)
str2=['车辆使用数目 =  ' num2str(initNV)];
disp(str2)
%% 判断最优解是否满足时间窗约束和载重量约束,0表示违反约束,1表示满足全部约束
flag=Judge(init_vc,cap,demands);
%% 检查最优解中是否存在元素丢失的情况,丢失元素,如果没有则为空
DEL=Judge_Del(init_vc);
%% 画出配送路线图
vertexs=rc208(:,2:3);                                            %所有点的坐标x和y
draw_Best(init_vc,vertexs);
toc

完整代码添加QQ1575304183

以上是关于路径规划基于节约算法实现CVRP问题的主要内容,如果未能解决你的问题,请参考以下文章

VRP问题基于节约算法CW求解带容量的车辆路径规划问题(CVRP)

CVRP基于matlab人工鱼群算法求解带容量的车辆路径规划问题含Matlab源码 1486期

CVRP基于matlab人工鱼群算法求解带容量的车辆路径规划问题含Matlab源码 1486期

CVRP基于matlab遗传算法求解带容量的车辆路径规划问题含Matlab源码 1280期

CVRP基于matlab蚁群算法求解带容量的车辆路径规划问题含Matlab源码 1039期

配送路径规划基于matlab蚁群优化节约算法单中心多城市配送车辆路径规划含Matlab源码 017期