【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】

本文主要是介绍【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、VRP简介

1 VRP基本原理
车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一。VRP关注有一个供货商与K个销售点的路径规划的情况,可以简述为:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达,使用的车辆数最小等)。
VRP的图例如下所示:
在这里插入图片描述
2 问题属性与常见问题
车辆路径问题的特性比较复杂,总的来说包含四个方面的属性:
(1)地址特性包括:车场数目、需求类型、作业要求。
(2)车辆特性包括:车辆数量、载重量约束、可运载品种约束、运行路线约束、工作时间约束。
(3)问题的其他特性。
(4)目标函数可能是总成本极小化,或者极小化最大作业成本,或者最大化准时作业。

3 常见问题有以下几类:
(1)旅行商问题
(2)带容量约束的车辆路线问题(CVRP)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)带时间窗的车辆路线问题
由于VRP问题的持续发展,考虑需求点对于车辆到达的时间有所要求之下,在车辆途程问题之中加入时窗的限制,便成为带时间窗车辆路径问题(VRP with Time Windows, VRPTW)。带时间窗车辆路径问题(VRPTW)是在VRP上加上了客户的被访问的时间窗约束。在VRPTW问题中,除了行驶成本之外, 成本函数还要包括由于早到某个客户而引起的等待时间和客户需要的服务时间。在VRPTW中,车辆除了要满足VRP问题的限制之外,还必须要满足需求点的时窗限制,而需求点的时窗限制可以分为两种,一种是硬时窗(Hard Time Window),硬时窗要求车辆必须要在时窗内到达,早到必须等待,而迟到则拒收;另一种是软时窗(Soft Time Window),不一定要在时窗内到达,但是在时窗之外到达必须要处罚,以处罚替代等待与拒收是软时窗与硬时窗最大的不同。
在这里插入图片描述
在这里插入图片描述
模型2(参考2017 A generalized formulation for vehicle routing problems):
该模型为2维决策变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)收集和分发问题
(5)多车场车辆路线问题
参考(2005 lim,多车场车辆路径问题的遗传算法_邹彤, 1996 renaud)
在这里插入图片描述
由于车辆是同质的,这里的建模在变量中没有加入车辆的维度。
在这里插入图片描述
在这里插入图片描述
(6)优先约束车辆路线问题
(7)相容性约束车辆路线问题
(8)随机需求车辆路线问题

4 解决方案
(1)数学解析法
(2)人机交互法
(3)先分组再排路线法
(4)先排路线再分组法
(5)节省或插入法
(6)改善或交换法
(7)数学规划近似法
(8)启发式算法

5 VRP与VRPTW对比
在这里插入图片描述

⛄二、IWD(智能水滴)算法简介

1 概述
在大自然中,河道是由流动的水滴组成的巨大群体移动创造的,相对于水滴群体本身来说,它们流经的河道周围就是它们所处在的环境,而这个环境正在被水滴群体的流动方向剧烈的改变着,同时周围的环境也在影响着水滴群体的流向。例如,环境当中的坚便的巨石泥土阳碍水滴的流动,而柔软松弛的泥土对于河水的流动的阻力就要小得多,实际上,大自然中的河流样貌就是由丁水滴群体和周围环境长期相互作用的结果而形成的。
依据人们的常识,大自然当中大部分的河流水道都是曲曲折折的,然而河流中的水清并不是像人类一样依靠视觉才到湖中或是海里的,而是,水滴在地球重力的作用下不断向前流动的。我们都知道,地球重力的方向指向地心,所以如果周围环境当中没有障碍物的话,水滴应该会沿着重力的方向向地心运动:由于在地球重力的作用下的,水滴在流动的过程当中会获得一定的加速度,因此随着运动其速度也会慢慢地不断增大。但是,在现实情况下,并不存在这样理想的状态也不存在从水清源头到地心的理想直线路径,甚至由于障砖物的影响,水消运动的实际路径与理想路径是远远不同的,因此才会有今天我们看到的河流样貌.而经研究发现,水滴在移动情况下建立起米的河道是最优的。河流当中的水滴具有两种属性:其本身具有一定的速度和携带一定量的泥土。在这样的情况下,水滴在运动时,就能够将泥上从一个地方向搬运到另一个地方。据我们所知,泥土会被水流从速度较高的地方携带到水流速度较低的地方,原因是当水滴速度较高时其具有的动能较大,能够克服地球重力对其所抛带泥土的作用,当水流具有的速度较低时,水滴携带的泥土会在地球重力的作用在水滴行进的路径中沉积下来。由于这个原因,泥土就会在水流速度较高的区域被搬移的越来越多,河道相应变得越来越深,也就吸引了越来越多的水流流向此处,进而可以容纳更多的水,同时水滴携带的泥土会在水流速度变慢时由于地球重力的作用
卸下来并沉积在河床上。
当一个水滴在河流中从一个地方流动另一个地方时,水滴具有的速度、水滴携带的泥土量、两个地方之间的泥土量三者都会发生明显的变化:
1)水滴流动时具有的速度会越来越大;
2)水滴携带的泥土量会越来越多:
3)位于这两点之间的河床上的泥土量会越来越少。

