当前位置: 首页 > news >正文

混合贪心算法求解地铁线路调度

一、问题描述

城市轨道交通的繁荣发展,带来了车辆资源需求的日益增加。如何兼顾运营服务水平和运营成本,以最少的车底优质地完成运输任务成为一大严峻问题。本题在后续的描述中将由多辆动车和拖车组合而成的车组称为车底。在日常的运营组织中,车底运用计划指导着所有的车底有序的完成运输任务,是运输计划中非常重要一项。较多的车底运用数可以从容的面对各种客流压力,深受乘客的欢迎却往往不能发挥车底的运输能力,导致运营成本骤升;而车底过少又极易引起车底超负荷运转,缩短设备寿命,面对大客流情况还有可能出现运营紊乱,乘客体验差。因此,车底运用计划对协调运营质量和运营成本意义重大。基于列车运行时刻表,结合列车车底数量、车辆段或停车场(以下统称为车场)的数量、车场的分布状况及容纳能力等,对每一车底在何时何地驶出车场、担当哪些车次以及返回车场作出合理的安排;同时,根据车底检修相关规程,对每一车底的检修时间、检修地点、检修级别等作出具体安排,保证安全、高效、有序的完成日常运营任务。

现在假设有一个地铁运营线,该线网由 20 座车站构成, 本线路全周转时间:120min30s;共有 35 组,停车场的存车能力为 25,车辆段的存车能力为 20;列车运行间隔:早高峰 3min(7点到9点),平峰 8min,晚高峰3min25s(17点到20点),其中,大交路 1-20,小交路1-15,早晚高峰的追踪间隔均指小交路的追踪间隔;列车通过 9 号车站进出车辆段,出入段时间为 2min40s;1,15,20 号车站具备折返能力,其最短折返时间分别为:6min、4min30s、4min30s;1号车
站连接停车场,停车场的出入时间 2min。
在这里插入图片描述
简而言之,要求就是使用最少的车底完成所有车次的牵引计划,同时每辆车的牵引时长要尽量均衡。

二、数据介绍

车次数据分位上行车次和下行车次,上行车次表示从编号较大的站到编号较小的站,下行车次从编号较小的站到编号较大的站,流入从1到20是下行车次,从20到1是上行车次。每天的上、下行车次数各为244。
上行车次
下行车次

三、算法求解

在这一小节中主要介绍两部分内容,第一部分内容是如何获得使用车底尽量少的车底牵引方案,第二部分是如何在保证车底数量不变的前提下,使得每个车底的牵引时间更加均衡。

3.1 车底数量求解

贪心算法
对于此类问题,一个直观的想法采用贪心的策略,对于每一个车底,都使得牵引尽量多的车次,直到所有的车次完成牵引,这个时候用到的车底数量就是贪心算法得到的最少车底数量,基本算法流程如下:

step1、初始化使用车底集合为C={},当前车底牵引车次集合D={},剩余车次集合P为上下行全量车次;
step2、按照时空接续关系生成所有可行车次集合,如果可行车次为空,转step4;
step3、随机选择可行接续车次作为车底即将牵引的车次d,D=D+d,P=P-d,转step2;
step4 、如果剩余车底集合P为空,转step6,否则转step5;
step5、更新使用车底集合C,新增车底,转step2;
step6、输出车底牵引计划;
step7、结束。

其中,step2中的时空接续关系是指车底前后牵引的两趟车次在时间和空间上都必须是能够衔接的,在空间上前车的终点站必须是后撤的起点站,在时间上前车的到达时间必须早于后车的出发时间,且时间间隔要满足特定要求。

贪心算法最终结果为使用车底数量41,由于step3中随机选择当前车底的可行车次,导致每个车底的牵引车辆数相对有限,考虑结合整数规划模型来获得当前车底的最优解决方案。

