基于Python 的火车购票软件设计
2020-08-11鞠耀辉陈伟利张佳琦张晶亮何振豪
鞠耀辉 陈伟利 张佳琦 张晶亮 何振豪
(吉林建筑大学,吉林 长春130118)
1 研制背景及意义
近些年来,中国的铁路正在高速的发展。交通越来越便利,节假日选择出行的人数正在不断增多,全国各大景点节假日人流量都特别大,有来自全国各地的游客游访。铁路出行以其快速、准时、经济、舒适的几大优势,吸引了更多人去选择。与此同时,相应的购票问题就出现了,尤其在春运、法定节假日、寒(暑)假学生潮和景点的旅游旺季等,往往是一票难求,出行困难。网络购票的兴起,让各种抢票攻略出现,各种抢票软件应运而生,甚至还收取一定费用。由于票源始终有限,又受到官方系统的限制,即使购票人肯额外花钱,选择抢票加速包,但能否抢到,有运气的成分,可能仍然没有足够票可买。有的软件在为我们购票的同时,默认选择抢票加速包,既没有帮助购票者出行更加便利,还增加了出行费用,加大了上述种种问题需要利用科技创新来得到更好地解决。
2 设计方案
2.1 方案构想
本作品的研究思路是基于了解目前所能搜索到的各种火车购票网站,并充分考虑了现今购票时的不足,以及对于对于节假日等时间乘客买不到票问题的调研,结合Python 技术的基础,自主设计了一种新的解决方案。在解决乘客买不到票的同时,尽量减少时间、行程,并加强对于零散资源的利用的目的。
2.2 整体设计及运行方案
在该软件运行之前,先导入火车运行车次、起点、中间站点、终点及时间信息构成链状数据结构。然后建立标记起点,可任意转换线路的中间点,终点。之后建立分段的车票价格、运行时间,这个时间包括了出发时间及到达时间。再建立优选方案,在乘客进行购票时,自动优选直达票,其次是同车换乘,最后才会选择中转车站,并且车站尽量选择同一站或相近的车站。之后建立硬件服务器,在服务器上运行Python 算法程序以达到接收手机APP 和WEB 信息的目的。通过算法的计算,导出最优的乘车方案,提供给用户。
在完成手机APP 的编写及运行测试后,提供给用户免费使用。用户可以直接使用此软件,也可以在遇到购票上的困难时使用该软件。用户进行购票时,对用户输入的起点、终点及具体车次进行数据采集,通过计算好的优选方案优先向用户推荐直达票,直达无票的情况下,直接使用同车换乘的方案,即在用户不需要换座换车的同时达到中转的目的。一站如果达不到目的那就增加到两站、三站。在这种方案进行不下去或者耗费费用时间行程等太高时,进行下一个方案。根据席位的差别进行席位交叉换乘,即购买同车另一个或另一种席位的中转票,只需切换席位就能达到中转的目的。如果席位切换也不行时,若是购票者愿意多购买一站,还可以在分段的行程中,有一两个站点的重叠,也就是说在其中的两站之间,购票者同时买了两张票,但也能够达到同车换乘的目的。叠加换乘也不行,那就通过购买少数站站票的方式实现购票。即购买某两个无剩余票站点之间的站票,使得用户前一段行程有座位,中间站一会,后一段行程也有座位。但要保证站票的时间不能太长。同车换乘是最优的方案,避免了换车的时间损失,同时有效利用车票的零散资源。此上的这些方案为层层递进的关系,在上一个方案无法进行下去时,才会进入到下一种方案的计算。这些数据是实时采集的,即可通过不同时间,多次计算获取购票方案。
2.3 算法
关于算法部分,要求计算建立标记起点、中间站点、终点数据信息。
某线路(如图1 所示),起点为a0,终点为an在起点到终点之间有a1,a2等站点,现在就需要建立一个车票信息数据库,具体如下:
2.3.1 使用Python 爬虫技术,将a0→a1、a0→a2、a0→a3……a0→an-1、a0→an并标记为:b01、b02、b03……b0n-1、b0n,数据包括:有票、具体张数、无票3 种,及相应的席位信息等;
2.3.2 同理建立a1→a2、a1→a3……a1→an-1、a1→an并标记为:b12、b13、b14……b1n-1、b1n,数据包括:有票、具体张数、无票3 种,及相应的席位信息等;
2.3.3 最后建立an-1→an并标记为:bn-1n,数据包括:有票、具体张数、无票3 种,及相应的席位信息等;
2.3.4 数据共有:(n-1)+(n-2)+(n-3)+……+2+1=n(n-1)/2;
2.3.5 数据拼接
(1)1 点换乘:在有票的条件下,查询b0m+bmn的可行性,其中am 就是同车换乘中转站点;
(2)2 点换乘:在有票的条件下,查询b0m+bml+bln的可行性,其中am、al就是同车换乘中转站点;
(3)多点换乘:在有票的条件下,查询b0m+bml+……+bkn的可行性,其中am、al……ak就是同车换乘中转站点;
(4)上述方法无法实现时,考虑“席位切换”的方式实现购票,即标记ba、bb、bc、bd 等信息,其中a(商务座)、b(一等座)、c(二等座)、d(站票)为席位种类,在数据拼接时,增加“席位切换”。可能得到如下信息:ba0m+bbml+……+bckn,其中am、al……ak就是同车换乘中转站点;
(5)上述方法无法实现时,考虑“少叠加换乘”的方式实现购票,即标记ba、bb、bc、bd 等信息,其中a(商务座)、b(一等座)、c(二等座)、d(站票)为席位种类,在数据拼接时,增加”少叠加换乘”。可能得到如下信息:ba0m+1+bbm-1l+……+bckn,其中am-1、am+1、al……ak就是同车换乘中转站点;
(6)上述方法无法实现时,考虑“少行程补票换乘”的方式实现购票,即标记ba、bb、bc、bd 等信息,其中a(商务座)、b(一等座)、c(二等座)、d(站票)为席位种类,在数据拼接时,增加“少叠加换乘”。可能得到如下信息:ba0m-1+bdm-1m+1+bbm+1l+……+bckn,其中am-1、am+1、al……ak就是同车换乘中转站点;
同车换乘数学模型
(7)上述方法无法实现时,考虑“2 车或2 车以上换乘”的方式实现购票,首先选择中转车站(尽量选择同一车站点),再确定具体车次信息,必须考虑中转时间(目前很多车站提供换乘快速通道),车次晚点等因素。比如:“2 车换乘”(详见图所示)就变成“2 个同车换乘”,再应用上述的“同车换乘”的方法实现分段购票。
同理,“2 车以上换乘”也就变成了“多个同车换乘”,再应用上述的“同车换乘”的方法实现分段购票。只是,换乘中转站点越多,耽误的换乘时间也就越多,其中不确定因素也就越多。
市面上现有的火车票购票程序不能高效的、精准便捷的针对不同用户做出最符合其需求的火车票推荐方案。现在的购票软件仅仅依靠12306 网站购票系统为核心,通过自有服务器的强大刷票能力进行抢票而已。在火车票资源不足时不能依靠自身的逻辑为用户提供一套最为适应的替代方案进行购票。而我们的项目可以计算起点到终点间车次及车票的情况,有票直接购买。直达无票的情况下,在无票的车次上先一个中间站,进行分段式购买,其中遵循用户需求可以通过购买不同等级座位的方式来完成同车中转到站的方法来实现用户需求。如果仍然无票,智能选择中转站,将购票形式转换成起点- 中转- 终点。如果仍然无票,将起点车次、终点车次、中间车次分解进行数据统计,采用神经网络多元算法,在有票的情况下,计算有效通路,并抛弃路程过长,路程较高和中转过多的选择方案,实现购票。
3 结论
3.1 应用基于Python 语言的爬虫技术,Python 已成为目前第三大主流编程语言,相较于前两种语言跟容易入门,可操作性更高Python 爬虫技术作为二者结合它的适应性更为强大。
3.2 我们设计的软件算法更能贴合用户需求,做到能最大限度满足用户的个性,减少用户出行的麻烦,能在可行范围内实现同车多次换乘达到一辆车次在各个阶段都有票的情况下使用户抵达目的地。
3.3 在爬虫技术的应用下更快速的到最新的火车票信息,做到真正的在售票厅外得知每辆车每个站点之间的票务信息,帮助用户快速方便购票。