求助:列车时刻中转算法

xiaoxin86 2006-08-05 11:34:51
各位高手,小弟想做个列车时刻软件。但是现在设计列车时刻中转算法时,遇到了难题。
我想了快一个星期没有什么进展!虽然我的算法能查询到所有的中转站,但是居然需要
10秒钟!!

考虑一下火车中转。因为中转站一般情况都是大站,我新建了一个车站表
station,里面存储的都是可能中转站,约130多个。我的算法:

比如A到B需要中转
对中转站进行搜索,
先查询A地是否能到该中转站,
假如能 --查询中转站能否到B地,
如果能则可以在此地中转。
然后搜索下一个中转站

我遇到的问题是需要 10 秒钟才能查出所有的中转站!!!
真的没有什么办法提高这个查询速度吗?我试用过一些查询列车时刻的软件,
其中一个的数据库和我是差不多的,但是它们基本上都只需要1秒钟,
各位高手有什么好的方法没?

我用的的Access数据库,vc编写.
主要由三个表,表Station存储可能中转站信息,(130条记录)
表Pass存储所有车次的详细信息, (30,000条记录)
表Train存储所有车次的始发站和终到站信息. (2200条记录)

对于判断 城市 上海 和 西安 能否由车到达,我有两种算法:

算法1: 用动态字符窜数组存储所有经过 西安 的车次
用动态字符窜数组存储所有经过 上海 的车次

判断X 和 Y数组的元素有没有相同的,
假如有则可以到达

算法2: 用SQL语句(好心的高手提供)
select 车次
from table
where 车站 in (上海,西安)
group by 车次
having count(1)=2

假如上海能到西安,搜索出所有的车次,大概需要1秒钟

但是对于需要中转的车,每次都要和那 130 个车站中的一个比较
搜索完所有的需要 10秒!!

我该怎么优化呢?
1。优化表?
2。优化算法?


...全文
967 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vfssqs 2006-08-18
  • 打赏
  • 举报
回复
帮你顶吧。关注中。
anewbaba 2006-08-18
  • 打赏
  • 举报
回复
mark:)
hillhx 2006-08-18
  • 打赏
  • 举报
回复
给你个思路啊,不一定对


可以把问题分两部分
1:不用倒车的情况,你已经写出来了
2:倒一次车的情况(一次以上没必要考虑)以下是思路
有这么一个车站,可以通西安,也可以通上海
select *
from (select 车站,车次 where 可以通西安) t1,
(select 车站,车次 where 可以通上海) t2
where t1.车站= t2.车站
and t1.车次 <> t2.车次
我这个写的不全,可能还要排除一些1里面已经出现的车站
tsp3ng 2006-08-06
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4929/4929112.xml?temp=.3802149

上面写了详细的算法,理论上估计速度不会超过1秒, 没有用大量数据测了。
tsp3ng 2006-08-06
  • 打赏
  • 举报
回复
上述算法1-3其实是同一个过程(递归算法)
站点能达到站点(StationPassStation) 一定要事先求出,不能每次都去计算。
然后每次求出最优路线可以采用物理表缓冲,必须规定缓冲表的行数,缓冲表太大反而影响速度,可以采用计数器记录使用频率淘汰。

本人路过。希望大家提出更好的建议。
tsp3ng 2006-08-06
  • 打赏
  • 举报
回复
采用图来处理估计会方便,且扩展性会很好。因为有数据结构图的理论支持。
如果要做成一个软件,还需要考虑到是否需要中转,及中转路线的乘车时间、等待时间、列车类型/票价、中转城市的旅游景点是否为乘户喜欢,中转城市的下车时间,是否住旅店等。
个人觉得软件应当追求完美,不是个人用的,而是让大家用的。

这个是数据结构中的经典“邮差问题”。
1.算法一 回溯法 列举所有乘车路线,此算法具有“通用的解题法”之称. 像密宫、八皇后等问
题都可以采用这算法解决,但耗时一般为O(n!)
2.算法二 贪心算法 求解最佳乘车路线。需要支持从时间、价格等各方面考虑。
3.算法二 限界剪枝法 是上述两种算法的综合性、具有耗时少、结果最优化的特点。

表结构大致如下
站点表(Station) 可以概括站点的所有信息(景点等)。
列车表(TrainM)起止站点、起止时间等。
列车线路表(TrainLine)途经站点序号、途经站点ID, 站点到达时间、始发站到站点共用时、上站
到此站用时、从始发站到此站票价、上站到此站票价等
站点能达到站点(StationPassStation) 描述从此站点出发能够直接到达的站点。由列表线路表+
站点表生成这个物理表。

算法流程
1.有无直达,根据站点能达到站点得出。
2.求出起始站能够达到的站点,同时求出终点站能够达到的站点,再求出公共站点(相当于数学
中的公约数)
3.此时说明一次中转不行,考虑多次中转, 此时需要采用递归到始、终的能够直达的站点的能够直达的站点。求出公共站点。直到找到公共站点/或者所有站点找完无解。
4.上述所有线路求解完成,再考虑最佳。

注意:应该从两头同时出发,求解公约数。







playwarcraft 2006-08-05
  • 打赏
  • 举报
回复
考慮2次或以上中轉嗎?
(上海-西安)
-->
上海-南京
南京-北京
北京-西安
xiaoxin86 2006-08-05
  • 打赏
  • 举报
回复
暂时不考虑二次中转。
sujianhua 2006-08-05
  • 打赏
  • 举报
回复
关注

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