【路径规划】基于matlab遗传算法求解仓库拣货距离最短优化问题【含Matlab源码 2154期】

news/2024/4/18 13:32:47/文章来源:https://blog.csdn.net/TIQCmatlab/article/details/127252412

一、物流配送中心拣货作业简介

1 物流配送中心拣货作业
1.1 问题描述

双区型仓库一般是由一定数量的等长巷道组成,巷道两侧的货架上存放着需要拣取的各种物品。横向有三条过道,不同于单区型仓库(single-block warehouse)的是:除巷道上下两端分别有过道外,中间还有一条过道(如图1中的过道b),而单区型仓库缺少中间这条过道。据相关文献分析,该条中间过道在提高大型仓库拣选效率方面有很大帮助[8,11,12]。

整个仓库平面图如图1所示,I/O为仓库的出入口,每个小方格代表一个货物储位,填充部分表示按某订单需拣取的货物所在的储位,上面的数组{x-y-z}代表对应的储位标号,其中x表示该所在的拣货巷道号,取值为1~10;y表示该储位位于巷道x的左边还是右边(1表示位于左边,2表示位于右边);z表示为该储位所在的行号(从下往上数),取值为1~40。例如:{5-2-26}表示该储位位于仓库中第5号巷道右边的第26行。

由于在本文设计的仓库中拣货巷道的宽度并不太宽,面对巷道时,拣货人员可以进行双侧取货,即对同一巷道中左右两边取货时拣货人员移动的距离可以忽略。
在这里插入图片描述
图1 双区型仓库平面图
为订单拣货的时间可分成行走(步行或驾驶车辆)时间、搜索时间、分拣时间等。按照Tompkins[13]的研究,行走时间常常占拣货时间的一半(见图2),可见,缩短行走距离对减少总的拣货时间作用很大。而所选的路径对行走路线长度和行走时间有直接的影响,因此,应该把路径选择作为提高拣货效率的一项重要的内容。
在这里插入图片描述
1.2 问题分类
由于拣货人员使用的推车的容量(或载重量)有限,本文将处理后的拣货订单的拣货方式分成一单一车和一单多车两种类型。

一单一车指的是某个拣货订单中所需的全部货物可以由一辆推车来回一次从仓库中一次全部取回,而不会超出推车的最大容量(或载重量)的情况。

一单多车指的是某个拣货订单中的所需的全部货物必须通过一辆推车来回多次才能全部从仓库中取回,即该订单上的所有货物的总体积(或总质量)已经超过了一辆推车的最大容量(或载重量)的情况。

1.3 模型建立
一单多车拣货路径问题主要考虑怎样将订单中所需货物分配到多个车次中拣取,使其总的拣货路径最优,该类问题类似于运筹学中的车辆路径问题(Vehicle Routing Problem,VRP),也称车辆调度问题(Vehicle Scheduling Problem,VSP)。

VRP的一般描述是:对一系列给定的客户点,要求确定适当的车辆行驶路线,使其从车场(如配送中心等)出发,有序地对它们进行服务,并在满足一定的约束条件下(如车辆载重量、客户需求量、时间窗限制等),使总运输成本达到最小(如使用车辆数最少,车辆行驶总距离最短等)[14,15]。

结合VRP的数学模型设计了一单多车拣货路径问题的数学模型。

(1)问题假设。现需y次车都从一个共同的源点(仓库出入口IO)出发,需要到仓库中不同的储位中去提取货物。假设储位为v1,v2,…,vm。并且源点和储位的位置是已知的,考虑到仓库中推车成本较低并且可重复使用,所以本问题不将车次数最小作为优化目标。

(2)模型目标。每一车次构成一个回路,确定每条回路内的路径安排和调度,使得所有回路的总行走距离S最小。

(3)变量说明。Qij:第i次车在其子回路上对应的第j个储位的取货量;li:第i条回路上的储位数;ci:第i次车对应的路径;cij:第i次车对应的子回路中顺序为j的储位点;i:每次车对应的编号;W:推车最大载重量;V:订单上所需拣取的货物总重量;m:订单中货物在仓库中的储位数;v0:源点;y:需要的车次数;S:总行走距离;di(j-1)j:第i次车对应的路线中顺序排列的第j-1个储位和第j个储位之间的最短距离;di(li)(0):第i次车对应的路线中第li个储位与源点v0之间的最短距离。

