用迪杰斯特拉算法写全国交通模拟系统,求各位给点建议。
老师的要求如下:
要求输入起点站和终点站;我们写的系统经过计算输出耗时最少的一系列航班;如用户输入南昌、北京;则最优路径可能会经过多次转车,因此输出的不是一趟车次的信息。但这里有个难点,就是两站之间存在多趟火车,每两趟火车之间的等待时间均不相同,如前一趟车到达某站的时间为10点,而从该站出发的各车次的出发时间不相同,若以等待时间自然不相同,老师要求要将等待时间也算入在内,所以网中的两邻接点的权值不好确定。我是准备用高中的组合来实现,即每两个中转站之间都挑出一趟车次来,然后用迪杰斯特拉求最短路径。最后从所有组合结果的出的最短路径中挑出那个最最短的即为真正的最短路径(类似用穷举法做)。但是这种方法耗时太大了,所以想请教各位有没有更好的办法解决等待时间的问题,给点思路吧。
[解决办法]
还是用动态规划吧。。。,不过消耗空间挺大的
[解决办法]
直接用dijkstra没问题的。转移的时候,不要用加法,而用到达时间。比如a到b有一班1:00发4:00到的,那无论a的到达时间是0:00还是0:30,dijkstra转移到b的时候都用4:00作为到达b的时间,而不是3:00或者3:30。
这样做正确的理由是,即使有等待时间,对于每一个站而言,早到永远比晚到好。有这个性质成立的话那直接用到达时间是没有问题的。
[解决办法]
交通算法的问题始终要归结到数据域的问题。
从生活常识来讲,如果直接到达的时间为15小时,而经过转车到达的时间为10小时,那么直接到达可能比经转车到达的时间要快,因为转车首先要考虑的因素就是互转的两趟车的交接时间对于出行者是否合理,这个在制作交通数据的时候,我觉得应该要考虑进去,也就是权值。
所以你说“网中的两邻接点的权值不好确定”。
我也觉得问题的关键在于这个权值,如果权值确定了,再用Dijkstra就好办了。
举个例子:A段-> B段
A段的结束时刻TimeEndA=9:00,旅行时间为TTimeA=4h;
B段的开始时刻TimeEndB=11:00(如在9:10分前就算做不合法数据),旅行时间为TTimeB=6h;
那么A段的权值不应该会是4,同样B段不是6;
解决的办法总是有的,仔细了解你的数据源。