事实上,正如前文所描述,水清在从一个地方移动另一个地方的过程中会从河床上携带走一定量的泥土,河道上的泥土量会越来越少相应地水滴木身携带的泥土量会越来越多。在这个移动的过程中,水滴流动时具有的速度也会不断的变化。速度较大的水滴在流动时会从河床上携带走更多的泥上,除此之外,由于水滴流动时具有速度的快慢还和它周用所处的环境有关,周围的环境对水滴的移动起着阻碍的作用,所以当周围的泥土量较大时,水清在此段路径上流动时速度增长的就会越慢,当周围环境的泥土最较少时,水滴在此段路径上获得的速度就相应的会越来越快,向前流动就会更加容易:内此我们得到自然界中移动时的水滴具备以下属性:
1)流动速度高的水滴比流动速度低的水滴在路径中移动时能够携带走更多的泥土:
2)水滴能够在泥土量较小的路径中获取的速度增量大于比在泥土最较多的路径中获取的速度增量:
3)水滴在选择路径流动时会以较大的可能性朝着泥土量较少的路径移动.
3 智能水滴算法的基本原理
前文已经介绍了大自然中水滴具有某些典型的特点,根据上文中描述的这些特性, 根据人们的想象, 可以虚拟建立人工模型, 称为智能水滴(IWD) , 它具备两个重要的属性:我们一般用soil(IWD) 表示水滴木身携带的泥土量, 用veloci tv(/WD) 表示水清向前流动时本身具有的速度口,在工程问题巾,智能水滴流动时周围的环境就代表着我们需要解决的工程问题,而由于相互作用智能水滴寻找的最短路径就是我们解决工程问题找到的最优路径, 在子找最优路径的过程中, 智能水滴具有的两项重要属性即soil(JWD) 和
velocity(IWD) 是不断变化的。
我们假设某些智能水滴在某种环境下流动,从始点流向某个终点,在这种情况下,从始点到达终点的路径可能不止一条.这里所指的环境就是实践当中我们需要解决的工程类问题,可以分为两种问题:
其一:在终点已知的情况下,解决此类问题需要按照某个标准(一般情况下是距离)从始点到终点找到最佳路径.
其二:在终点的位置事先不知道的情况下,解决此类问题需要按照代价或者其他标准找到终点最优的位置。

⛄三、部分源代码

clc; close all; clear all;

%% Variable initialization
iterations = 60;
pIter = 3; % # of parallel sol’ns calculated to find totalbest

stats = zeros(iterations, 2); % rows are iteration number, columns are best/worst

% Initial variables
tempInit = 150; % initial temperature for SA
temp = tempInit;
tempDec = 0.95; % temperature decrease rate
tempIter = 1; % number of iterations at each step
soilInit = 1000;
velocityInit = 100;
a_v = 1000; a_s = 1000;
b_v = 0.01; b_s = 0.01;
c_v = 1; c_s = 1;

vel_params = [a_v b_v c_v];
soil_params = [a_s b_s c_s];

% Soil updating params
rho_o = 0.9;
rho_n = 1 - rho_o;
% Global soil updating params
rho_s = 0.8;
rho_iwd = -1.5;

% Data sets
pind = 1; % problem index
problempath = ‘./…/data/problems/’;
problemfiles = { ‘p01’, ‘p02’, ‘p03’, ‘p04’, ‘p05’ };

solutionpath = ‘./…/data/solutions/’;
solutionfiles = { ‘p01.res’, ‘p02.res’, ‘p03.res’, ‘p04.res’, ‘p05.res’ };

%% Load and format data
% Grab the first fileset
[desc, depot_desc, cust, depot] = parseProblemSet(strcat(problempath, problemfiles{pind}));
num_customers = desc(3);
num_depots = desc(4);
num_vehicles = desc(2);
all_coords = [cust(:,2:3); depot(:,2:3)];

% Build adjacency matrix row is source, col is dest
[ distMat globalSoilMat ] = prepareBoard(desc, depot_desc, cust, depot, soilInit);
soilMat = globalSoilMat;
% Soil weightings based on edge length
soilMat = log(distMat+1).*globalSoilMat; %logarithmic
%soilMat = distMat.*globalSoilMat; %linear
%soilMat = exp(distMat).*globalSoilMat; %exponential
soilMat = normalizeSoilMat(soilMat, soilInit);
globalSoilMat = soilMat; % globalSoilMat contains the soil going forward