混合贪心算法
step1、初始化使用车底集合为C={},当前车底牵引车次集合D={},剩余车次集合P为上下行全量车次;
step2、计算剩余所有车次的前序车次数量和后续车次数量;
step3、按照车辆的前序车次数和后续车次数进行排序;
step4、将前序车次数和后续车次数量最少的车辆作为必选车次,建立整数规划模型,获取最优路径,最大化彻底服务车次数;
step5、将车底牵引计划添加到车底集合中,更新剩余车次,如果所有列车牵引完成,转step6,否则转step2;
step6、输出车底牵引计划;
step7、结束。

混合贪心算法最终使用的车底数量为36,相比于贪心算法,混合贪心算法主要在两个方面有所改进。一个是优先选择车前序和后续车次少的车次进行分配,这是由于到了算法后期,这样的车次往往一个车次就要完全占据一个车底。另外一个改进的点是采用整数规划,能够真正意义上获取每个车底当前的最优选择。
在这里插入图片描述
从上述甘特图中也可以明显看出贪心策略的一些特征,排序靠前的车底,由于有比较大的选择空间,牵引路径都比较长,牵引负载比较大,排序靠后的车底,由于选择空间急剧收缩,往往一个车底只能服务一两趟车次。

3.2 负载均衡调整

由于贪心策略产生的结果会出现负载极度不均衡的情况,考虑采用局部调整策略对产生的方案进行调整。调整的思路很简单,将负载比较高的车底服务的车次重新分配给负载比较低的车底即可,其对应的基本流程如下:
在这里插入图片描述
调整过后的结果如下,从图上可以看出来调整之后的结果变得更加均衡了。在这里插入图片描述

四、代码实现

4.1 贪心算法
def get_path(all_trains,from_trains,to_trains):used_trains=[]all_path=[]cnt=0max_length=22max_num=[randint(18,22) for i in range(1000)]while len(set(used_trains))!=len(all_trains):route_length=min(max_length,max_num[cnt])for i in range(route_length,0,-1):result=solver_route(all_trains,from_trains,to_trains,used_trains,i)if result:breakelse:max_length=i-1used_trains+=resultall_path.append(result)cnt+=1return all_path
4.2 整数规划
def solver_route(all_trains,from_trains,to_trains,used_trains,route_length):train_num=len(all_trains)# 创建模型model = gp.Model('train_scheduling')# 数据处理new_from_trains=deepcopy(from_trains)new_to_trains=deepcopy(to_trains)for train in all_trains:new_from_trains[train]=list(set(new_from_trains[train])-set(used_trains))new_to_trains[train]=list(set(new_to_trains[train])-set(used_trains))io_num={}for i in range(len(all_trains)):train=all_trains[i]io_num[i]=len(new_from_trains[train])+len(new_to_trains[train]) dff=pd.DataFrame(io_num.items(),columns=['key','value'])sort_trains=dff.sort_values(by=['value'],ascending=False)['key'].valuesfix_train=-1for train in sort_trains:if not train in used_trains:fix_train=trainbreak# 是否将站点i放置在位置jx = {}for i in range(train_num):for j in range(route_length):x[i,j] = model.addVar(vtype=GRB.BINARY, name=f'x_{i}_{j}')# 目标函数obj=0for i in range(train_num):for j in range(route_length):obj+=io_num[i]*x[i,j]model.setObjective(obj,GRB.MINIMIZE)# 每个位置最多有一个节点for j in range(route_length):expr=0for i in range(train_num):expr+=x[i,j]model.addConstr(expr==1)# 节点之间要有连关系for j in range(route_length-1):for i  in range(train_num):expr=0train=all_trains[i]for ii in from_trains[train]:expr+=x[ii,j]model.addConstr(expr>=x[i,j+1])# 遍历过的车次不再选择for i in used_trains:expr=0for j in range(route_length):expr+=x[i,j]model.addConstr(expr<=0)# fix train一定要满足expr=0for j in range(route_length):expr+=x[fix_train,j]model.addConstr(expr==1)# 求解model.setParam('OutputFlag', 0)model.setParam(GRB.Param.TimeLimit, 60)model.optimize()# 检查求解器状态status = model.Statusif status == GRB.INFEASIBLE:return []else:return get_result(x,train_num,route_length)
局部调整
paths=[]
for idx,row in result.iterrows():path=eval(row[0])paths.append(path)for i in range(len(paths)):path=paths[i]remove_trains=[]path_duration=get_path_duration(path)print(path_duration)for train in path:if path_duration<=avg:breakfor j in range(i+1,len(paths)):add_path=paths[j]add_path_duration=get_path_duration(add_path)if add_path_duration>avg:continueidx=get_insert_index(train,add_path)if idx>0:add_path.insert(idx,train)remove_trains.append(train)path_duration-=(train_info.end_time-train_info.start_time)breakfor train in remove_trains:paths[i].remove(train)

