2017年五一杯数学建模A题公交车排班问题解题全过程文档及程序

news2024/11/25 22:46:40

2017年五一杯数学建模

A题 公交车排班问题

原题再现

  随着徐州市经济的快速发展,公交车系统对于人们的出行扮演着越来越重要的角色。在公交车资源有限的情况下,合理的编排公交车的行车计划成为公交公司亟待解决的问题。以下给出公交车排班问题中的部分名词说明和假设。
  (1) 班次:1 辆公交车从起点出发到达终点停止为 1 个班次。
  (2) 公交车公司有两种类型的班车:单班车和双班车。除非特殊说明,单班车和双班车都可以用于公交车排班。
  (3) 单班车:由同一个驾驶员驾驶的公交车。单班车通常要求在早高峰跑 2-3 个班次,晚高峰2-3 个班次,一天不超过 5 个班次。
  (4) 双班车:由两个驾驶员驾驶的公交车。双班车要求上、下午各一个司机,上午和下午司机的工作时间尽可能均匀,并且都不超过 8 小时。每辆双班车一天运行不超过 10 个班次。
  (5) 公交车运行的单程时间,已经包含乘客在各站(包括起点和终点)的上下车时间。
  (6) 假设每辆公交车可以运行 1 整天不需要加油。
  (7) 末班车的发车时间,可以在原有发车间隔的基础上调整 2 分钟(±2 分钟)。
  (8) 本题以简单的环路公交路线为例,即公交车从 A 点出发,经过一系列站点后再次回到 A点为 1 个班次。
  (9) 最短停站时间是指公交车完成 1 个班次之后,开始运行下一个班次之前,需要在终点停留的最短的时间。在问题 1-3 中,每辆公交车的最短停站时间为 0,即:公交车回到终点后不需要停留,可以继续进行下一班次的运行。
  问题 1. 徐州市 2 路公交车,从徐州火车站出发后经沿途站点后回到徐州火车站,2 路公交车行车信息如表 1。请建立数学模型,计算徐州市 2 路公交车,在早高峰时段(6:00-8:00)运行所需要使用的最少公交车数辆(需要给出含单班车和双班车各多少辆)。
  问题 2. 在问题 1 的基础上,请建立数学模型并设计相应的求解算法,给出徐州市 2 路公交车完成一整天的运行所需要最少的公交车的数辆(需要给出含单班车和双班车各多少辆),并按照表 2 的格式给出公交车排班计划表。
  问题 3. 在问题 2 的基础上,如果要求单班车不少于 3 辆,请建立数学模型并设计相应的求解算法,给出徐州市 2 路公交车完成一整天的运行所需要最少的公交车的数辆(需要给出含单班车和双班车各多少辆),并按照表 2 的格式给出公交车排班计划表。
  问题 4. 在公交车排班过程中,除以上要求之外,还需要考虑如下的实际因素的限制:
  (a) 单班车司机不安排吃饭,所有双班车司机都安排吃饭(早餐和晚餐),每餐饭需要 20 分钟用餐时间。早餐 8:00 开始供应,10:00 截止;晚餐 18:00 开始供应,20:00 截止。
  (b) 限定双班车辆的数辆为 19 辆。
  © 双班车辆运行 5 班次以后,上午、下午班司机进行换班,换班时间最少为 20 分钟(含最短停站时间)。
  请建立数学模型并设计相应的求解算法,并以表 3 给出的行车信息表为例,给出徐州市 2 路公交车行车信息调整后,完成一整天的运行所需要最少的公交车的数辆(需要给出含单班车和双班车各多少辆),并按照表 2 的格式给出公交车排班计划表。