%% Initialize agents
for i = 1:pIter
dropstemp = [];
for d = 1:num_depots % for each depot
for v = 1:num_vehicles % populate vehicles
dep = depot(d,1);
capacity = depot_desc(d,2);
dropstemp = [ dropstemp; WaterDrop(dep,capacity,velocityInit, …
vel_params, soil_params) ];
end
end
drops(:, 1, i) = dropstemp;
end

clear dropstemp;

% Best solution
best_sol = 0;
best_cost = 0;
temp_counter = 0;

%% Simulate water drops
for it = 1:iterations
% reset calcualtion variables
soilMat = globalSoilMat;
for i = 1:pIter

    % reset dropletsfor dr = 1:length(drops)drops(dr, 1, i) = drops(dr, 1, i).reset(velocityInit);end
endfor s = 1:pIter % iterate to get parallel solutions and then will compare % Build a full route set with multiple agents% Reset the parameters of each water drop on initcustomers = cust(:,1);demand = [cust(:,1) cust(:, 5)];while ~isempty(customers)for i = 1:length(drops)if isempty(customers)break; % stop processing this loop since allocation completeend% Simulate water drop flow for one agentiwd = drops(i, 1, s);iwd = iwd.flow(soilMat,customers, demand);customers(customers == iwd.route(end)) = [];% Update water dropiwd = iwd.updateVelocity(soilMat);iwd = iwd.updateSoil(distMat);drops(i, 1, s) = iwd;% Update soil on edgesdsoil = iwd.deltaSoil(distMat);n = length(iwd.route);soilMat(iwd.route(n - 1), iwd.route(n)) = ...rho_o * soilMat(iwd.route(n - 1), iwd.route(n)) ...- rho_n * dsoil;soilMat(iwd.route(n), iwd.route(n - 1)) = ...rho_o * soilMat(iwd.route(n), iwd.route(n - 1)) ...- rho_n * dsoil;end% end of looping over agents for allocationend % end of customer allocation% send agents homefor i = 1:length(drops)drops(i, 1, s) = drops(i, 1, s).returnHome();endend % parallel solution constructionparallelCost = zeros(pIter, 1);
parallelBestCost = 0;% Calculate total solution cost (Euclidean distance; sum of routes)
for s = 1:pIterdropcost = 0;for i = 1:length(drops)dropcost = drops(i, 1, s).calcRouteCost(distMat);parallelCost(s) = parallelCost(s) + dropcost;end
end% Get index of the best solution
bestIndex = 0;
for s = 1:pIterif parallelCost(s) == min(parallelCost)bestIndex = s;parallelBestCost = parallelCost(s);break;end
end% Stat updating
stats(it, :) = [min(parallelCost) max(parallelCost)];% Update the best solution
if (parallelBestCost < best_cost) || (best_cost == 0)best_cost = parallelBestCostbest_sol = drops(:, :, bestIndex);
end% Update the global soil
probability = exp(-(parallelBestCost - best_cost)/temp);
temp_counter = temp_counter + 1;
if (temp_counter > tempIter)temp_counter = 0;temp = temp*tempDec; %reduce it
end
function [desc, depot_desc, cust, depot] = parseProblemSet(filename)
% Summary:  Function for parsing Cordeau problem sets and returning 
%           arrays containing the data.
% 
% desc:         Prob descr (type, # vehicles, # cust, # dep)
% depot_desc:   Descr of depots (max dur of route, max vehicle load)
% cust:         Customers (id, x,y, serv dur, demand, visit freq, 
%                           # visit combs, list visit combs)
% depot:        Depots (same as customers, but list is not present)f = fopen(filename); % Open for read% Description of problem set
desc = str2double(strsplit(strtrim(fgets(f)), ' '));
if length(desc) ~= 4error('File not correct format')
end% Pull out variables
desc_cell = num2cell(desc);
[ptype m n t] = desc_cell{:};% Depot descriptions
depot_desc = zeros(t,2);
for i = 1:tdepot_desc(i,:) = str2double(strsplit(strtrim(fgets(f)), ' '));
end% Customers
first_cust = str2double(strsplit(strtrim(fgets(f)), ' '));
cust = zeros(n,length(first_cust));
cust(1,:) = first_cust;
for i = 2:ncust(i,:) = str2double(strsplit(strtrim(fgets(f)), ' '));
end% Depots
first_depot = str2double(strsplit(strtrim(fgets(f)), ' '));
depot = zeros(t,length(first_depot));
depot(1,:) = first_depot;
for i = 2:tdepot(i,:) = str2double(strsplit(strtrim(fgets(f)), ' '));
endfclose(f); % Close it up
return

end

⛄四、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

这篇关于【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893271

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