Algorithm 同时最少传输的最短路径算法

Algorithm 同时最少传输的最短路径算法,algorithm,shortest-path,Algorithm,Shortest Path,我已经绘制了三条穿梭路线的成本(每个站点之间的距离)有向图。任何往返路线的车站之间的票价都是相同的,因此唯一要做的就是尽量减少换乘 我希望它能这样工作。我想从A站->C站开始。为了简单起见,让我们先假设站之间的距离为一(1) Route 1: A -> D -> B -> C -> A Route 2: A -> C -> E -> F -> A Route 3: A -> X -> Y -> Z -> A 路线1:A->D->B->C->A 路线2:A->C->E->F->A 路线3:A->X

我已经绘制了三条穿梭路线的成本(每个站点之间的距离)有向图。任何往返路线的车站之间的票价都是相同的,因此唯一要做的就是尽量减少换乘

我希望它能这样工作。我想从A站->C站开始。为了简单起见,让我们先假设站之间的距离为一(1)

Route 1: A -> D -> B -> C -> A Route 2: A -> C -> E -> F -> A Route 3: A -> X -> Y -> Z -> A 路线1:A->D->B->C->A 路线2:A->C->E->F->A 路线3:A->X->Y->Z->A 因为在路线1和路线2中都有一条从a->C的路径,所以我将选择成本最低的路线2。我已经这样做了

但是如果我想从C->Y站出发,从C->Y站没有直达路线。因此我必须从1站或2站出发,然后在A站下车,然后从A->Y站出发。基本上,我只想尽量减少往返换乘和行驶距离


有一种流行的算法吗?

针对特定场景、约束等进行大量优化


尝试一下,它通常是最短路径算法的基础(即许多人开始学习该主题的地方),尽管要真正理解如何有效地实现它,您可能还应该熟悉相关的数据结构(大量不同的描述等,请参阅wiki)

这是的一个组件。实际上,没有“简单”的解决方案。但是有几种算法可以给出“足够好”的解决方案。

有很多算法可以解决这类问题:


我认为这比TSP要复杂一些。您希望最小化距离和使用的穿梭机

每一个的重量是多少?如果您只想最小化穿梭传输,请使用集合

每条路线都是一套。如果一个集合中有一个项目(站或给定字母)也属于另一个集合,您可以从一个集合转移到另一个集合(或从穿梭机转移到另一个集合)。

您可以通过以下方法解决此问题

设置图表,以便:

穿梭路线上的每个站点都有一个节点。如果两个航天飞机去同一个站点,那么该站点的每条路线都有一个节点。因此,在您的示例中有节点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)。为这些节点中的每一个指定一个远小于前一条边的成本的成本,例如,0.01*最小成本

现在,如果您想在两个站点之间旅行,请使用Dijkstra算法在两个非路由特定节点之间找到成本最低的路径


在您的示例中,要从F到X旅行,请在节点F和X之间找到成本最低的路径。返回的路径将是F->F2->A2->A3->X3->X,意味着从F开始,乘坐2号班车,旅行到A,换乘3号线,然后在X站下车。

这是交通规划中经常处理的问题

通过以下方式扩充表示网络的图形:

  • 对每条路线使用单独的链接。给每个人一个成本(旅行时间是一个很好的价值)
  • 在路由链接和表示站点的节点之间添加链接。这些将代表上下车
  • 为登机链接增加高成本(不一定是真正的成本)
  • 现在,两个站点之间的最小路径成本为:

  • 当两个车站通过一条路线连接时,一个登机费率加上路径中每条链路的小费率
  • 两个或两个以上的登机费率加上未直接通过路线连接的站点的每条链路的费率
  • 如果在站点之间找不到路径,则为无限
  • 在所有情况下,就登机和转机以及链路数量而言,路径都是最小的


    请注意,每个链接都必须有成本(即使是符号),因为如果允许零成本的子路径,某些路径搜索算法将无限循环。

    与行驶距离相比,快门传输的“成本”是多少?最小路径问题与旅行商问题不同。@Apalala:当然,它们是不同的;这就是为什么我说它们是一个子集。谢谢。我正计划实施这个计划。谢谢你的及时回复。我也会这样做。我为这一个做了Floyd Warshall,并在数据库中保存了预计算的最短路径和最低成本。