在这里插入图片描述

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

  本文主要研究公交公司根据全天出行高峰的分布,各时间段单程时间和发车间隔时间不同的特点,制定出使得公交车在各时间段运行所需要使用的最少公交车数量的排班计划方案,本文构造单双班车综合发车计划矩阵并采用行列迭代加边求和的方法,既考虑发车时间具有波动性,又要尽量使上下午司机工作时间均衡,通过采用遗传算法对模型进行求解,有效增强了模型的传递性和适应性。
  问题一首先进行时间点单位统一为分钟,便于确定起点发车时间和返回终点时间。选取早高峰时间段最大发车时间间隔以达到运行所需要使用的公交车数量最少的目的。将单双班车视为同一 0-1 变量进行定量᧿述,建立发车时间点(行)与使用班车编号矩阵(列),使用标记为 1,反之为 0,矩阵的非零列向量个数即为所使用最少总公交车数。据此,本文通过发车计划矩阵的构建,建立相关的最少公交车数量模型。为了对该优化模型进行有效准确地求解,我们利用 MATLAB软件并采用算法进行遍历搜索求解,得到了最终的全局最优解,制定出使得徐州市 2 路公交车,在早高峰时段运行所需要使用的最少公交车数量的排班计划。
  问题二在问题一的基础上,制定出徐州市 2 路公交车完成一整天的运行所需要使用的最少公交车数量的排班计划,比问题一更加进一步的约束了双班车司机工作时间和极限运行班次数。已知各时间段长度,故各发车时间点即可确定,从而可计算出起终时间。为得到最少公交车总数,单双班车数和每辆车的总班次数,可通过建立全天各时间段发车时间点(行)与使用单班车编号矩阵(列)X,双班车编号矩阵(列)Y,综合得到所有班车编号矩阵(列)Z,进行求解,其非零列向量个数及各非零列向量元素之和即为待求变量。基于此模型求解得最优结果见附录表 1
  根据问题二中矩阵所得的单班车数量公式,综合考虑问题三中ᨀ到的单班车不少于 3 辆的约束即可得到满足问题三约束条件的最优解。基于此模型求解得最优结果见附录表 2
  问题四首先根据增加约束条件对问题二的模型进行改进,然后因为发车间隔的变动与最小停站时间,换班时间,双班车司机的用餐时间之间存在相互作用的关系,这些关系可能使我们要求得的最少公交车的数量发生在不同的发车间隔对应的发车时刻下的变动。为了求得在发车间隔波动的情况下的最小所需车辆数目,我们引入遗传算法,在不同的可行的发车时课表序列中进行交叉,变异,选择等操作从而得到最优的一个最少车辆数的发车时刻表序列,同时为了使算法收敛更快,我们再引入工作时间均匀度指标作为目标函数(适应度函数)的一个决定因素。基于此模型求解得最优结果见附录表 3

模型假设:

  1、假设单双班车为同一车辆类型;
  2、假设公交车按照排班计划表准时进站和出站;
  3、假设途中没有堵车和意外事故发生;
  4、假设环线为单环线,即只有一个运行方向的环线;
  5、假设每辆公交车可以运行 1 整天不需要加油;
  6、假设公交车运行单程时间已包含乘客在各站(包括起终点)的上下车时间;
  7、假设司机吃饭和换班的时间均包含最短停站时间;