(4)建立模型
在这里插入图片描述
模型中,式(1)为目标函数,即最短的总行走距离;式(2)为推车的能力约束,即每个子回路中从储位拣取的货物的总量,保证每次车从储位中拣取的货物的总量不超过推车的最大载重量;式(3)表示拣取完订单所需的全部货物;式(4)~式(7)表示从每个待拣储位有且仅能取货一次;式(8)表示第i次车是否有拣货任务。

当订单上全部货物质量小于推车总的载重量W时,即就是式(2)中的W足够大,该数学模型表示一单一车情况下拣货路径模型。

2 遗传算法求解拣货路径问题
2.1 算法流程

基于遗传算法的拣货路径问题优化算法流程如图3所示。
在这里插入图片描述
图3 求解拣货路径问题的遗传算法流程图

2.2 确定编码方案
对于一单一车的境况,采用自然数编码方式,先对订单上的货物对应在仓库中的存储位置(储位)按顺序依次进行自然数编号,然后用这些储位点编号所组成的自然数序列表示拣货路径。其具体表示方法如下:

设订单中的有4种货物需要从仓库中拣取,这4种货物分布在仓库中4个储位位置上。则可以用0表示仓库出入口,从1至4的4个自然数分别依次表示一个储位。假设该订单的拣货路径如下:

路径:出入口0→储位点1→储位点4→储位点2→储位点3→出入口0

遗传算法所表示的自然数系列为:{0 1 4 2 3 0}。

考虑到一单多车情况下拣货路径问题中订单上的拣取任务可能要通过多次车次才能完成,为了在可行解中体现出多车次的特点,将对应的自然数序列插入相应的零来体现多车特点。具体方法如下:

设订单中的有7种货物需要从仓库中拣取,这7种货物分布在仓库中7个储位位置上。则可以用0表示仓库出入口,从1至7的7个自然数分别依次表示一个储位。假设该订单的拣货路径如下:

路径1:出入口0→储位点1→储位点5→储位点7→储位点4→出入口0

路径2:出入口0→储位点2→储位点3→储位点6→出入口0

遗传算法所表示的自然数系列为:{0 1 5 7 4 0 2 3 6 0}。

其中0的作用有两点:一是表示实际的路程起始点(即本题中的仓库出入口IO),二是用来分隔GA编码。具体分隔的方法是:首先得到一个不含0的可行自然数序列{1 5 7 4 2 3 6},再从左边开始,每次加入一点,直到加入下一个点就超出车辆装载能力限制为止,按所加入的点的先后顺序排列,得到一条子路径,即就是得到第一次车次的拣货任务,比如{1 5 7 4}。再从未加入的点继续该过程,获得下一条子路径。重复此过程至所有点均被选入为止,比如{2 3 6}。再在可行自然数序列中插入相应的0将个子路径分隔开来,于是得到了染色体编码{01 5 7 4 0 2 3 6 0}。

当染色体要进行下面的交叉、变异和“进化逆转”操作时,可先将染色体编码中表示多车的0去掉,算子操作完成后再按上面分隔编码方法插入相应的0得到相应的染色体。

2.3 确定适应度函数
问题的适应度函数取为哈密尔顿圈的长度的倒数(无惩罚函数),但是为了避免适应度过小,本文将该函数乘上一个起调节作用的系数,系数值为:
在这里插入图片描述
处理后的新适应度函数如下:
在这里插入图片描述
其中maxdd为订单中待拣货物所在的储位点之间的最大距离,lchrom为编码后的染色体的长度,即路径中经过储位点数(包括出入口结点),X为对应可行解的拣货路径长度。

2.4 选择(或复制)算子和交叉算子的设计
在文中用随机生成方法产生初始解群。然后按适应度比例方法(轮盘赌选择)从父代中每次挑选两个个体,以相应的概率参加交叉变异操作。
具体的交叉操作如下:

(1)随机在串中选择一个交配区域,如两父串交配区选定为:
在这里插入图片描述
(2)将B的交配区域加到A的前面或后面,A的交配区域加到B的前面或后面得到:
在这里插入图片描述
(3)在A′中自交配区域后依次删除与交配区相同的储位号码,得到最终的两个子串为:
在这里插入图片描述
与其它方法相比,这种方法在两父串相同的情况下也能产生一定程度的变异效果,能维持群体的多样化特征。

