最低成本强烈连接有向图

时间:2009-10-08 07:05:14

标签: algorithm graph traveling-salesman np-hard

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

换句话说,我需要摆脱边缘,以便在移除它们之后,图形仍将是强连接的,并且边缘总和的成本最低。

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

修改

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

编辑:

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

7 个答案:

答案 0 :(得分:12)

您的问题被称为最小跨越强子(di)图(MSSS),或更一般地说,最小成本跨越子(di)图并且为NP-hard indeed。另请参阅另一本书:page 501page 480

我首先删除所有不满足三角不等式的边 - 你可以删除边a - > c如果去a - > b - > c更便宜。这让我想起了TSP,但不知道这是否会带来任何影响。

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

答案 1 :(得分:2)

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

0-将图表放入列表

1-制作上一个列表中每个图形的新子图表列表,其中为每个新子图形删除一个不同的边缘

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

3-删除新列表中没有强关联的所有图表

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

5-如果新列表为空,则当前最佳是解决方案,否则,递归/ loop / goto 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的定义留给读者练习。

答案 2 :(得分:1)

此问题与此处描述的问题相同:http://www.facebook.com/careers/puzzles.php?puzzle_id=1

答案 3 :(得分:1)

很少有想法帮助我解决着名的面部谜题:

预处理步骤:

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

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

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

  4. 计算步骤:

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

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

    3. 这就是所有人。如果您想测试您的解决方案 - 请在此处尝试:http://codercharts.com/puzzle/caribbean-salesman

答案 4 :(得分:0)

似乎你基本上想要的是旅行销售员的最佳解决方案,允许不止一次访问节点。

编辑:

嗯。你能解决这个问题,主要是遍历每个节点i然后做一个所有边的最小生成树,指向那个节点i,与另一个指向的所有边的最小生成树联合起来来自该节点?

答案 5 :(得分:0)

听起来您想使用Dijkstra algorithm

答案 6 :(得分:0)

最小强连通子图的2近似是通过采用最小入分支和最小出外分支的并集来获得的,两者都以相同(但任意)的顶点为根。 / p>

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

2近似结果的原始参考是open source implementation,但论文无法自由访问。

Adrian Vetta paper by JaJa and Frederickson甚至有3/2的近似值,但比上面更复杂。