【问题标题】:Minimum cost strongly connected digraph最小成本强连通有向图
【发布时间】:2010-12-04 21:32:30
【问题描述】:

我有一个强连接的有向图(即,对于图 G 中的每对节点 (i, j),都有一条从 i 到 j 和 j 到 i 的路径)。我希望从这个图中找到一个强连通图,使得所有边的总和最小。

换句话说,我需要以这样一种方式去除边,即在删除它们后,图仍然是强连接的,并且边的总和成本最低。

我认为这是一个 NP 难题。我正在为一小组数据(例如 20 个节点)寻找最佳解决方案,而不是近似值。

编辑

更一般的描述:给定一个图 G(V,E) 找到一个图 G'(V,E') 使得如果在 G 中存在从 v1 到 v2 的路径,那么在 v1 和G' 中的 v2 和 E' 中每个 ei 的总和是最不可能的。所以它类似于找到一个最小等价图,只是在这里我们要最小化边权重的总和而不是边的总和。

编辑:

到目前为止我的方法: 我想过使用多次访问的TSP来解决它,但这是不正确的。我的目标是覆盖每个城市,但使用最低成本路径。所以,我猜这更像是封面设置问题,但我不确定。我需要使用总成本最低的路径覆盖每个城市,因此多次访问已经访问过的路径不会增加成本。

【问题讨论】:

  • 不,不是,我正在尝试实现 tsp 及其变体
  • 我对成本是多少感到困惑。它是您保留的边缘成本的总和吗?每对节点之间的 n^2 条路径的成本总和?覆盖每个节点的一组路径的成本总和(确实不符合 SCC 的要求)?
  • 成本是构成图形的所有边的权重之和

标签: algorithm graph traveling-salesman np-hard


【解决方案1】:

似乎您基本上想要的是旅行商的最佳解决方案,其中允许多次访问节点。

编辑:

嗯。你能通过本质上迭代每个节点 i 来解决这个问题,然后做一个指向 节点 i 的所有边的最小生成树,与指向 的所有边的另一个最小生成树联合吗? 来自那个节点?

【讨论】:

  • 实际上我解决了这个问题 TSPm,但它不起作用,在我的情况下,我应该被允许多次重新访问节点以及边缘,我将编辑问题以获得更多描述跨度>
【解决方案2】:

听起来你想使用Dijkstra algorithm

【讨论】:

  • Dijkstra 不适用于这里...至少不是以任何明显的方式。
  • 嗯,你可以使用 Dijkstra 来解决 TSP,所以它一个可能的解决方案。只需定义部分解决方案的搜索空间,然后以最低成本的顺序搜索它。当然,这并不意味着在这种情况下它是一个好的解决方案。
【解决方案3】:

我会以动态编程的方式尝试这个。

0- 将图表放入列表中

1- 列出上一个列表中每个图的新子图,其中为每个新子图删除一条不同的边

2- 从新列表中删除重复项

3- 从新列表中删除所有非强连接的图

4- 将新列表中的最佳图表与当前最佳图表进行比较,如果更好,则设置新的当前最佳图表

5-如果新列表为空,则当前最佳为解决方案,否则,递归/循环/转到1

在 Lisp 中,它可能看起来像这样:

