公交系统(二)

        今天没时间写代码了,简单说一下思路吧。

        首先,公交系统求两站的最短路径,不能简单的用最短路径求。我犯过这个错,比如A站到B站,可能一趟车做六站就可以到,但是那次我的结果是导三次车,5站就到了。。。   这显然不合逻辑。

       做任何项目,任何算法之前,要有个认识,代码要怎么走能走出结果来。 最好能先在纸上画一画,程序员也是需要打草稿的。

        比如这个公交系统,A站到B站,可能一列车就到了,但是倒车的话站数会少一点,这时候用程序判断哪个更优太难了。。。比如A站到B站,不换乘20站就到,换乘1次18站到,换乘2次15站到,换乘3次10站就到了,换乘4次可能8站,甚至更少。。。 

        联想到经常用的高德地图。用高德2年多了,好像还没发现在北京有换乘4次的路线。高德为什么不会换乘4次?  让我换乘4次,我可能宁可做20站到。毕竟我的经验来说,公交车经常一等就是二十分钟,半个小时。。。 

        前辈的经验,不用白不用。既然高德认为两站之间换乘4次就没有意义了,而且我也认为换乘4次超出我的极限了,那我就可以不考虑换乘4次的情况了。但是前三次的情况都是要考虑的。

        基于此,我发现公交系统里面的两站之间最短距离,跟换乘次数是有极大关系的。于是有一个方案在脑子里想出来了,再画一画,形成了下边的思路:


      字有点丑,欢迎吐槽。。

       先计算出从A站出发能够一站直达的所有站点,记录这些站点的信息,包括从A站出发经过的站数,公交线路,如A1站点,从A站出发,经过4站就能直达。这些线路记为A站的第一层线路。然后,从A站的第一层线路的每一个站点出发,记这些站点能直达的所有站点,并记下线路信息和经过站点情况,记为A的第二层线路。如第二层上有个站点A2,是从A1出发经过2站到达的,那么A2就是从A点出发,经过6站,并且换乘一次到达的。依次类推,可以记录A的第三层路线甚至第四层路线。

       思路就是这样,类似与图的广度遍历吧。。。  但是这比广度遍历复杂得多,因为这涉及到很多重复无用的站点,而且又不能保存站点是否处理过等信息,因为一个站点是很可能处理两次甚至更多的。

       想想这样一种情况:   A的第一层中有B站点,C站点,那么A的第二层中肯定也会有B站点和C站点吧,因为B在第一层,B能直达C,所以C肯定在A的第二层。  这是最大的重复,暂时还没想好怎么回避他,不过这个不影响结果,只是效率低一点。 我肯定优先把代码实现了,然后回头再慢慢优化他,毕竟公交系统有太多可优化的东西了。。

       最后,真心给所有想成为程序员的人一个建议:   网上买点A4打印纸,太好用了。   写代码之前最好能在纸上写写画画,写的时候真心的,思路能清晰很多。网上20块钱不到,能买500张,改革开放这么多年了,我相信谁都负担得起。

猜你喜欢

转载自709002341.iteye.com/blog/2262075