问题分析:

  问题一的分析
  问题一要求根据徐州市 2 路公交车行车信息表 1,在从徐州火车站出发后经沿途站点后回到徐州火车站,即完成一次环线的情况下,制定出使得徐州市 2 路公交车,在早高峰时段运行所需要使用的最少公交车数量的排班计划。观察信息表可知,单程时间等因素的单位均为分钟,而早高峰时间段为 6:00-8:00,为便于确定起点发车时间和返回终点时间,将以小时为单位的时间段转化为以分钟为单位,即 06:00 为 0min,08:00 为 120 分钟。早高峰时间段发车时间间隔为4.0±1.0,为使运行所需要使用的公交车数量最少,选取最大发车时间间隔 5min,已知早高峰时间段共 120 分钟,故各发车时间点即可确定。单双班车除班制不同外车速、单程时间等运行条件均相同。因此确定最少公交车数量时,可将单双班车视为同一变量,建立发车时间点(行)与使用班车编号矩阵(列),使用标记为 1,反之为 0,矩阵的非零列向量个数即为所使用最少总公交车数。再依据单班车单班车通常要求在早高峰跑 2-3 个班次,一天不超过 5 个班次,的约束条件,最终确定单双班车使用方案。
  问题二的分析
  问题二要求在问题一的基础上,制定出徐州市 2 路公交车完成一整天的运行所需要使用的最少公交车数量的排班计划,比问题一更加进一步的约束了双班车的排班。对于双班车来说,要求上、下午各一个司机,上午和下午司机的工作时间尽可能均匀,并且都不超过 8 小时,每辆双班车一天运行不超过 10 个班次,由于司机工作时间均衡与司机所发车班次数有直接联系,发车班次数越多,工作时间越长,因此可将对司机工作时间尽可能均衡的要求转化为司机尽可能在各车辆每日所发班次数达到一半时进行换班,遇到不足一班次的情形进行取整运算。为得到排班计划表中起点发车时间和返回终点时间,首先将时间单位统一,得各时间段节点时间,为使运行所需要使用的公交车数量最少,选取各时间段最大发车时间间隔,又已知各时间段长度,故各发车时间点即可确定,从而可计算出起终时间。发车时间点数量为最少班次数,同时在假设不安排单班车的情况下也是最大双班车数。为得到最少公交车总数,单双班车数和每辆车的总班次数,可通过建立全天各时间段发车时间点(行)与使用单班车编号矩阵(列)X,双班车编号矩阵(列)Y,综合得到所有班车编号矩阵(列)Z,进行求解,其非零列向量个数及各非零列向量元素之和即为待求变量。
  问题三的分析
  问题三是在问题二的基础上,要求单班车不少于 3 辆,制定出徐州市 2 路公交车,完成一整天的运行所需要使用的最少公交车数量的排班计划,问题三相对于问题二的差异即为要求单班车不少于 3 辆。单班车是由同一个驾驶员驾驶的公交车。针对所有的单班车通常要求在早高峰跑 2-3 个班次,晚高峰 2-3个班次,每辆单班车一天不超过 5 个班次。早晚高峰时间段为均为 120 分钟,早高峰时间段单程时间为 80min,晚高峰时间段单程时间为 75min,也就是说,一辆单班车在早晚高峰期间均最多发车 2 次。根据问题二中矩阵所得的单班车数量公式,综合考虑问题三中ᨀ到的单班车不少于 3 辆的约束即可得到满足条件的最优解。
  问题四的分析
  该问题要求我们在考虑实际情况,即有最小的发车间隔,双班车数量限制为 19 辆和考虑双班车司机安排吃早晚饭以及换班的条件下求出最少的公交车数量。于是我们首先根据增加约束条件对问题二的模型进行改进,使得到的模型可以求解出在指定定发车时刻的情况下的最小所需车辆数目。然后,因为发车间隔的变动与最小停站时间,换班时间,双班车司机的用餐时间之间存在相互作用的关系,这些关系可能使我们要求得的最少公交车的数量发生在不同的发车间隔对应的发车时刻下的变动。为了求得在发车间隔波动的情况下的最小所需车辆数目,我们引入遗传算法,在不同的可行的发车时课表序列中进行交叉,变异,选择等操作从而得到最优的一个最少车辆数的发车时刻表序列,同时为了使算法收敛更快,我们再引入工作时间均匀度指标作为目标函数(适应度函数)的一个决定因素。

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

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

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

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

G=zeros(16,121);
b=1;s=0;c=0;
 for a=1:1:16
 G(a,b)=1;
 G(1:a-1,b)=0;
