我已经制作了三个穿梭路线的成本(每个站点之间的距离)的有向图。从任何穿梭路线的车站到车站的票价是相同的,因此唯一要做的就是尽量减少转机。
我希望它以这种方式工作。我想从A站出发 - > C.为了简单起见,我们首先假设站点之间的距离是一(1)。
Route 1: A -> D -> B -> C -> A Route 2: A -> C -> E -> F -> A Route 3: A -> X -> Y -> Z -> A
因为有一条路径来自A - >在路由1和路由2中的C,我将选择路由2的成本最低的路由。我已经这样做了。
但如果我想从C站出发 - > Y,没有来自C的直接路线 - >是的,所以我必须从1或2开始,然后在A然后从A - > Y.基本上,我只想尽量减少班车转移和行驶距离。
这是否有流行的算法?
答案 0 :(得分:3)
您可以使用Dijkstra's algorithm解决此问题。
设置图表,以便:
航天飞机路线上的每个车站都有一个节点。如果两个航天飞机进入相同的staton,那么该站为每条航线获得一个节点。所以在你的例子中有节点A1,D1,B1,C1,A2,C2,E2,F2 - > A2等。还为每个站创建一个节点,但使其独立于路由,例如A,B,C等。
如果航天飞机直接在两个车站之间行驶,例如在A1和D1之间但不在A1和B1之间,则在这两个节点之间创建一个有向边。该边缘的权重应该是两个站点之间的成本(距离)。因此,例如,有边(A1,D1)和(D1,C1)
如果两个梭子在同一站点停止,则在两个路线上的站点的节点之间创建两个有向边缘,例如,创建边缘(A1,A2)和(A2,A1)。边缘的重量应该是转移的成本。
在每个特定于路线的站点节点和独立于站点的站点节点之间创建两条边,例如,创建边(A,A1),(A1,A),(A,A2),(A2,A) )。为每个节点提供比前一个边缘成本小得多的成本,例如.01 *最低成本。
现在,如果您想在两个站之间旅行,请使用Dijkstra算法查找两个非路由特定节点之间的最低成本路径。
在您的示例中,要从F行进到X,找到节点F和X之间的最低成本路径。返回的路径将是F - > F2 - > A2 - > A3 - > X3 - > X表示从F开始,乘坐2号航班,前往A,转乘3号线,然后在X站下车。
答案 1 :(得分:1)
很多,对某些场景,约束等进行了大量优化。
尝试dijkstra's,它通常是最短路径算法的基础(即许多人开始了解该主题),虽然要真正了解如何有效实施,但您可能也应该熟悉相关的数据结构(不同描述的堆等参见维基)
答案 2 :(得分:0)
答案 3 :(得分:0)
我认为这比TSP复杂一点。您希望最小化距离和使用的航天飞机。
如何衡量每一个?如果您只想最小化班车转移,请使用套件
每条路线都是一套。如果一个集合有一个项目(站点或一个给定的字母)也属于另一个集合,你可以从一个集合转移到另一个集合(或从一个集合转移到另一个集合)。
答案 4 :(得分:0)
这是交通规划中经常处理的事情。
以这种方式扩充代表网络的图表:
现在两个电台之间的最小路径是成本:
在所有情况下,关于登机和转机以及链接数量的路径最小。
请注意,每个链接都必须有成本(即使是符号),因为如果允许零成本的子路径,某些路径搜索算法将无限循环。
答案 5 :(得分:-1)
这是Traveling Salesman Problem的一个组成部分。实际上,没有“简单”的解决方案。但有几种算法可以提供“足够好”的解决方案。