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

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名片即可

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

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

相关文章

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏&#xff1a;时间复杂度和空间复杂度 算法效率分为时间效率和空间效率&#xff0c;时间效率称为时间复杂度&#xff0c;空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数&#xff0c;它描述了算法的运行时间&#xff0c;一个算法执…

什么是客户自助服务?综合指南献上~

《哈佛商业评论》曾报道过&#xff0c;81%的消费者在找客服之前会自己先去找办法解决。 如今&#xff0c;客户希望得到更快的响应。他们不想排队去等信息。他们想要的只是一个更快、更可靠的自助服务解决方案。作为企业&#xff0c;应该注意到他们的期望。企业需要做的就是通过…

2017年五一杯数学建模C题宜居城市问题值解题全过程文档及程序

2017年五一杯数学建模 C题 宜居城市问题 原题再现 城市宜居性是当前城市科学研究领域的热点议题之一&#xff0c;也是政府和城市居民密切关注的焦点。建设宜居城市已成为现阶段我国城市发展的重要目标,对提升城市居民生活质量、完善城市功能和提高城市运行效率具有重要意义。…

2009年iMac装64位windows7及win10

2009年iMac装64位windows7及win10 Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项 安装完Mac OS系统后&#xff0c;要制作Windows7安装U盘时才发现&#xff0c;Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项&#xff0c;搜索到文章&#xff1a;修改Boo…

C语言——深入理解指针(2)

目录 1. 数组名 2. 指针访问数组 3. 一维数组的传参&#xff08;本质&#xff09; 4. 冒泡排序 5. 二级指针 6. 指针数组&#xff08;指针的数组&#xff09; 7. 指针数组模拟二维数组 1. 数组名 在之前的代码中我们使用指针访问过数组的内容。 int arr[10] {1,2,3,4…

xxljob学习笔记01(小滴课堂)

分布式调度xxl-job源码部署和数据库建立&#xff1a; 在idea中打开安装包&#xff1a; 创建数据库&#xff1a; 建表&#xff1a; 在项目里&#xff1a; 在navicat里运行语句即可&#xff1a; 修改数据库地址和用户名&#xff0c;密码&#xff1a; 配置令牌&#xff0c;不然谁…

Linux环境下自动化创建大量的账号

参考《鸟哥的Linux私房菜基础篇第四版》13.7.2节微调而成&#xff1a; 下面脚本的目的是为服务器的管理员自动化创建大量的账号&#xff0c;节省生命。 #!/bin/bash # This shell script will create amount of Linux login accounts for you. # 1. check the "accounta…

探索计算机视觉:深度学习与图像识别的融合

探索计算机视觉&#xff1a;深度学习与图像识别的融合 摘 要&#xff1a; 本文将探讨计算机视觉领域中的深度学习技术&#xff0c;并重点关注图像识别方面的应用。我们将介绍卷积神经网络&#xff08;CNN&#xff09;的原理、常用的图像数据集以及图像识别的实际应用场景&…

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

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

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习&#xff0c;给大家分享一下关于进程的一些基础知识。了解这部分内容&#xff0c;只是为后续多线程编程打好基础&#xff0c;因此进程部分的知识&#xff0c;不需要了解更加细节的内容。 清风的CSDN博客 &#x1f61b;&#x1f61b;&a…

Android之高级UI

系统ViewGroup原理解析 常见的布局容器: FrameLayout, LinearLayout,RelativeLayoout,GridLayout 后起之秀&#xff1a;ConstraintLayout,CoordinateLayout Linearlayout Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mOrientation …

OpenGL 自学总结

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

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…

Linux系统的文件权限

Linux系统权限的相关概念与理解 (xshell下进行演示) 文章目录&#xff1a; 1:linux系统下两种用户 超级用户(root)与普通用户(非root)的理解root与非root用户之间切换的指令非root用户之间进行切换的指令操作 2:linux文件权限管理 文件访问者的介绍文件的类型与文件的访问权…

openpnp - 自动换刀设置 - 使用克隆功能降低风险

文章目录 openpnp - 自动换刀设置 - 使用克隆功能降低风险概述笔记需要注意的地方将一个做好的吸嘴作为这排其他吸嘴的模板END openpnp - 自动换刀设置 - 使用克隆功能降低风险 概述 自动换刀设置时, 很危险, 动不动就撞刀. 如履薄冰啊:( 看到openpnp在自动换刀时, 有个克隆功…

【Vue】记事本

上一篇&#xff1a;Vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5501 本篇所需指令&#xff1a; v- for v-model v-on v-show 目录 删除功能 添加功能 统计功能 清空功能 v-show 删除功能 <!DOCTYPE html> …

系列十九、Spring实例化bean的方式

一、概述 所谓实例化bean&#xff0c;大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种&#xff0c;即&#xff1a; ① 构造器方式&#xff1b; ② 静态工厂方式&#xff1b; ③ 实例工厂方式&#xff1b;…

SQL JOIN 子句:合并多个表中相关行的完整指南

SQL JOIN JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。 让我们看一下“Orders”表的一部分选择&#xff1a; OrderIDCustomerIDOrderDate1030821996-09-1810309371996-09-1910310771996-09-20 然后&#xff0c;看一下“Customers”表的一部分选择&#xff…

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

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

cuda magma 构建 使用cmake构建的步骤记录

这不是群论代数软件&#xff0c;而是cuda 矩阵计算软件 1. 生成其他精度的源代码 1.1 复制编辑 make.inc cp make.inc-examples/make.inc.openblas ./make.inc 并修改其中的定义&#xff1a; OPENBLASDIR ? /opt/OpenBLAS 这需要实现安装openblas到此处。文件夹解构&…