路径规划基于节约算法实现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期