相关文章:

混合贪心算法求解地铁线路调度

一、问题描述 城市轨道交通的繁荣发展&#xff0c;带来了车辆资源需求的日益增加。如何兼顾运营服务水平和运营成本&#xff0c;以最少的车底优质地完成运输任务成为一大严峻问题。本题在后续的描述中将由多辆动车和拖车组合而成的车组称为车底。在日常的运营组织中&#xff0…...

vue项目:关闭页面,删除本地登录信息

vue项目&#xff1a;关闭页面&#xff0c;删除本地登录信息 代码 代码 import { removeToken } from /utils/auth //区分关闭和刷新页面&#xff0c;关闭时退出登录 window.onload ()>{if(!window.sessionStorage["tempFlag"]){removeToken();location.reload()…...

获奖案例回顾|基于卫星遥感和无人机的水稻全流程风险减量项目

引言 在现代农业保险领域&#xff0c;技术创新是推动行业进步的关键。珈和科技与太平财险的合作&#xff0c;旨在利用先进的卫星遥感和无人机技术&#xff0c;解决传统农业保险面临的诸多挑战&#xff0c;从而提升保险效率和服务质量。本次分享的项目案例获得了《金融电子化》…...

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合&#xff0c;您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…...

【Unity】制作简易计时器

一、创建计时器相关的变量 我们需要创建三个变量&#xff0c;分别是&#xff1a;计时时长、计时剩余时长、是否处于计时状态。 public float duration;//计时时长 public float remain; //计时剩余时长 public bool isCount; //是否处于计时状态 二、初始化变量 我们可以直…...

TDesign组件库日常应用的一些注意事项

【前言】Element&#xff08;饿了么开源组件库&#xff09;在国内使用的普及率和覆盖率高于TDesign-vue&#xff08;腾讯开源组件库&#xff09;&#xff0c;这也导致日常开发遇到组件使用上的疑惑时&#xff0c;网上几乎搜索不到其文章解决方案&#xff0c;只能深挖官方文档或…...

51单片机7(点亮第一个LED)

一、LED简介 1、LED&#xff0c;它是一个发光二极管&#xff0c;它具有单向导电性&#xff0c;那么通过5毫安的一个电流&#xff0c;就可以使它发光&#xff0c;那么电流越大&#xff0c;它的发光也就越强&#xff0c;但是电流不能过大&#xff0c;过大会把这个发光二极管给烧…...

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…...

CentOS 系统监控项

在维护和优化 CentOS 系统时&#xff0c;实时监控硬件和资源的使用情况非常重要。为了满足工作需要&#xff0c;可以定时采集 CentOS 系统相关的监控数据&#xff0c;并将其推送到 Prometheus 进行集中监控和管理。以下是日常采集项及对应的 shell 命令&#xff0c;并附上每项命…...

连锁直营店小程序赋能多店如何管理

如商超便利店卖货线下场景&#xff0c;也有不少品牌以同城多店和多地开店经营为主&#xff0c;获取店铺周围客户和散流&#xff0c;如今线上重要性凸显&#xff0c;品牌电商发展是经营的重要方式之一&#xff0c;也是完善同城和外地客户随时便捷消费的方式之一。 多个门店管理…...

