站点表(id,name,...)--站点编码,站点名称
线路表(l_id,l_name,...)--车号编码,车号名称
站点车次关系表(id,l_id,l_id_order)--站点编码,车号编码,车号站点顺序号(每个站点对应车号的排名次序)
一个站点对应多部车号,一部车号对应多个站点,多对多关系举个例子:
两个站点(A-G)最短路程(最少站点):
select l_id,count(1) 站点数目 from 站点车次关系表
where l_id in
(select * from (select l_id from 站点车次关系表 where id='A') a where exist(select 1 from 站点车次关系表 b where a.l_id=b.l_id and id='G'))
and id in ('A','G') group by l_id以上设计上,只能设计到最少站点数目,最短时间比较困难(本人意见,各位有何见解)
线路表(l_id,l_name,...)--车号编码,车号名称
站点车次关系表(id,l_id,l_id_order)--站点编码,车号编码,车号站点顺序号(每个站点对应车号的排名次序)
一个站点对应多部车号,一部车号对应多个站点,多对多关系举个例子:
两个站点(A-G)最短路程(最少站点):
select l_id,count(1) 站点数目 from 站点车次关系表
where l_id in
(select * from (select l_id from 站点车次关系表 where id='A') a where exist(select 1 from 站点车次关系表 b where a.l_id=b.l_id and id='G'))
and id in ('A','G') group by l_id以上设计上,只能设计到最少站点数目,最短时间比较困难(本人意见,各位有何见解)
2, 站台表(PlatformNo, ...);
3,公交路线表(BusNo, PlatformNo, 站台路线序号, .....);
4. 相邻站台路程权值表(PlatformNo1, PlatformNo2, Value);一, 求A1,A2两站点最佳路线车次:
a. 求的过A1的公交车次集合a1;
b. 求的过A2的公交车次集合a2;
c. 求的a1, a2的交集, 利用权值表得出最佳路径。二, 求A1,A2两站点最佳换乘路线车次(换乘一次):
a. 求的过A1的所有公交车次经过的所有站点的集合a1;
b. 求的过A1的所有公交车次经过的所有站点的集合a2;
c. 把问题转变成a1的每一点到A2和,a2每一点到A1的问题。
d. 利用权值表得出最佳路径。三,求A1,A2两站点最佳换乘路线车次(换乘n次):
a. 求的过A1的所有公交车次(换乘n-1次)经过的所有站点的集合a1;
b. 求的过A1的所有公交车次(换乘n-1次)经过的所有站点的集合a2;
c. 把问题转变成a1的每一点到A2和,a2每一点到A1的问题。
d. 利用权值表得出最佳路径。
当然这种算法比较低级,高级的算法是先建模,转换成图的问题,再利用图论的一些结论,定理来解决。
首先用节点表和路段表描述公交线路网,
节点和路段都有自己的权值,然后用组成公交线路的路段ID列表来表示每一条公交线路,
每一条公交线路还可以有自己的权值放大系数,用于放大或缩小站点和路段的权值。最后,可以用Oracle的存储过程和存储函数,递归调用自己来完成公交换乘的查询。
是这样的,某个站点可能还需要一些关键词,也就是逻辑上的某个站点周围的标志性建筑物.
我现在有个简单的头绪,就是在查询的时候,不作太多的算法,要不速度太慢了,让浏览者无法承受,我想这部分放在数据库里面,比如说换乘这部分的查询,我们可以转化成为查询数据库里面的记录,而这些记录已经存在数据库中了,就像我们简单的查询一样.
我想每个站点要和其他的站点匹配,然后找出换乘的路线,不一定是最佳的换乘路线.
请大家在仔细想想,看看用什么最好的办法来解决这个问题!
谢谢大家了!
,因为不能说多了,我们现在正做这样的bs系统呢,不过用的不是jsp.
这东东,如果细想的话,越想越复杂!!到了一个站点可能要去另一个同名的反向站点坐车,
(楼主说: "每个站点要和其他的站点匹配",呵呵,这个可不容易匹配了)
而两个站点离得又比较远
或者说不可能在一个视线中看到
呵呵,
晕~~~~~~~~~
如果如 baggio785(狗狗) (????!!!!! 汗 ^_* )所述
"不一定是要最佳的换乘路线!!"那就无所谓了,
不需要考虑要换乘几次,不需要考虑线路的行走时间, ......
那做的都没什么意思了,呵呵,不如做成这样的,
http://h.7i24.com/vbcc/querytrain/
[email protected]
现在如果只是考虑数据库,大家能不能提供以下数据库的设计?
如A换到B,则找出A站有哪条线路,并且是通过B的,有则选一条到B站换乘数最少的、站数最少的。如果没有,则找一个站到B站最近的,这要有两站之间的距离记录。线路表(记录有什么线路)
站点表(记录有什么站,有哪条线路通过)
站点线路表(记录各站的信息,距离、路况等)
设计一库表,字段为:公交线路、途径车站编号、流水号、距离起始点距离、距离起始点时间
(两站之间的绝对差可以比较最短时间或最短距离,比如519路经过A站时距离起点2KM,10分钟,到达B时距离起点22KM,70分钟,同样536路经过A站时距离起点10KM,30分钟,到达B时距离起点40KM,100分钟,那么从A到B,519的距离为22-2KM,时间为70-10M,536为40-10KM,100-30M,流水号的作用便于换路用),换乘比较复杂,比如从A到B,可以找出经过A/B的所有线路,设为集合Ra,Rb,列出所Ra,Rb中每条线路经过的站点集合(删掉重复的),这样分别得到站点集合,设为集合Pa,Pb,显然如果Pa,Pb中有重复的站点,设为T,说明存在从A到T的线路以及从T到B的线路,同样可以列出所有的解,并根据前面的方法计算最优解,
最复杂的是T不存在的情况,这时需要增加换乘的次数了,现在利用同样的办法来构造Pc,先找出经过Pb的线路集合Rc,再构造Pc,Pc与Pb中重复的站点就是解集,
依次类推...突发奇想,请大家多多推敲,共同进步!!!
简单的时间或路程的加权好象还不能确定最优路线。应该还有一个换乘的问题。例如:
A-C-E-G为由站间权值确定的最优路线,然而实际乘车的时候,直接走A-C-E-G路线可能要换两趟车,而走A-D-C路线只要换一趟车。
1、BUS(BUS_ID,NAME,...) :存放公共交通线路
2、STATION(STATION_ID,NAME,...) :存放站点
3、BUS-STATION(BUS_ID,STATION_ID,TIME,LENGTH...) : 存放没条线路从起点到该纪录站点的时间和路程。起点:路程或时间为0。
终点:同一线路的各站点中路程或时间最小的站点。
换乘站点:起点线路和终点线路共有的站点。
时间或路程最短:用表3的数据求差比较,取最小值既可。
个人意见,大家多批判。
1、BUS(BUS_ID,NAME,...) :存放公共交通线路
2、STATION(STATION_ID,NAME,...) :存放站点
3、BUS-STATION(BUS_ID,STATION_ID,TIME,LENGTH...) : 存放没条线路从起点到该纪录站点的时间和路程。起点:路程或时间为0。
终点:同一线路的各站点中路程或时间最小的站点。
换乘站点:起点线路和终点线路共有的站点。
时间或路程最短:用表3的数据求差比较,取最小值既可。
个人意见,大家多批判。
公交线路,站名,这条线的第几站
linename,station_name,forder
121 a 0
121 b 1
121 c 2111 c 0
111 f 1
111 g 2select t1.* ,t2.station_name from (select * from bus_station where station_name='xiasha' ) as t1
inner join (select * from bus_station where station_name='dongchang' ) as t2 on t1.linename=t2.linename
thx!