2019年MathorCup数学建模B题环形穿梭车系统的设计与调度解题全过程文档及程序

news2024/11/17 23:59:39

2019年第九届MathorCup高校数学建模挑战赛

B题 环形穿梭车系统的设计与调度

原题再现:

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

整体求解过程概述(摘要)

  环形穿梭车系统为集多种高新技术于一体的自动搬运设备,行驶和输送速度快、灵活性好、自动化程度高。但由于系统采用封闭式轨道,不合理的系统参数设计及车辆调度会加剧轨道堵塞,降低运行效率。因此,本文对环形穿梭车系统的设计和调度进行深入研究,主要解决了如下若干问题:
  问题 1,根据给定环形穿梭车系统约定及任务,将穿梭车看成质点,建立以总完工任务为目标函数的模型,约束条件为不可超车,穿梭车只能执行一个搬运任务及各参数取值范围限制等。利用自适应遗传算法对模型进行求解,算法初始种群由规则调度生成,加快收敛速度。对穿梭车数量 N=3,6,9 的情况分别求解模型得到完工时间Ttask为 10880s、6943s 以及 5805s,并对三种情况进行对比分析。
  问题 2,基于问题 1 调度模型,考虑穿梭车长度,更改约束条件,穿梭车之间距离定义为从前车尾到后车头,安全距离lsafe=1.3m。对穿梭车数量 N=3,6,9 的情况分别求解模型得到完工时间Ttask分别为 11137s、7122s 以及 5843s,并对问题 1 与问题 2 六种情况作对比分析。
  问题 3,根据问题 1 和问题 2 求得总拥堵时间、最大货物吞吐量、复合作业次数以及有效搬运总距离比四个穿梭车系统运行效率评价指标。分别采用层次分析法和熵值法进行初步指标权重选取,然后建立最小二乘主客观一致赋权评价模型,引入拉格朗日函数进行模型进行求解,构造正、负理想方案,得到问题 1 与问题 2 六种情况的最终评价系数 F 分别为:0.5191、0.5475、0.6337、0.4514、0.5761 以及 0.6226;系数越大,系统运行效率越高。
  问题 4,从货物角度进行系统建模,引入排队理论,建立 M/M/n 排队模型。以轨道直线部分长度、弯道部分长度、穿梭车行驶速度和穿梭车数量作为系统待优化的参数,将系统服务强度,系统内所有穿梭车空闲概率、系统中平均等待队长和平均正在服务的穿梭车台数作为寻优目标函数;将模型转化多目标寻优问题,采用带约束的粒子群优化算法进行模型求解,得到参数优化结果,建议轨道直线部分长度为 113.5m,弯道部分长度为 7.1m,穿梭车速度为 1.2m/s,穿梭车数目为 6。

模型假设:

  1、假设穿梭车无起停加减速时间,为立起立停,即也无最小制动距离等;
  2、假设穿梭车位置检测时间、安全检测时间、通讯时间等常数定值时间可不计;
  3、假设穿梭车、道口在整个调度运行周期中不发生故障等意外停止运行情况,或此情况对调度优化过程不产生影响。

问题分析:

  1.不计穿梭车实际长度,建立一般化的调度 N 辆穿梭车完成各个进货口待处理货物的数学模型和相应求解算法,目标为总完工时间最小。并根据表 1 给定系统参数,求解N=3,6,9 时,完成附件 1 附件 2 给定的待处理货物所需时间。
  分析:该问题为车辆调度问题,需根据题目给定环形穿梭车系统描述,建立一般化调度模型,使系统在完成任务的基础上总完工时间最短。当不计穿梭车实际长度时,可将穿梭车看为质点。并将建立的调度模型用于实际应用,求解给定系统具体参数,穿梭车数量及任务时的总完工时间。
  2.考虑穿梭车实际长度,建立一般化的调度 N 辆穿梭车完成各个进货口待处理货物的数学模型和相应求解算法,目标为总完工时间最小。并根据表 1 给定系统参数,求解N=3,6,9 时,完成附件 1 附件 2 给定的待处理货物所需时间。
  分析:该问题大体思路与问题一类似,区别在于该问题不能将穿梭车看为质点,需考虑穿梭车本身长度对系统运行的影响。
  3.根据表 1,附件 1 及附件 2 数据,对环形穿梭车系统运行效率进行评价。
  分析:该问题为系统运行效率评价问题,先需找到系统评价指标,再对评价指标进行融合得到综合特征评价指标等,最后得到系统评价值。系统评价指标可从穿梭车拥堵时间,系统最大货物吞吐量等角度进行选取,评价指标融合方法有主观或客观多指标融合方法。
  4.对此环形穿梭车系统进行参数优化设计,并给出实际可行改进建议。
  分析:该问题为系统优化设计问题,首先需分析各参数对系统运行效率的影响,然后对参数值进行寻优,可用带约束的优化方法进行求解。最后根据求解值提出系统参数改进建议。