G(a+1:16,b)=0;
 G(a,1:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 end
 for a=1:1:16
 G(a,b)=1
 G(16:a-1,b)=0;
 G(a+1:16,b)=0;
 G(a,b:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 if b>25
 n=a;
 break
 
 end
 end
 for b=1:1:25
 for a=1:2
 s=s+G(a,b);
 end
 end
 if s>3
 for b=17:1:25
 for a=1:1:16
 if G(a,b)~=0
 G(a+2,b)=G(a,b);
 G(a,b)=0;
 break
 end
 end
 end
 end
 b=25;
 for a=11:1:16 
 G(a,b)=1;
 G(16:a-1,b)=0;
 G(a+1:16,b)=0;
 G(a,b:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 if b>30
 break
end
 end
 a=3;
 for n=0:1:3
 for b=31:1:87
 G(a,b+14*n)=1;
 a=a+1;
 if a>=17
 a=3;
 b=31;
 break
 end
 end
 end
 b=87;
for a=1:1:16
 G(a,b)=1;
 b=b+1;
end
k=0;
for b=79:1:98
 for a=1:2
 k=k+G(a,b);
 end
 end
 if k>3
 for b=87:1:103
 for a=1:1:16
 if G(a,b)~=0
 G(a+2,b)=G(a,b);
 G(a,b)=0;
 break
 end
 end
 end
 end
a=3
 for n=0:1:2
 for b=103:1:122
 G(a,b+14*n)=1;
 a=a+1;
 if a>=17
 a=3;
 b=31;
break
 end
 end
 end
 X=G(1:16,1:120);
G=zeros(16,121);
b=1;s=0;c=0;
 for a=1:1:16
 G(a,b)=1;
 G(1:a-1,b)=0;
 G(a+1:16,b)=0;
 G(a,1:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 end
 for a=1:1:16
 G(a,b)=1
 G(16:a-1,b)=0;
 G(a+1:16,b)=0;
 G(a,b:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 if b>25
 n=a;
 break
 
 end
 end
 for b=1:1:25
 for a=1:3
 s=s+G(a,b);
 end
 end
 if s>3
 for b=17:1:25
 for a=1:1:16
 if G(a,b)~=0
 G(a+3,b)=G(a,b);
 G(a,b)=0;
 break
 end
 end
 end
end
 b=25;
 for a=11:1:16 
 G(a,b)=1;
 G(16:a-1,b)=0;
 G(a+1:16,b)=0;
 G(a,b:b-1)=0;
 G(a,b+1:b+16)=0;
 b=b+1;
 if b>30
 break
 end
 end
 a=4;
 for n=0:1:3
 for b=31:1:87
 G(a,b+14*n)=1;
 a=a+1;
 if a>=17
 a=4;
 b=31;
 break
 end
 end
 end
 b=87;
for a=1:1:16
 G(a,b)=1;
 b=b+1;
end
k=0;
for b=79:1:98
 for a=1:3
 k=k+G(a,b);
 end
 end
 if k>3
 for b=87:1:103
 for a=1:1:16
 if G(a,b)~=0
 G(a+3,b)=G(a,b);
 G(a,b)=0;
 break
 end
end
 end
 end
a=3
 for n=0:1:2
 for b=103:1:122
 G(a,b+14*n)=1;
 a=a+1;
 if a>=17
 a=4;
 b=31;
 break
 end
 end
 end
 X=G(1:16,1:120);
(3)第四题:
初始种群生成函数:function [y] = creat( x )
a=[];t=0;
while t<=30
 r=randi([5 9],1,1);
 t=t+r;
 a(end+1)=t;
end
while t<=90
 r=randi([3,6],1,1);
 t=t+r;
 a(end+1)=t;
end
while t<=210
 r=randi([2,4],1,1);
 t=t+r;
 a(end+1)=t;
end
while t<=690
 r=randi([3,6],1,1);
 t=t+r;
 a(end+1)=t;
end
while t<=810
 r=randi([2,4],1,1);
 t=t+r;
 a(end+1)=t;
end
while t<=1065
 r=randi([5,8],1,1);
 t=t+r;
 a(end+1)=t;
end
y=a;
end
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

python环境搭建-yolo代码跑通-呕心沥血制作(告别报错no module named torch)

安装软件 安装过的可以查看有没有添加环境变量 好的! 我们发车! 如果你想方便快捷的跑通大型项目,那么必须安装以下两个软件: 1.pycharm2.anaconda对应作用: pycharm:专门用来跑通python项目的软件,相当于一个编辑器,可以debug调试,可以接受远程链接调试!anaconda:专…

OpenGL 自学总结

前言&#xff1a; 本人是工作后才接触到的OpenGL&#xff0c;大学找工作的时候其实比较着急&#xff0c;就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思&#xff0c;很担心自己往后能力跟不上年龄的增长。因此想在工作之余…

DL Homework 8

目录 习题5-2 证明宽卷积具有交换性&#xff0c; 即公式(5.13)&#xff0e; 习题5-4 对于一个输入为100 100 256的特征映射组&#xff0c; 使用3 3的卷积核&#xff0c; 输出为100 100 256的特征映射组的卷积层&#xff0c; 求其时间和空间复杂度&#xff0e; 如果引入一…

CentOS7部署FTP服务器

首先准备一台centos7虚拟机&#xff0c;作为服务器IP地址必须是固定的。 vim /etc/sysconfig/network-scripts/ifcfg-ens33配置内容如下&#xff1a; TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROU…

服务器下db(数据库)的执行

1、查看 select * from xxxx&#xff08;表名&#xff09; where xxx&#xff08;列表&#xff09;1 and.......正常写就行 2、插入 如果你想要在 SELECT INSERT INTO … SELECT 语句中将部分列保持不变,只改变一两列的值,可以在 语句中直接设置目标列的值,而其他列从源表中…

KubeVela核心控制器原理浅析

前言 在学习 KubeVela 的核心控制器之前&#xff0c;我们先简单了解一下 KubeVela 的相关知识。 KubeVela 本身是一个应用交付与管理控制平面&#xff0c;它架在 Kubernetes 集群、云平台等基础设施之上&#xff0c;通过开放应用模型来对组件、云服务、运维能力、交付工作流进…

王者荣耀,,,,,

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;…

Linux中vi常用命令-批量替换

在日常服务器日志查看中常用到的命令有grep、tail等&#xff0c;有时想查看详细日志&#xff0c;用到vi命令&#xff0c;记录下来&#xff0c;方便查看。 操作文件&#xff1a;test.properites 一、查看与编辑 查看命令&#xff1a;vi 文件名 编辑命令&#xff1a;按键 i&…

Go 语言 Printf 函数和格式化动词详解

Printf() 函数可以使用多种格式化动词对输出进行格式化。下面是可以与所有数据类型一起使用的一些通用格式化动词&#xff1a; 通用格式化动词&#xff1a; 以下动词适用于所有数据类型&#xff1a; 动词描述%v以默认格式打印值%#v以 Go 语法格式打印值%T打印值的类型%%打印百…

帮管客CRM 文件上传漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统&#xff0c;客户管理&#xff0c;从未如此简单&#xff0c;一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传…

(三) Windows 下 Sublime Text 3 配置Python环境和Anaconda代码提示

一&#xff1a;新建一个 Python3.7 编译环境。 1 Tools--Build System--New Build System... 修改前&#xff1a; 修改后&#xff1a; 内容&#xff1a; {"cmd":["C:\\Python\\Python37-32\\python.exe","-u","$file"],"file_r…

JAVA小游戏简易版王者荣耀

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;…

2023年初中生古诗文大会复选最后6天备考策略和更新的在线模拟题

今天是2023年11月26日&#xff0c;星期日&#xff0c;距离2023年第八届上海市中学生古诗文大会复选&#xff08;复赛&#xff09;还有六天&#xff08;2023年12月2日上午举办&#xff09;&#xff0c;相信各位晋级的小学霸们正在繁忙的学业之余抓紧备考。 为了帮助孩子们更有效…

GLP-1 , GLP-1R

-- 6VCB_GLP-1R G_protein, GLP-1 peptidea positive allosteric modulator

UE5人物残影学习(材质实现)

学习视频 UE4简单的材质球残影人教学&#xff0c;你学会了吗&#xff01;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rY411q7Yb/?spm_id_from333.788.top_right_bar_window_history.content.click 结果预览 1.创建残值&#xff0c;混合模式勾选半透明 “混合模…

【hacker送书第3期】OpenCV轻松入门:面向Python(第2版)

第3期图书推荐 内容简介作者简介图书目录专家推荐参与方式 内容简介 本书基于面向 Python 的 OpenCV(OpenCV for Python)&#xff0c;介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线&#xff0c;并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用…

基于51单片机的智能垃圾桶硬件设计

**单片机设计介绍&#xff0c; 基于51单片机的智能垃圾桶硬件设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能垃圾桶设计旨在通过传感器和控制电路实现智能化的垃圾桶功能。下面是一个简要的硬件设计介绍&…

如何在Ubuntu系统上安装Git

简单介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具CVS&#xff0c;Subversion 等不同&#xff0c;它采用了分布式版…

QT网络协议知识体系(一)

//获取主机的名称和ip地址 //获取主机的所有信息

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后&#xff0c;后端总是会遇到这个问题&#xff0c;设备通道在访问数据库时经常会报错&#xff0c;在搜集大量资料后我以为是配置问题&#xff0c;首先要保证&#xff1a; &#xff08;1&#xff09;首先确定jdbc.url地址是正确的 &#xff08;2&#xf…