李玉洁 高元 薛景嵘
摘 要:针对机车周转图的计算机编制,利用C#编程语言和Access数据库进行机车周转图的编制和查询系统的设计。主要介绍绘图和查询,有列车运行图底图的绘制、列车运行线的绘制、机车周转图的绘制以及对数据库的查询。文中利用坐标转换、时空转化、双缓冲绘制图像和缩放功能等具体措施解决了坐标不统一、时空不一致、图像闪烁和缩放不灵活等问题。
关键词:机车周转图;程序;数据库
中图分类号:U292 文献标识码:A 文章编号:2096-4706(2019)22-0018-05
Abstract:For the computer programming of the locomotive working diagram,the C# programming language and Access database are used to design the locomotive working diagram and query system. It mainly introduces drawing and querying,drawing of train operation base map,drawing of train running line,drawing of locomotive working diagram and querying of database. The paper uses coordinate transformation,space-time transformation,drawing images with double buffering and zoom function to solve the problems of inconsistent coordinates,inconsistency in time and space,image flicker and inflexible zoom.
Keywords:locomotive turnover map;program;database
0 引 言
機车周转图是在一定的机车交路、机车运转方式和乘务制度条件下,以列车计划运行图为基础编制的机车运用计划,是利用坐标原理表示机车运行的图解形式。机车周转图是确定机车使用方式的核心,在目前许多机务段撤并的情况下,机车交路变得越来越长,每台机车的每个交路都要行驶很长的距离,机车的使用情况变得越来越复杂,传统的机车周转图的人工勾画和调整方法已经很难适应当前这个形式多变、自动化和信息化的社会的需求。闫海峰[1]等指出现有的计算机编制机车周转图的算法有两种:一种是将寻求机车最优周转方案问题转化为运筹学中的指派问题,用传统算法求解;另一种是建立网络模型,将问题转化为最小费用最大流问题。冯伍等人[2]提出了编制成对和不成对机车周转图的一种简便算法,即重要性原则方法。易光宇等人[3]对人工编制机车周转图的原则及过程作了概述,并在此基础上,对计算机编制机车周转图的方法进行探讨。陈小明等人[4]指出机车周转图微机系统具有的特点有:采用编程语言与绘图工具结合设计,有较强的人机对话功能。赵伟[5]提出了对机务布局进行调整、适当延长机车交路、尽量缩短机车全周转时间、提高机车牵引能力、提高铁路技术速度、对机车运用方式加以改进等几个提高机车运用效率的途径。王瑶[6]提出了将机车周转图编制问题转化为多旅行商问题的研究思路。刘永华[7]提出了机车周转图编制优化的数学模型。陈广秀[8]研究了机车周转图自动编制的模型和算法,并利用启发式算法实现了半循环机车交路的自动编制。
1 系统介绍
1.1 设计需求
在列车运行图的编制过程中,编图人员需要根据不同的修改意见不断地修改列车运行图方案,修改列车运行图方案的过程是一个不断反复的过程。因此,列车运行图编图人员需要一个编制机车周转图的辅助决策支持系统,一个能够根据某项指标的要求,按照最优算法,很快地依据已经完成的列车运行图方案编制机车周转图的系统,此系统编制的机车周转图应该能够接近实际,能够大致反应该列车运行方案对应的机车周转图,此系统编制的机车周转图只为列车运行图编图人员提供参考,而不是代替机务人员编制实际使用的机车周转图。并且,此系统可以根据一定的条件对机车周转图进行查询显示。
1.2 系统功能
根据以上设计需求的分析,机车周转图编制和查询系统应该有如下功能:
第一,根据从数据库筛选的数据,自动地以图形的形式显示出来,即将有关数据转换成机车周转图,在屏幕上显示出来。
第二,用户可输入机车号查询某一台机车的机车交路,将其显示在屏幕上。
第三,该系统提供查询功能,可以查询列车运行时刻和机车任务,并能根据列车时刻表和机车任务表查看该列车的交路。
2 数据库表结构设计
通过实体E-R图属性的分析,就可以实现对数据库表结构的设计,其内容包括确定数据库对象的名称、表中属性、表之间的关系、表中数据大小等。本文的数据库中包含有用户表、列车运行时刻表、机车任务表和机车信息表。表1—表4为各表的表结构。
3 系统设计
3.1 数据输入
列车运行时刻表中的数据在铁路售票系统中查得。机车任务表中的数据是根据列车到发时刻和机车在车站的整备时间等信息,通过LINGO软件优化得到的。并将列车运行时刻表和机车任务表中的数据以txt文本的形式导入Access数据库中。机车信息表中的数据是通过对机车信息的查询手动输入数据库的。
3.2 界面设计
該系统有登录界面和主界面构成,登录界面通过用户名和密码的权限保证了系统的安全性。主界面是在from窗体上放置一个SplitContainer容器,在该容器内放置用来点击以实现各功能的按钮和用来绘图的PictrueBox控件。为了实现数据库中数据的查询,在主界面上放置两个DataGridView控件。
3.2.1 系统模块划分
系统分为三大模块:登录模块、绘图模块和查询模块,绘图模块又分为底图绘制、列车运行线绘制和机车交路绘制三部分,查询模块分为列车运行时刻表查看、机车任务表查看和机车交路查看三部分。模块结构如图1所示。
3.2.2 绘图系统
绘图系统分为底图绘制,列车运行线绘制和机车交路绘制。在底图的绘制过程中,首先需要确定新的坐标原点。定义原坐标原点为(X0,Y0),由于是在pictureBox控件上绘
该系统设计选取兰州至天水段为牵引区段,根据列车运行图的绘制习惯,以及兰州至天水的上下行关系,上方横线代表天水车站的车站中心线,下方横线代表兰州车站的车站中心线。在该设计中选择1天,即24小时为一个单元,采用十分格绘制底图。底图绘制用到了GDI+绘图工具中的DrawLine函数和DrawString函数。在绘制过程中起初在Timer控件的Tick事件中进行,出现了图片闪烁问题,为了解决此问题,在绘制过程中运用了图片的双缓冲技术,在pictureBox的paint事件下绘制。实现双缓冲的步骤及代码如下:
Step1 在内存中建立一块“虚拟画布”:
image= new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height);
Step2 获取这块内存画布的Graphics引用:
Graphics g = Graphics.FromImage(image);
Step3 在这块内存画布上绘图:
g.DrawLine(gpen, x2, y0 + 50, x2, y1 - y0 - 50);
Step4 将内存画布画到窗口中:
e.Graphics.DrawImage(image, 0, 0);
双缓冲实现了底图的平稳绘制,解决了闪烁问题。
3.2.2.1 列车运行线绘制
以列车运行时刻表中的数据为基础绘制列车运行线,其关键在于表中时间与图中距离的时空转换。将底图中的24小时转化为86400秒,以此将列车运行时刻表中的出发时刻和到达时刻也转化为秒。定义X1为底图的宽,pw为pictureBox的宽度,t为每秒在图中代表的距离,a为列车运行时刻表中出发时刻或到达时刻转化后的秒数,转换公式如下:
根据底图绘制过程中确定的坐标原点(X2,Y2),列车出发时刻或到达时刻在图中的横坐标为X2+s。由于底图中的24小时是从今日18点到次日18点,绘图过程中存在周期问题,例如,根据列车运行时间,在次日14点以后从兰州站发出的列车会在次日18点以后到达天水站,而次日18点以后的运行线在图中无法显示,就要将运行线绘制在今日18点以后的对应时刻,解决此问题的方法如下:以今日18点为起点,将列车运行时刻表中的到发时刻转换为秒,次日18点以后的在18点的基础上换算出秒数,秒数小于86400的部分在次日18点以前绘制列车运行线,秒数大于86400的部分在今日18点以后绘制列车运行线。绘制列车运行线以及标注车次的核心代码如下:
3.2.2.2 机车周转图绘制
以数据库中机车任务表和列车运行时刻表中的数据为基础绘制机车周转图,绘制过程用到了GDI+绘图工具中的DrawLines函数,通过DrawLines函数将同一机车所牵引的所有列车的出发时刻和到达时刻按顺序绘制出来,就形成连续的机车交路。根据列车的到发时刻,同一台机车的周转有如下几种可能的形式:
(1)上行列车和下行列车都在0点以后出发18点以前到达:
1)上行列车出发在下行列车出发之前。
2)上行列车出发在下行列车出发之后。
(2)上行列车在0点以后出发18点以前到达,下行列车在0点以后出发18点以后到达,并且上行列车的到达在下行列车的出发之前。
(3)上行列车在0点以后出发18点以前到达,下行列车在18点以后出发,次日0点以前到达。
(4)上行列车在0点以后出发18点以前到达,下行列车为前一天18点以后出发,当日0点以后到达的列车,并且下行列车在上行列车出发前到达。
(5)下行列车在前一天18点以后出发,当日0点以后到达,上行列车在0点以后出发,18点以后到达。
(6)下行列车0点以后出发,18点以前到达,上行列车在0点以后出发,18点以后到达。
(7)上行列车在前一天的18点以后出发,当日0点之前到达,下行列车在当日0点以后出发,18点以前到达。
(8)上行列车在前一天的18点以后出发,当日0点之后到达,下行列车在当日0点以后出发,18点以后到达。
在本系统中只能绘制一天内的周转情况,因此只考虑一台机车一天能够完成一对列车牵引任务的情况。
绘制机车周转图以及机车编号和列车车次标注的核心代码如下:
g.DrawLines(rpen, points);
g.DrawString(s1, MyFont1, drawBrush, x2 + t * c0 + 10, y1 - y0 - 85, format);
g.DrawString(s2, MyFont1, drawBrush, x2 + t * a1 + 30, y0 + 85, format);
g.DrawString("1", MyFont1, drawBrush, x2 + 20, y1 - y0 - 30);
g.DrawString("1", MyFont1, drawBrush, x2 + t * d0 + 20, y2 - 25);
g.DrawString("1", MyFont1, drawBrush, x2 + t * d1 + 20, y1 - y0 - 30);
所有機车的机车周转图如图3所示。
3.2.3 查询系统
查询系统包括列车运行时刻表查询、机车任务表查询和以机车号查看机车交路。列车运行时刻表的查询需要将数据库中的列车运行时刻表显示屏幕上,并在点击某一列车车次时会显示与这一列车相关的机车交路,机车任务表的查询和列车运行时刻表的查询相同,以机车号查看机车交路是指在输入框中输入机车号,将会在屏幕上显示对应的机车交路,如图4所示。
4 结 论
本次设计的主要特点是系统可在已知列车运行时刻和机车牵引任务的条件下自动勾画机车交路,实现机车周转图的自动编制。用户可查看机车周转图、对列车运行时刻和机车牵引任务进行查询,并在列车运行时刻表和机车任务表中点击某一车次,可查看这一车次的机车交路,也可以通过输入机车号查看某一台机车的周转情况。
参考文献:
[1] 闫海峰,崔燚.编制机车周转图的优化模型 [J].中国铁道科学,2006(4):123-128.
[2] 冯伍,李宗平.编制铁路机车周转图的一种简便算法 [J].铁道运输与经济,2005(9):85-87.
[3] 易光宇,沈路.计算机编制机车周转图的实现方法 [J].长沙铁道学院学报(社会科学版),2002(2):92-94.
[4] 陈小明,王小平.计算机编制机车周转图的应用 [J].铁道运营技术,1999(2):65-67.
[5] 赵伟.机车周转问题的研究 [D].兰州:兰州交通大学,2016.
[6] 王瑶.铁路机车周转图编制模型与算法研究 [J].铁道运输与经济,2008(9):84-87.
[7] 刘永华.机车周转图编制优化和系统设计探析 [J].科技与创新,2015(4):92-93.
[8] 陈广秀.计算机编制机车周转图系统优化设计 [D].成都:西南交通大学,2007.
作者简介:李玉洁(1993-),女,汉族,甘肃会宁人,硕士生,主要研究方向:铁路车流组织优化。