模型的建立与求解整体论文缩略图

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

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:(代码和文档not free)

The actual procedure is shown in the screenshot

基于遗传算法的穿梭车调度主函数

function [time]=GA()
N=3;num=10;%每次迭代一个口货物的数量,染色体携带的基因个数
popsize=20; %初始种群大小
Generationnmax=20; %最大代数
pcrossover=0.8; %交配概率
pmutation=0.1;%变异概率
fitness=zeros(1,popsize);%%产生初始种群,两个矩阵
A_2=xlsread('A.xlsx');A_2(:,1)=A_2(:,1)+A_2(:,2);A_2(:,2)=A_2(:,1)-A_2(:,2);
A_2(:,1)=A_2(:,1)-A_2(:,2);A_2_ini=A_2;
population=[ceil(4+3*rand(100,4,popsize)),ceil(N*rand(100,6,popsize))];
for i=1:popsize
 population(52:100,2,i)=0;
 population(72:100,3,i)=0;
 population(52:100,8,i)=0;
 population(72:100,9,i)=0;
end%%迭代的时候用到的 population 信息,ini 为所有信息,raise 随着迭代不断上升,
best 为最优种群
population_ini=population;population_raise=[];scnew=zeros(num,10,popsize);
smnew=zeros(num,10,popsize);handle_waitbar=waitbar(0,'Please wait...');%%每次迭代10个
货物
for s=1:10
 start=10*s-9;
 the_end=10*s;%%每次迭代取 ini 对应的 10 行,population_part 的值每次都在变
 population_part_s=population_ini(start:the_end,:,:);
 A_2_part=A_2_ini(1:the_end,:);Generation=0;
while Generation<Generationnmax
 Generation=Generation+1;%%算 raise 后的适应度 
for i=1:popsize 
 fitness(i)=simulation([population_raise;population_part_s(:,:,i)],A_2_part,N);
end%给适应度函数加上一个大小合理的数以便保证种群适应值为正数
fitness=fitness';
valuemax=max(fitness);
fitness=(valuemax-fitness);
fsum=sum(fitness);
Pperpopulation=fitness/fsum;
cumsump=cumsum(Pperpopulation);
cumsump=cumsump';%%只对 part 进行交叉等操作
for j=1:2:popsize %选择操作
 seln=selection(cumsump); %交叉操作
 scro=crossover(population_part_s,seln,pcrossover);
 scnew(:,:,j)=scro(:,:,1);scnew(:,:,j+1)=scro(:,:,2); 
 smnew(:,:,j)=mutation(scnew(:,:,j),pmutation,N);
 smnew(:,:,j+1)=mutation(scnew(:,:,j+1),pmutation,N);
end%产生了新的种群,part
population_part_s=smnew;
end%%计算 raise 后的适应度
for i=1:popsize
 fitness(i)=simulation([population_raise();population_part_s(:,:,i)],A_2_part,N);
end
 [~,index]=min(fitness); population_raise(start:the_end,:)=population_part_s(:,:,index);
 waitbar(s/20,handle_waitbar)
end
close(handle_waitbar);time=simulation(population_raise,A_2_ini,N);
xlswrite('task.xlsx',population_raise);
end

环形穿梭车调度过程

function 
[port_state,vehicle_state]=Fnc_update_state(task_assignment,task_information,port_state,veh
icle_state,vehicle_coordinate,in_coordinate,out_coordinate,N)
% vehicle_state 第一行代表 N 个运输车的状态,
%0 表示空闲%1 代表正在装货%2 代表正在运货%3 代表正在卸货
% 第二行代表货物来源于哪个进货口(编号 1-6),从开始装货到开始卸货此数值不为
0
% 第三行代表需要将货物送到哪个出货口(编号 1-7),从开始装货到开始卸货此数值
不为 0
% 第四行在运输车不处于 flag=13 时为 0,当 flag==13 时其数字代表装卸货剩余
的时间,本程序中由于取了 h=0.01
% 因为浮点数的判定条件问题所以取这个数字的范围为 0-100,每当进行一个 whlie 循
环 t 增加 0.1, 10s 对应 100 次循环
%%port_state 口的状态,列数为 6,6 个进货口
%%第一行代表每一个口下一个有待装箱的货物编号%%第二行代表这个货物由哪个运
输车负责%%第三行代表这个货物要送到哪个口
for i=1:N%%如果空闲则满足一定条件变成装货
 if(vehicle_state(1,i)==0) 
 %%检测第 i 个车是否到达对应进货口,如果已经到达进货口则进行装箱,
 %%并将小车状态改为正在装货,记录起始地和目的地,并将等待时间置 100.
 %%0.15=0.1*1.5,代表进货出货区间
 delta=vehicle_coordinate(i)-in_coordinate;%index 代表哪个进货口
 index=find((0<delta)&(delta<=0.15));%有空闲的运输车到达进货口
 if(~isempty(index))
 if port_state(2,index)==i
 vehicle_state(1,i)=1; vehicle_state(2,i)=index;
 vehicle_state(3,i)=port_state(3,index); vehicle_state(4,i)=100; 
 end
 end
