有限制的Steiner树算法反馈

时间:2013-04-29 22:29:39

标签: graph-algorithm dijkstra minimum-spanning-tree

对于作业,我必须创建一个Steiner Tree。但是,这不是典型的Steiner树,因为我们需要使用的图形结构不允许插入新的顶点。相反,测试用例定义了N个顶点和M个边缘的图形结构,同时专门将X个顶点标记为目标节点。这些是我们在使用图中的一些,没有或全部未标记顶点时必须跨越的节点。

我对此问题的解决方案是

  1. 实施Dijkstra's Algorithm以找到所有目标顶点之间的最短路径
  2. 对于每条最短路径1:n
    1. 将所有当前选定的路径顶点提取到集合
    2. 将所有剩余的顶点提取到集合
    3. 对于当前所选路径的所有顶点1:m
      1. 执行Dijkstra以找到当前顶点与其他路径顶点之间的最短路径
      2. 如果这样创建了生成树,请按优先级队列中的路径和长度保存,并按长度值
      3. 排序
  3. 弹出优先级队列的顶部并返回路径
  4. 我的问题是,这是一个详尽的搜索,它使用Dijkstra的初始应用程序为比最小生成树更短的路径创建一组简化的可能的起始端点。

    是否有可以解决此问题的启发式算法或其他算法?

1 个答案:

答案 0 :(得分:1)

在一些帮助下,我找到了一个类似问题的答案。而不是像空间steiner树问题中那样添加新顶点,此图中的新steiner点是沿着标记节点之间的路径的顶点。对于具有N个顶点的图形,M个边缘,X需要顶点,S找到顶点(沿着路径的顶点):

  1. 计算所有对岸边路径(Floyd-Warshall,Johnson's,无论如何)
  2. 表示X中的k
    1. 从X中删除k,将k插入S
    2. for v in(X + S) - 两组
      1. 找到从k到v的最短距离 - 路径P
    3. for P in P(路径上的所有顶点)
      1. 将您插入S
      2. 如果你在k中存在,则从k
      3. 中删除你
  3. 现在关于这个算法的作用的文本墙。我们在X中选择一个顶点k,然后找到目标集X或结果集S中距离最近的其他顶点的最小距离,并将其称为v。然后我们遵循{k,u}中节点的路径,将它们插入到我们的结果集中。最后,仔细检查并确保从X中删除路径中(不应发生)的X中的任何顶点。

    您要添加的任何新顶点c将与结果集S中已有的某个节点之间的距离最小。由于S中已有的节点相距最小距离,因此c将是最小距离从S到c的任何一点。例如,如果您有三个节点A,B和C,如果已经发现A和B相距最小距离,则添加C满足要求它与B的最小距离,以及距离的最小距离路径A到C经过B。

    我对离散的Steiner Tree问题做了一些研究(就是这个问题),这是我发现的最好的蛮力解决方案。主要问题是完成所有对最短路径所需的O(n ^ 3)时间,但是最小树的构造应该简单快捷,因为您只需要查找距离信息。与我合作的实施是outlined nicely on wikipedia