2.5 变异算子的设计
由于后面将引入了“进化逆转”操作技术,为保持群体内个体的多样化,本文采用连续多次对换的变异技术,使可行解有较大的顺序排列上的变化,以抑制“进化逆转”的同化作用。变异操作发生的概率取值比较小(本文设计变异操作发生概率Pm的取值为0.008),一旦变异操作发生,则用随机方法产生交换次数为K(本文设计K的取值为1~100的随机整数),对所需变异操作的染色体进行K次对换(对换的两码位也是随机产生的)。最后为保持群体内个体的多样化,在文中还采用了一种对解的扰动策略——最好解连续50代不变时则随机产生新的个体20个来替换20个随机抽取的旧个体[16]。

2.6“进化逆转”算子的设计
本文使用的“进化逆转”是一种单方向的(朝着改进的方向)和连续多次的“逆转”操作,即对于给定的染色体,若“逆转”使染色体(可行解)的适应度提高,则执行逆转操作,否则就放弃。如此反复,直到不存在这样的逆转操作为止。这一操作实际上使给定的染色体改良到它的局部极点,这种局部爬山能力与基本遗传算法的全局搜索能力相结合在实验中显示了较好的效果。

为了尽量避免算法出现“早熟”现象,在进化初期,控制“进化逆转”算子使用概率,确保算法能在全局范围内寻优;但是到了进化后期,为了加快算法局部爬山能力,加大该算子的使用概率。具体在程序设计中处理如下:
在这里插入图片描述
其中Pm*为“进化逆转”算子的操作发生概率,gen表示遗传进化代数。

二、部分源代码