(defun best-subgraph (digraphs &optional (current-best (best digraphs)))
  (let* ((new-list (remove-if-not #'strongly-connected
                                  (remove-duplicates (list-subgraphs-1 digraphs)
                                                     :test #'digraph-equal)))
         (this-best (best (cons current-best new-list))))
    (if (null new-list)
        this-best
        (best-subgraph new-list this-best))))

strongly-connectedlist-subgraphs-1digraph-equalbestbetter 的定义留给读者练习。

【讨论】:

    【解决方案4】:

    您的问题被称为最小跨度强子(二)图(MSSS)或更一般地,最小成本跨度子(二)图并且是NP-hard indeed。另见另一本书:page 501page 480

    我会从删除所有不满足三角不等式的边开始 - 如果 a -> b -> c 更便宜,您可以删除边 a -> c。这让我想起了 TSP,但不知道这是否会导致任何地方。

    我之前的回答是使用解决Arborescence 问题的Chu-Liu/Edmonds algorithm;正如 Kazoom 和 ShreevatsaR 指出的那样,这无济于事。

    【讨论】:

    • 有向生成树的 MST 并不能真正解决问题。有向树 mst 仅找到从根到其他节点的最短路径。在我的情况下,我需要找到一个具有从一个节点到每个其他节点的路径的图,可能不是最少的,但图的边的总和需要最小
    • “有向树 mst 只找到从根到其他节点的最短路径” - 这就是 Dijkstra 所做的吗?根据我链接的其他参考资料,总和被最小化,并且结果图是强连接的。你能清楚地说明什么是错的吗? (这不是无向 MST 算法对有向图的字面使用)
    • @sdcvvc:最小树状问题给出的结果图是树状,因此不是强连接的。它具有从根到所有其他节点的路径,但不是在所有节点对之间。例如,它没有进入根的边缘,也没有从叶子的边缘。
    • 要达到最佳值的 2 倍很容易 - 选择任意节点并计算该节点的最小生成树和内树。
    【解决方案5】:

    这个问题相当于这里描述的问题:http://www.facebook.com/careers/puzzles.php?puzzle_id=1

    【讨论】:

      【解决方案6】:

      帮助我解决著名的 facebull 难题的几个想法:

      预处理步骤:

      1. 修剪:如果有更便宜或具有相同成本路径,则删除所有边 a-b,例如:a-c-b。

      2. 图分解:如果图有关节点,则可以解决子问题

      3. 如果只有一条出边,则将顶点合并为一个虚拟顶点。

      计算步骤:

      1. 使用重复访问的定向 TSP 获得近似解。使用 Floyd Warshall,然后使用匈牙利方法解决分配问题 O(N^3)。如果我们有一次循环 - 它是定向 TSP 解决方案,如果没有 - 使用分支和绑定 TSP。之后我们就有了上限值——最小成本的循环。

      2. 精确解决方案 - 分支定界方法。我们从最短循环中删除顶点,并尝试以低于上限的成本构建强连通图。

      这就是所有人。如果你想测试你的解决方案 - 在这里试试:http://codercharts.com/puzzle/caribbean-salesman

      【讨论】:

      • Floyd Warshall 的目的是什么?
      • 为什么可以用匈牙利语(不用注意体重?)
      • 使用匈牙利方法后。如果我们从来没有循环。为什么结果是最小成本周期的上限值?
      • 1.第 1 步我们需要 FW。如果我们得到的路径 a->b(例如 a->c->b)比原始顶点 a->b 短,那么我们可以删除这样的顶点。 2. 如果匈牙利语给我们一个循环 - 它等于有向 TSP 解,所以我们将其作为上限。
      • 如果我们得到multi-cycle,那么我们让每个cycle 到一个virtual vertex 并且再匈牙利一次呢?直到我们只得到一个循环,那么它就是上限
      【解决方案7】:

      最小强连接子图的 2 近似值是通过将最小内分支和最小外分支联合来获得的,两者都以相同(但任意)顶点为根。

      out-branching,也称为arborescence,是一棵以单个顶点为根的有向树,跨越所有顶点。内分支与反向边缘相同。这些可以通过Edmonds' algorithm 在时间 O(VE) 中找到,并且有到 O(E log(V)) 的加速(参见wiki page)。甚至还有一个open source implementation

      2 近似结果的原始参考是paper by JaJa and Frederickson,但该论文不可免费访问。

      Adrian Vetta (PDF) 甚至有 3/2 的近似值,但比上面的更复杂。

      【讨论】:

        猜你喜欢
        • 2016-02-27
        • 2018-03-01
        • 1970-01-01
        • 2017-01-25
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        相关资源
        最近更新 更多