决策树算法入门到精通:全面解析与案例实现

1. 介绍决策树算法 决策树的基本概念和原理 决策树是一种基于树形结构的分类和回归方法&#xff0c;通过对数据集进行递归地划分&#xff0c;每个内部节点表示一个属性上的判断&#xff0c;每个叶节点代表一种类别或者数值。 决策树在机器学习中的应用场景 分类问题&#xf…...

LangChain —— 多模态大模型的 prompt template

文章目录 一、如何直接将多模态数据传输给模型二、如何使用 mutimodal prompts 一、如何直接将多模态数据传输给模型 在这里&#xff0c;我们演示了如何将多模式输入直接传递给模型。对于其他的支持多模态输入的模型提供者&#xff0c;langchain 在类中提供了内在逻辑来转化为期…...

ssh升级

文章目录 ssh升级一、解包ssh、ssl二、更新安装ssl三、手动更新手动复制库文件四、创建符号链接五、更新库路径六、验证库文件七、设置库路径环境变量八、配置、编译、安装OpenSSH&#xff1a;意外&#xff1a;缺少 zlib 的开发库解决方法&#xff1a; 九、刷新ssh服务、查看ss…...

51单片机10(蜂鸣器介绍)

一、蜂鸣器介绍&#xff1a; 1、蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于电子产品中作为发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器。 &#xff08;1&#xff09;压电式蜂鸣器&#xff0c;它主要由多谐的一个增胀器…...

Python爬虫:基础爬虫架构及爬取证券之星全站行情数据!

爬虫成长之路&#xff08;一&#xff09;里我们介绍了如何爬取证券之星网站上所有A股数据&#xff0c;主要涉及网页获取和页面解析的知识。爬虫成长之路&#xff08;二&#xff09;里我们介绍了如何获取代理IP并验证&#xff0c;涉及了多线程编程和数据存储的知识。此次我们将在…...

T113-i 倒车低概率性无反应,没有进入倒车视频界面

背景 硬件:T113-i + emmc 软件:uboot2018 + linux5.4 + QT应用 分支:longan 问题 T113-i系统倒车时偶发无反应,没有进入倒车视频界面。 倒车无反应问题排查 先在倒车驱动的中断检测接口里添加打印,以确定倒车无反应时系统是否检测到中断状态,如下图所示。 static int ca…...

【AI大模型】李彦宏从“卷模型”到“卷应用”的深度解析:卷用户场景卷能给用户解决什么问题

文章目录 一、理解李彦宏的发言1.1 李彦宏的核心观点1.2 背景分析 二、技术发展&#xff1a;从辨别式到生成式2.1 辨别式AI技术2.2 生成式AI技术2.3 技术发展的挑战 三、“卷应用”&#xff1a;聚焦实际应用与价值3.1 应用为王3.2 技术落地的关键 四、“卷场景”&#xff1a;多…...

25秋招面试算法题 (Go版本)

文章目录 科大讯飞 0713找01不能出现太多其他 科大讯飞 0713 找01 牛牛拥有一个长度为 n 的01 串&#xff0c;现在他想知道&#xff0c;对于每个字符&#xff0c;在它前面的最近的不同字符的下标是多少&#xff1f; 输入描述 本题为多组测试数据&#xff0c;第一行输入一个…...

在Ubuntu 14.04上安装和保护phpMyAdmin的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 虽然许多用户需要像 MySQL 这样的数据库管理系统的功能&#xff0c;但他们可能不太习惯仅通过 MySQL 提示符与系统进行交互。 ph…...

突破与创新:Vue.js 创始人 尤雨溪 2024 年度技术前瞻

本文将深入探讨以下主题的 尤雨溪 见解&#xff1a;Vite 5对Vue的影响、宏、vapor模式、常见误解、新特性或功能、未来版本对Option API的支持、VitePress等。 . 2.尤大的问答环节 2.1. Vite 5如何提升Vue的性能&#xff1f; Vite在提高性能方面的工作通常是针对Vite本身的。然…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...