%%如果在装货,则时间减一,如果减一后为 0,变为运货状态,此时进货口的状态进行
更新,
 %%货物信息进行移位
 elseif(vehicle_state(1,i)==1)
 vehicle_state(4,i)=vehicle_state(4,i)-1;
 if(vehicle_state(4,i)==0)
 vehicle_state(1,i)=2;index=vehicle_state(2,i); %%当有一个货物完成装货后,对应 port 货物编号+1,并更新对应 port 信息
 port_state(1,index)=port_state(1,index)+1;
 port_state(2,index)=task_assignment(port_state(1,index),index);
 port_state(3,index)=task_information(port_state(1,index),index);
 end
%%处于运货状态时,检测第 i 个车是否到达对应出货口,如果已经到达出货口进行卸货
%%小车状态改为卸货,并将时间置 1000
 elseif(vehicle_state(1,i)==2)
 delta=vehicle_coordinate(i)-out_coordinate;
 index=find((0<delta)&(delta<=0.15));
 if(~isempty(index))
 if vehicle_state(3,i)==index
 vehicle_state(1,i)=3; vehicle_state(4,i)=100; 
 end
end%%如果在卸货,则时间减一,如果减一后为 0,变为空闲状态,并清空该
车的进货口和出货口信息
 elseif(vehicle_state(1,i)==3)
 vehicle_state(4,i)=vehicle_state(4,i)-1;
 if(vehicle_state(4,i)==0)
 vehicle_state(1,i)=0; vehicle_state(2,i)=0; vehicle_state(3,i)=0; 
 end 
 end
end
end

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成为AI架构师的三大能力

AI架构师的定义 “AI 架构师”是以深度学习为代表的第三次AI热潮所催生的新型复合型人才&#xff0c;它的产生最本质的驱动因素是AI产业化落地应用的蓬勃发展对人才的需求&#xff0c;深度学习突出的工程属性也特别需要复合型人才来驾驭。 从字面来看&#xff0c;AI架构师的“…

Pytorch深度学习实战3-8:详解数据可视化组件TensorBoard安装与使用

目录1 什么是Tensorboard&#xff1f;2 Tensorboard安装3 Tensorboard可视化流程4 Tensorboard可视化实例4.1 常量可视化4.2 特征图可视化1 什么是Tensorboard&#xff1f; 在深度学习领域&#xff0c;网络内部如同黑箱&#xff0c;其中包含大量的连接参数&#xff0c;这给人工…

续航乱标销量低迷! 零跑汽车短时“掉”电快 ?

【锋巢网】 进入3月&#xff0c;行业复苏的景象映入眼帘&#xff0c;但是新能源车企却有人欢喜有人愁。 近日&#xff0c;各大新能源车企公布了自家2月份的销量数据&#xff0c;整体来看&#xff0c;部分新能源车企在2月份的交付量战绩显著&#xff0c;涨幅颇高。其中&#x…

class01:VUE简介与实例挂载

目录一、VUE简介1. 介绍2. 学习内容3. 引入Vue4. 全局配置5. Vue Devtools安装二、挂载Vue实例一、VUE简介 1. 介绍 Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不…

九、CSS3新特性三

文章目录一、逐帧动画二、flex弹性盒子三、少量元素侧轴对齐方式四、折行侧轴对齐方式五、项目属性六、网格布局七、网格布局的对齐方式八、网格布局的项目合并一、逐帧动画 一张背景图&#xff0c;改变back-position-x的位置让他动起来 step-start 逐帧动画 animation: play …

宝塔webhook自动化打包vue项目时,npm不生效问题

文章目录&#x1f4cb;前言&#x1f3af;查看webhook配置的代码&#x1f3af;测试代码&#xff0c;检查输出内容&#x1f3af;解决方法&#x1f4cb;前言 这篇文章主要是记录和解决在宝塔面板中&#xff0c;webhook自动化打包vue项目时&#xff0c;npm不生效问题。说来奇怪&am…

