我正在尝试使用算法解决此问题至少一周但无济于事。我有一组道路(1,2,3,...),每条道路至少有一辆可以通过的车辆(A,B,C,......)。我的问题是如何获得最少的游乐设施,以达到一条路到另一条路。例如:
road | vehicle(s) 1 | A,B 2 | A,B,C 3 | C,D 4 | C,D 5 | D,E
输出应为:
from 1, ride A or B to 2 from 2, ride C to 4 from 4, ride D to 5
这里的政策是尽可能耗尽一次,但输出的乘坐次数应该是最少的。
示例2:
road | vehicle(s) 1 | A,B 2 | A,B,C 3 | C,D 4 | C,D 5 | A,E 6 | E,F 7 | F 8 | F,H 9 | F,G 10 | F,G 11 | F 12 | F,G 13 | G,H 14 | H
输出:
from 1, ride A to 5 from 5, ride E to 6 from 6, ride F to 8 from 8, ride H to 14
请帮我写一下这个问题的算法。我需要为我的项目解决这个问题。谢谢!
PS:如果您需要其他示例或说明,请在下面的评论中告诉我。
答案 0 :(得分:2)
考虑这个问题的一种方法是将其建模为图搜索问题。对于每个不同的车辆v,构造一个图G v ,其节点是网络中的所有道路,在车辆v连接的节点之间有弧形。例如,在您的第一个示例中,图G A 将有五个节点,其中只有从节点1到节点2的连接,而图G C 将有五个节点,边距为2到3,3到4和4到2。
现在,考虑如下构造的最终图G。通过对所有车辆v(意味着原始图中每个节点有多个副本)取所有图G v 形成G,然后在不同图中的相应节点之间添加边如果有多个不同的车辆都到达了道路。例如,在原始问题的图G中,你将有G包含子图G A 和G B ,...,G E 。由于道路1由车辆A和B提供服务,因此您将在图表G A 和G B 中的道路1的节点之间添加边缘,并且因为道路2由车辆A,B和C提供服务,将有连接所有道路2节点的边缘,用于子图G A ,G B 和G C 子>
您有兴趣尽量减少需要转移的次数,因此我们希望在此图表中设置一些衡量该费用的成本。特别是,我们说完全包含在子图G v 中的任何边都有零成本,因为一旦你在一个给定类型的车辆上,你不需要做任何改变在车辆周围移动服务。但是,我们为连接不同车辆的子图的每条边分配一个成本,因为遵循这种边缘意味着您正在改变您正在使用的车辆。如果您现在在此图表中找出任何路径,则该路径的总成本就是您所做的车辆更改次数。
要完成施工,我们需要找到从起跑道到目的地的成本。为此,我们将在图表中添加两个新节点s和t,表示行程的开始和结束。节点s将在每个子图的第一条道路上具有成本为零的有向边,因为当您开始旅程时,您可以选择任何车辆作为您的第一步。类似地,最终道路的每个子图的节点都将具有零成本边缘到t,因为一旦到达目的地道路,您所在的车辆无关紧要。
在此设置中,从s到t的任何路径的成本都等于您需要进行的传输总数。因此,从s到t查找此图中的最短路径可以为您提供获取路径和该路径的成本。例如,您可以使用Dijkstra算法解决此问题。
此算法的运行时不是恒星,但它仍然是多项式时间。假设有n条道路和m条不同的车辆。我们创建的图形中将包含m个不同的子图,每个子图用于一个车辆,在最坏的情况下,这些图形中具有O(n 2 )边。如果我们然后将这些子图的所有相应节点链接在一起,你可以在那里改变线,那么在最坏的情况下会有O((mn) 2 )这样的边,因为有m个n的图所有可能彼此连接的节点。因此,我们有一个O(mn)节点和O((mn) 2 )边的图,所以我们可以在O((mn) 2 + mn中运行Dijkstra算法记录时间。
我认为从这个问题中解脱出来的主要思想是,你可以经常通过创建一个由旧图的多个副本形成的新图表来解决在图形中寻找路径的问题。该图表具有良好的边缘成本函数。
希望这有帮助!