💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥
✅博主简介:热爱科研的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对比
⛄二、遗传算法简介
1 遗传算法的思想来源
遗传算法是建立在自然选择学说基础之上的智能算法。生物种群在自然选择中优胜劣汰,代代繁衍。每一次种群更替,总是淘汰劣质基因、保留优质基因,从而朝着种群的最优发展方向进化。
生物遗传是生物种群不断靠近全局最优解的过程,那么我们能不能用这个思路来解决最优化问题呢?
当然可以:仿照自然遗传过程,①人为设定一个数据组作为“种群基因”,②以目标函数作为评判“发展方向优劣”的标准;③让这群数据通过计算机模拟的“交配”、“基因突变”、“种群复制”等自然选择过程,不断迭代更新、优胜劣汰;④基因趋于稳定时,我们称其为“成熟”,就得出问题的全局最优解。
2 遗传算法的原理分析
①建立种群的基因库------二进制编码
②实现遗传过程的交配、突变、选择遗传等过程
1)依适应度的概率选择规则
生物繁衍过程,种群的生老病死,基因是否突变,基因是否顺利遗传,哪两个基因发生交配等问题都是不确定的概率问题。因此,我们不能用绝对的标准控制某个基因的遗传情况。
因此,我们只能通过抽奖的方式,将某个个体被抽到的概率与其生存能力(适应度)挂钩。生存能力越强,适应度越大,自然也就有更大机会被选中,进行遗传行为了。
生物繁衍过程的适应度是指:生物生存技能、生物体质是否壮硕等指标。类似的,求解函数的最大值问题时,我们自然将自变量的函数值作为适应度了。函数值越大、它适应度越大,越容易被抽中。
同理,当求解最小值优化问题时,应构造适应度函数,使得函数值越小,适应度越大。
2)新种群复制
种群复制: 该步骤主要为选择一定数量的染色体复制到下一代,是实现“优胜劣汰”的关键步骤。每个个体是否能被遗传到下一代,由上述提到的个体适应度决定。
但是,这里存在两种复制方案,我认为有必要在这里说明一下:
① 将适应度从大到小进行排序,选取适应度最优的P_0个个体遗传到下一代
②依照适应度大小,得出被遗传的概率大小,依照概率随机抽选个体遗传。该方法中,最优个体有可能在复制中被丢失;最差个体也有可能被复制到下一代。
部分小伙伴可能理所当然认为①是最合理的。但并不是,两种方法有其各自的应用范围。下面分别谈谈:
1、办法①在求解一些简单的优化问题,通常局部最优即为全局最优解的问题是适用的。但是,每一步都只保留优秀个体而损失不良个体,可能会被“暂时的优秀”,即局部最优所蒙蔽。这种做法在面对复杂函数时,会失去一定的全局搜索能力。
3)新种群交配(交叉)
每次交叉的两个染色体为步骤2)中选出的染色体,将其序号作为参数传入crossover子函数中,是否交配遵循以下规则:
①依交叉概率pcrossover,使用下函数随机决定两个染色体是否发生交叉(后面判断是否变异也用它)。
②若发生交叉,再使用rand函数抽取一个交叉节点,将两个染色体节点前、后的部分交叉。
4)基因突变
基因变异即将基因序列上的某一位进行0-1翻转。变异的基因为由rand函数随机产生。
是否发生变异由变异概率pmutation决定。
5)主函数 遗传迭代
将函数块组合到主函数中,进行遗传迭代。
⛄三、部分源代码
clear
clc
close all
tic
%% 读取数据
load(‘shuju7’);
bl=0;
%% 提取数据信息
E=shuju(1,4); %初始点时间窗开始时间
L=shuju(1,5); %初始点心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
zuobiao=[zuobiao(:,1),-zuobiao(:,2)];
customer=zuobiao(2:end,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=1; %车辆数
a=shuju(2:end,4); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,5); %顾客时间窗结束时间[a[i],b[i]]
F=shuju(2:end,1);
dist=load(‘shiji7.mat’);%D导入距离矩阵
dist=struct2cell(dist);
dist=cell2mat(dist);
%% 遗传算法参数设置
chesu=300;%车速
alpha=100000; %违反的容量约束的惩罚函数系数
belta=chesu/1000;%违反时间窗约束的惩罚函数系数
belta2=1;
NIND=1000; %种群大小
MAXGEN=50; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum;
%% 初始化种群
[s,g,sj,gk,Chrom]=init(cusnum,NIND,F); %构造初始解
%% 输出随机解的路线和总距离
disp(‘初始种群中的一个随机值:’)
[VC,TD,violate_cus]=decode(Chrom(1,:),cusnum,a,b,L,dist,chesu,bl);
% disp([‘总距离:’,num2str(TD)]);
disp([‘车辆行驶总距离:’,num2str(TD)]);
disp(‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~’)
%% 优化
function lineStyles=linspecer(N,varargin)
if nargin==0 % return a colormap
lineStyles = linspecer(128);
return;
end
if ischar(N)
lineStyles = linspecer(128,N);
return;
end
if N<=0 % its empty, nothing else to do here
lineStyles=[];
return;
end
% interperet varagin
qualFlag = 0;
colorblindFlag = 0;
if ~isempty(varargin)>0 % you set a parameter?
switch lower(varargin{1})
case {‘qualitative’,‘qua’}
if N>12 % go home, you just can’t get this.
warning(‘qualitiative is not possible for greater than 12 items, please reconsider’);
else
if N>9
warning([‘Default may be nicer for ’ num2str(N) ’ for clearer colors use: whitebg(’‘black’‘); ‘]);
end
end
qualFlag = 1;
case {‘sequential’,‘seq’}
lineStyles = colorm(N);
return;
case {‘white’,‘whitefade’}
lineStyles = whiteFade(N);return;
case ‘red’
lineStyles = whiteFade(N,‘red’);return;
case ‘blue’
lineStyles = whiteFade(N,‘blue’);return;
case ‘green’
lineStyles = whiteFade(N,‘green’);return;
case {‘gray’,‘grey’}
lineStyles = whiteFade(N,‘gray’);return;
case {‘colorblind’}
colorblindFlag = 1;
otherwise
warning([‘parameter ‘’’ varargin{1} ‘’’ not recognized’]);
end
end
% .95
% predefine some colormaps
set3 = colorBrew2mat({[141, 211, 199];[ 255, 237, 111];[ 190, 186, 218];[ 251, 128, 114];[ 128, 177, 211];[ 253, 180, 98];[ 179, 222, 105];[ 188, 128, 189];[ 217, 217, 217];[ 204, 235, 197];[ 252, 205, 229];[ 255, 255, 179]}');
set1JL = brighten(colorBrew2mat({[228, 26, 28];[ 55, 126, 184]; [ 77, 175, 74];[ 255, 127, 0];[ 255, 237, 111].85;[ 166, 86, 40];[ 247, 129, 191];[ 153, 153, 153];[ 152, 78, 163]}'));
set1 = brighten(colorBrew2mat({[ 55, 126, 184]*.85;[228, 26, 28];[ 77, 175, 74];[ 255, 127, 0];[ 152, 78, 163]}),.8);
% colorblindSet = {[215,25,28];[253,174,97];[171,217,233];[44,123,182]};
colorblindSet = {[215,25,28];[253,174,97];[171,217,233].8;[44,123,182].8};
set3 = dim(set3,.93);
if colorblindFlag
switch N
% sorry about this line folks. kind of legacy here because I used to
% use individual 1x3 cells instead of nx3 arrays
case 4
lineStyles = colorBrew2mat(colorblindSet);
otherwise
colorblindFlag = false;
warning(‘sorry unsupported colorblind set for this number, using regular types’);
end
end
if ~colorblindFlag
switch N
case 1
lineStyles = { [ 55, 126, 184]/255};
case {2, 3, 4, 5 }
lineStyles = set1(1:N);
case {6 , 7, 8, 9}
lineStyles = set1JL(1:N)‘;
case {10, 11, 12}
if qualFlag % force qualitative graphs
lineStyles = set3(1:N)’;
else % 10 is a good number to start with the sequential ones.
lineStyles = cmap2linspecer(colorm(N));
end
otherwise % any old case where I need a quick job done.
lineStyles = cmap2linspecer(colorm(N));
end
end
lineStyles = cell2mat(lineStyles);
end
% extra functions
function varIn = colorBrew2mat(varIn)
for ii=1:length(varIn) % just divide by 255
varIn{ii}=varIn{ii}/255;
end
end
function varIn = brighten(varIn,varargin) % increase the brightness
if isempty(varargin),
frac = .9;
else
frac = varargin{1};
end
for ii=1:length(varIn)
varIn{ii}=varIn{ii}*frac+(1-frac);
end
end
function varIn = dim(varIn,f)
for ii=1:length(varIn)
varIn{ii} = f*varIn{ii};
end
end
function vOut = cmap2linspecer(vIn) % changes the format from a double array to a cell array with the right format
vOut = cell(size(vIn,1),1);
for ii=1:size(vIn,1)
vOut{ii} = vIn(ii,:);
end
end
%%
% colorm returns a colormap which is really good for creating informative
% heatmap style figures.
% No particular color stands out and it doesn’t do too badly for colorblind people either.
% It works by interpolating the data from the
% ‘spectral’ setting on http://colorbrewer2.org/ set to 11 colors
% It is modified a little to make the brightest yellow a little less bright.
function cmap = colorm(varargin)
n = 100;
if ~isempty(varargin)
n = varargin{1};
end
if n1
cmap = [0.2005 0.5593 0.7380];
return;
end
if n2
cmap = [0.2005 0.5593 0.7380;
0.9684 0.4799 0.2723];
return;
end
frac=.95; % Slight modification from colorbrewer here to make the yellows in the center just a bit darker
cmapp = [158, 1, 66; 213, 62, 79; 244, 109, 67; 253, 174, 97; 254, 224, 139; 255frac, 255frac, 191*frac; 230, 245, 152; 171, 221, 164; 102, 194, 165; 50, 136, 189; 94, 79, 162];
x = linspace(1,n,size(cmapp,1));
xi = 1:n;
cmap = zeros(n,3);
for ii=1:3
cmap(:,ii) = pchip(x,cmapp(:,ii),xi);
end
cmap = flipud(cmap/255);
end
function cmap = whiteFade(varargin)
n = 100;
if nargin>0
n = varargin{1};
end
thisColor = ‘blue’;
if nargin>1
thisColor = varargin{2};
end
switch thisColor
case {‘gray’,‘grey’}
cmapp = [255,255,255;240,240,240;217,217,217;189,189,189;150,150,150;115,115,115;82,82,82;37,37,37;0,0,0];
case ‘green’
cmapp = [247,252,245;229,245,224;199,233,192;161,217,155;116,196,118;65,171,93;35,139,69;0,109,44;0,68,27];
case ‘blue’
cmapp = [247,251,255;222,235,247;198,219,239;158,202,225;107,174,214;66,146,198;33,113,181;8,81,156;8,48,107];
case ‘red’
cmapp = [255,245,240;254,224,210;252,187,161;252,146,114;251,106,74;239,59,44;203,24,29;165,15,21;103,0,13];
otherwise
warning([‘sorry your color argument ’ thisColor ’ was not recognized’]);
end
cmap = interpomap(n,cmapp);
end
% Eat a approximate colormap, then interpolate the rest of it up.
function cmap = interpomap(n,cmapp)
x = linspace(1,n,size(cmapp,1));
xi = 1:n;
cmap = zeros(n,3);
for ii=1:3
cmap(:,ii) = pchip(x,cmapp(:,ii),xi);
end
cmap = (cmap/255); % flipud??
end
⛄四、运行结果
⛄五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]周景欣.遗传算法求解带时间窗的车辆路径问题[J].中国储运. 2023(01)
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 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合