【DBC专题】-10-CAN DBC转换C语言代码Demo_接收Rx报文篇

案例背景(共15页精讲)&#xff1a; 该篇博文将告诉您&#xff0c;CAN DBC转换C语言代码Demo&#xff0c;只需传递对应CAN信号关联参数&#xff0c;无需每个信号"左移"和"右移"&#xff0c;并举例介绍&#xff1a;在CANoe/Canalyzer中CAPL中的应用&#xff…

【MIT 6.S081】Lab1: Xv6 and Unix utilities

Util概述sleeppingpongprimesfindxargs本Lab包括五个应用程序的实现&#xff0c;初步熟悉系统调用接口。用时约8h&#xff08;我太菜辣&#xff09;本Lab包括五个简单程序的实现&#xff0c;初步熟悉系统调用接口。 笔者用时约6h&#xff08;我太菜辣&#xff09; 概述 根据文…

mysql数据库之全局锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#x…

【Day2】Numpy简单入门基础

NumPy 简单入门基础 我的另一篇文章 &#xff1a; Numpy介绍-深度学习&#xff1a;Numpy介绍-深度学习&#xff08;Numpy介绍深度学习使用看这些足够了&#xff09; import numpy as npmy_array np.array([1, 2, 3, 4, 5]) print(my_array)[1 2 3 4 5]print(my_array.shape)…

Kafka 多线程消费者

Kafka 多线程消费者多线程方案Kafka 0.10.1.0 后&#xff0c;Kafka Consumer 变为双线程的设计 : 用户主线程 : 启动 Consumer 的 main心跳线程 (Heartbeat Thread) : 定期对 Broker 发送心跳请求&#xff0c;探测消费者的存活性 (liveness&#xff09;将心跳频率与主线程处理…

MQTT协议-取消订阅和取消订阅确认

MQTT协议-取消订阅和取消订阅确认 客户端向服务器取消订阅 取消订阅的前提是客户端已经通过CONNECT报文连接上服务器&#xff0c;并且订阅了一个主题 UNSUBSCRIBE—取消订阅 取消订阅的报文同样是由固定报头可变报头有效载荷组成 固定报头由两个字节组成&#xff0c;第一个…

2023年,当我们谈论架构时,我们要聊什么

架构是一个非常宽泛的话题&#xff0c;从组织结构上来说&#xff0c;涉及到前端、后端、运维&#xff1b;从软件设计上来说&#xff0c;涉及到需求分析、设计、编码、测试&#xff1b;从物理结构上来说&#xff0c;涉及到CDN、负载均衡、网关、服务器、数据库。当前一些架构方面…

奇淫技巧:阅读源码时基于一组快捷键,让我们知道身在何方!

一个十分蛋疼的问题 在我们阅读框架底层源码的时候&#xff0c;我们往往会一个方法一个方法的往下翻&#xff0c;翻了很久很快就会有这样的灵魂拷问&#xff1a;我从那个类&#xff08;方法&#xff09;来&#xff0c;我要到哪个&#xff08;类&#xff09;方法中去。这个时候…

RK3568平台开发系列讲解(显示篇) DRM显示系统组成分析

🚀返回专栏总目录 文章目录 一、DRM Framebuffer二、CRTC三、Planes四、Encoder五、Connector沉淀、分享、成长,让自己和他人都能有所收获!😄 📢让我们分析一下绿框中的五个部件,以及他们的联动。 一、DRM Framebuffer 与 framebuffer一样,是一片存放图像的内存区域,…

敏捷开发还需要PRD吗

一、PRD有什么用 prd提升与RD或者未来接手人的沟通效率 二、为什么会有PRD 首先来说说为什么会有PRD文档。 1、稍微大一点的团队产品经理未必能向每个人传达产品需求&#xff0c;这就需要有一个文档的形式来向项目的所有成员来传达需求&#xff0c;这就是文档的来源。 2、由…

Python读写mdb文件的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

MySQL的分库分表?通俗易懂

1- 为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而来&#xff0c;比如电商系统来说双十一大促对订单数据压力很大&#xff0c;Tps十几万并发量&#xff0c;如果传统的架构&#xff08;一主多从&#xff09;&a…

【数据结构】解决顺序表题的基本方法

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;> 初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0…

java 4 (面向对象上)

java——面向对象&#xff08;上&#xff09; 目录java——面向对象&#xff08;上&#xff09;面向对象的思想概述类的成员&#xff08;1-2&#xff09;&#xff1a;属性和方法对象的内存解析类中属性的使用类中方法的使用1.举例&#xff1a;2.声明方法&#xff1a;3.说明4.re…