clear all;
close all;
clc;
W=[0 0;10 15;10 20;10 70;10 85;20 5;20 95;30 70;45 75;45 85;50 55;60 60;70 70;70 85;70 95;75 20;75 45;80 5;80 45;90 75;95 90];
weight=[92 77 77 59 100 40 61 96 80 37 80 52 82 63 51 52 95 92 54 60];
NP=300;
D=20;
M=4;
fit=zeros(NP,D+M);
%fit
gen=0;
G=100;
N=size(W,1);
Dis=zeros(N);
fitness=zeros(1,NP);
pc=0.05;
pm=0.03;
bestg=[];
aa=100;%惩罚系数
fbestfitness=[];
for i=1:N
for j=1:N
Dis(i,j)=((W(i,1)-W(j,1))2+(W(i,2)-W(j,2))2)^0.5;
end
end
for i=1:NP
fit(i,:)=randperm(D+M);
rr1=find(fit(i,:)(D+1));
rr2=find(fit(i,:)
(D+2));
rr3=find(fit(i,:)(D+3));
rr4=find(fit(i,:)
(D+4));
fit(i,rr1(1,1))=0;
fit(i,rr2(1,1))=0;
fit(i,rr3(1,1))=0;
fit(i,rr4(1,1))=0;
end
dfitness=[];
sumfitness=0;
while gen<G
for i=1:NP
fitness(i)=fun1(fit(i,:),Dis,N,D,weight,aa,M);
end
maxfitness=max(fitness);
tt=find(fitness==maxfitness);
fit(NP,:)=fit(tt(1,1)😅;
fit(NP-5,:)=fit(tt(1,1)😅;
fit(NP-10,:)=fit(tt(1,1)😅;
fit(NP-20,:)=fit(tt(1,1)😅;
fit(NP-30,:)=fit(tt(1,1)😅;
%fitness
maxfitness=max(fitness);
minfitness=min(fitness);
sumfitness=sum(fitness);
fitvalue=fitness./sumfitness;
fitvalue1=cumsum(fitvalue);
ms=sort(rand(1,NP));
fiti=1;
newi=1;
fi=[];
n=[];
while newi<=NP
if (ms(newi))<fitvalue1(fiti)
fi(newi,:)=fit(fiti,:);
newi=newi+1;
else
fiti=fiti+1;
end
end
%%%%%%基于概率的交叉操作%%%%%%
%fi
temp=[];temp1=[];
index=randperm(NP);
fi=fi(index,:);
%fi
u=1;
for i=1:2:(NP-1)
for j=1:(D+M)
if rand<pc
pp=find(fi(i+1,:)==fi(i,j));
pp1=find(fi(i,:)==fi(i+1,j));
temp=fi(i,j);
fi(i,j)=fi(i+1,j);
fi(i+1,j)=temp;
temp1=fi(i,pp1(1,1));
fi(i,pp1(1,1))=fi(i+1,pp(1,1));
fi(i+1,pp(1,1))=temp1;
u=u+1;
end
end
end
%u
%fi
%%%%%%基于概率的变异操作%%%%%%
z=0;
for i=1:NP
if rand<pm
for j=1:ceil((D+M)/10)
r1=ceil((D+M)*rand);
z=fi(i,r1);
fi(i,r1)=ceil((D+M)*rand);
rr=find(fi(i,:)==fi(i,r1));
fi(i,rr(1,1))=z;
end
end
end

三、运行结果

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

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]王宏,符卓,左武.基于遗传算法的双区型仓库拣货路径优化研究[J].计算机工程与应用. 2009,45(06)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_398957.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象核心概念实验

第1关:面向对象核心概念编程-简单测试 本关任务: 一、请在源代码文件“Complex.java”中实现公开的复数类“Complex”,其变量(属性)是复数的实部与虚部,实部和虚部的类型都为double,访问限制为私有。同时定义以下公开方法: (1)构造方法:提供几种构造方法,包括没有…

第 8 章 项目质量管理

手工艺阶段---质量检验阶段---统计质量阶段---全面质量管理阶段&#xff08;TQM&#xff0c;全面&#xff0c;全过程&#xff0c;全员参与&#xff09; TQM又强调5Q法&#xff0c; QS&#xff1a;遵从质量管理体系&#xff0c;公司级负责 QP&#xff1a;制定质量管理计划&…

Vue中的props配置项(父组件向子组件传数据)

目录 总结 问题1&#xff1a;如果子组件Student.vue接收到数据后&#xff0c;要对数据进行操作&#xff0c;比如说&#xff1a;让显示在页面上的年龄比接收到的年龄要大&#xff0c;怎么操作&#xff1f;--> 通过 v-bind绑定属性 ,其属性值是 运行引号里面JS表达式执行的结…

Research on Micro-Expression Spotting Method Based on Optical Flow Features

Research on Micro-Expression Spotting Method Based on Optical Flow Features 哈喽&#xff0c;大家好&#xff0c;从今天开始更《菜鸡读论文》系列&#xff0c;因为我真的很菜&#xff0c;可以说是CV白的不能再白了&#xff0c;每天都在膜拜大佬&#xff0c;感觉别人和自己…

linux内存重映射的概念及对内核虚拟地址的重映射方法分析

【摘要】本文分析了Linux设备的内存映射的相关概念和理论&#xff0c;使用例子对mmap及nopage的驱动编写方法进行了解释&#xff0c;最后对3种不同的内核虚拟空间分配方法下&#xff0c;mmap驱动编写方法进行了细致的分析和调试。 1、mmap概念 如下图所示&#xff0c;mmap是操…

学习笔记276—怎么查询哪些药属于医保报销范围?

第一个方法:登陆中国医疗保险网。 点击下方的查询中的医保目录查询: 在页面中输入你想知道的药品名称即可: 意在交流学习,欢迎点赞评论🙏, 如有谬误,请联系指正。转载请注明出处。 联系方式: e-mail: heyi9069@gmail.com QQ: 3309198330(请简要说明来意,并备注“来…

Java 方法区的演进

在 JDK7 及以前&#xff0c;习惯上把方法区&#xff0c;称为永久代。JDK8开始&#xff0c;使用元空间取代了永久代。 元空间的本质和永久代类似&#xff0c;都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于&#xff1a;元空间不在虚拟机设置的内存中&#xff…

Python 中计算字符串中的元音个数

计算字符串中的元音个数&#xff1a; 将元音存储在一个字符串中。使用 dict 理解来迭代字符串。使用 str.count() 方法计算原始字符串中每个元音的出现次数。 vowels aeioumy_str www.jiyik.com# ✅ 计算字符串中每个元音出现的次数 vowels_count {vowel: my_str.lower().…

计算机专业研究生核心能力培养(4)——实验的流程及规范

0. 前言 今天我们讲一讲实验的流程和规范,主要包括以下7个部分: 目的清晰代码规范实验可拓展结果可比较结果可复现分析实验(常规)分析实验(有针对性)1. 目的清晰 当我们进行一个课题进行研究的时候,最重要的是要目的清晰,也就是说我们为什么要进行这个研究。做实验的…

使用cpolar建立固定的SSH隧道

一直以来&#xff0c;不同的操作系统都在相互竞争&#xff0c;而竞争的结果&#xff0c;就每种操作系统都占领了自己的一片天地。虽然现在的家用电脑大多使用Windows操作系统&#xff0c;但服务器领域大多使用占用资源更少的Linux系统&#xff0c;更不用说苹果电脑专属的iOS操作…

Cell:女性痴呆风险是男性的2倍,与基因相关,或是与生俱来的

医林研究院&#xff0c;让医学更简单 阿尔茨海默症&#xff08;AD&#xff09;&#xff0c;俗称老年痴呆症&#xff0c;是一个具有高经济和社会负担的全球健康问题。全球约有5000万痴呆症病例&#xff0c;每年新增约有1000万例&#xff0c;在中国&#xff0c;有上千万患者&…

Github每日精选(第52期):验证您的有风险的shell命令shellfirm

shellfirm shellfirm 是一个shell的拦截器&#xff0c;拦截任何有风险的shell命令&#xff08;默认或由您定义&#xff09;并提示您进行双重验证。 我如何从自己身上拯救自己&#xff1f; rm -rf *git reset --hard在按下回车键之前&#xff1f;kubectl delete ns停止&#…

【干货】10个高质量的java自学网站推荐

经常有人留言问我&#xff0c;“想学习Java编程&#xff0c;有没有学习资源推荐&#xff0c;有哪些网站可以关注”。好些同学是去网盘搜索&#xff0c;或者去某宝购买&#xff0c;搜集一堆资料&#xff0c;但是又不清楚哪些是重复的内容&#xff0c;哪些内容是不是版本已经过时…

【Bluetooth|蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;【 所有文章汇总】 1、 前言 前面几篇文章&#xff0c;主要讲解了蓝牙协议栈层面的内容&#xff0c;本篇来从源…

城区导航智能驾驶难在哪?写在小鹏/华为-极狐NOA释放之时

交流群 | 进“传感器群/滑板底盘群”请加微信号&#xff1a;xsh041388交流群 | 进“汽车基础软件群”请加微信号&#xff1a;ckc1087备注信息&#xff1a;群名称 真实姓名、公司、岗位【本文一万字左右&#xff0c;预计阅读时间约20分钟&#xff0c;文中有若干图片/GIF/视频&a…

猿创征文 | 国产数据库之PolarDB-X数据库详解安装和使用

文章目录1、PolarDB-X是什么&#xff1f;2、PolarDB-X架构3、PolarDB-X架构优势4、PolarDB-X核心特性5、PolarDB-X部署5.1、通过PXD部署集群5.2、通过 K8S 部署5.3、通过编译安装1、PolarDB-X是什么&#xff1f; PolarDB-X是由阿里巴巴自主研发的云原生分布式数据库&#xff0…

如何修复u盘?不如试试我这3个方法

u盘小小的一个便于我们携带&#xff0c;里面保存着我们很多数据。但是有时我们不小心清空了里面的数据&#xff0c;或者由于其他原因&#xff0c;导致u盘里的文件丢失&#xff0c;甚至出现打不开的局面。这时候该如何修复u盘&#xff1f;为了解答大家的疑惑&#xff0c;小编专门…

docker搭建主从架构和哨兵模式

下文介绍使用docker来创建redis的主从架构和哨兵模式 前提 linux已经下载并安装了docker 从仓库中pull redis的镜像 docker pull redis:latest确保主机中的镜像已经有了刚下载好的redis镜像 docker images架构图 一. docker创建redis的主从架构 1. 先创建一个master节点…

聚观早报 | 字节2021年亏损6041亿元;iPhone SE 4将采用刘海屏

今日要闻&#xff1a;字节2021年亏损6041亿元&#xff1b;iPhone SE 4或将采用刘海屏&#xff1b;京东众筹10月10日停止运营&#xff1b;特斯拉中国销量再创月度新高&#xff1b;大众将在中国成立软件合资企业字节2021年亏损6041亿元 10 月 10 日消息&#xff0c;字节跳动向员工…

FFmpeg基础:抽取视频文件中的音视频原始数据

文章目录视频流解码音频流解码原始的音视频数据数据量很大&#xff0c;为了方便传输和存储&#xff0c;我们会对原始数据进行压缩和编码。h264是常见的视频编码标准之一&#xff0c;AAC是常见的音频编码标准之一。这里介绍一下如何通过FFmpeg库将视频文件中的h264视频流解码成原…