在图中找到X成本最低的树

时间:2011-09-26 17:00:44

标签: algorithm optimization graph graph-algorithm

我有带有N个节点的图和带有成本的边。 (图形可能是完整的,但也可以包含零边)。

我想在图表中找到K树(K

任何建议最佳方法是什么?

我试图将问题修改为只查找单个最小生成树,但没有成功。 谢谢你的提示!

修改

细节很少,这可能很重要。成本与跨越边缘无关。成本是建立这种优势的代价。一旦构建了边缘,您就可以无需任何成本地向前和向后遍历它。问题不在于“沿着所有节点”,问题在于“在所有节点之间创建网络”。对于之前的解释我很抱歉

故事 这是我听过并试图解决的故事。

有一个城市,没有电力连接。电气公司能够将K房屋与电力连接起来。其他房屋可以通过从已连接的房屋中拔下电缆来连接。但放弃这种电缆需要付出代价。目标是选择哪些K房屋将直接连接到发电厂,哪些房屋将通过单独的电缆连接,以确保最小的电缆成本和所有房屋覆盖:)

7 个答案:

答案 0 :(得分:1)

正如其他人所说,这是NP难。但是,如果您愿意接受良好的解决方案,则可以使用模拟退火。例如,旅行商问题是NP难的,但是使用模拟退火可以找到接近最优的解决方案,例如, http://www.codeproject.com/Articles/26758/Simulated-Annealing-Solving-the-Travelling-Salesma

答案 1 :(得分:0)

假设您可以使用prim算法在O(V^2)中找到最小生成树。

对于每个顶点,找到以该顶点为根的最小生成树。

当您运行算法V次时,这将是O(V^3)

按图表的总质量(顶点的权重之和)对它们进行排序。这是O(V^2 lg V),由O(V^3)消耗,因此在订单复杂性方面基本上免费。

采用X最小的图形 - 这些图形的根源是直接连接到网格的“锚点”,因为它们通常可能具有最短路径。要确定它采用哪条路径,只需在每棵树的每个节点中按照root路径,然后连接最短的路径。 (这可以通过将所有路径排序到root并且首先仅使用最短路径来进一步优化。这将允许对下一次迭代进行优化。找到root的路径是O(V)。找到所有VX时间的路径是{{ 1}}。因为你会为每一个V做这个,所以你看O(V^2 * X)。这不仅仅是你最大的复杂性,但我认为这些的平均情况会很小,即使是最糟糕的情况很大)。

我无法证明这是最佳解决方案。事实上,我确信它不是。但是,当您考虑使用100,000个家庭的电网时,您无法考虑(在任何实际应用中)NP硬解决方案。这为O(V ^ 3 * X)提供了一个非常好的解决方案,我想这将给你一个非常接近最优的解决方案。

答案 2 :(得分:0)

您正在描述基数约束path cover之类的内容。它出现在旅行推销员/车辆路线系列的问题中并且是NP-Hard。要创建算法,您应该问

  1. 你是否只会在小图上运行它。
  2. 您是否只会在具有精确算法的图表的特殊情况下运行它。
  3. 你能用一种能够解决问题的启发式方法吗?

答案 3 :(得分:0)

看看你的故事,我认为你所谓的路径可以是一棵树,这意味着我们不必担心汉密尔顿电路。

http://en.wikipedia.org/wiki/Prim%27s_algorithm查看Prim算法的正确性证明,考虑采用最小生成树并删除最昂贵的X-1链路。我认为那里的证据表明结果与你的问题的最佳答案成本相同:唯一的区别是当你比较边缘时,你可能会发现新的边缘连接两个分离的组件,但在这种情况下,你可以通过删除边缘成本最多的边缘来保持分离组件的数量。

所以我认为你的问题的答案是采用最小的生成树并删除X-1最昂贵的链接。对于X = 1来说肯定是这种情况!

答案 4 :(得分:0)

这是尝试解决这个问题......

对于X = 1,我可以使用每个节点的Prim算法计算最小生成树(MST)(此节点是唯一连接到网格的节点)并选择总成本最低的算法

对于X = 2,我在图表旁边创建了额外的节点(电厂节点)。我通过边缘以成本0连接随机节点(例如N0)。我现在确定我有一个电源插头正确(随机节点肯定会在树中的一个,因此整个树将被连接)。现在是迭代部分。我采用其他节点(例如N1)并再次与PP连接,成本优势为0。现在我计算MST。然后用N2,N3代替N1重复这个过程...... 所以我会测试每对[N0,NX]。成本最低的MST获胜。

对于X> 2它与X = 2真的相同,但我必须测试每个(x-1)-tuple连接到PP并计算MST

对于MST,使用x ^ 2我有复杂性(N超过X-1)* x ^ 2 ......相当复杂,但我认为它会给我最优解决方案

你觉得怎么样?

随机节点

编辑我的意思是随机但是FIXED节点

尝试可视化x = 2 (每个描述属于上面的图片)

enter image description here

让这个成为我们的城市,节点A-F是房屋,边缘是未来电缆的候选者(每个都有一些成本)

enter image description here

仅为图像,这可能是解决方案

enter image description here

让绿色的一个成为发电厂,这是如何看待与一棵树的连接

enter image description here

但这种不同的连接实际上是相同的(连接到发电厂(pp)的成本相同,电缆保持不变)。这就是为什么我们可以将其中一个节点设置为pp的固定接触点。我们可以肯定,节点将位于其中一个树中,并且树中的位置无关紧要。

enter image description here

因此,这是我们固定的情况,G为PP。添加零成本的边(B,G)。

enter image description here

现在我正在尝试连接第二个连接PP(A,G,费用0)

enter image description here

现在我从PP计算MST。因为红色边缘是最便宜的(实际上甚至可能具有负成本),是否确定,它们都将在MST中。

enter image description here

因此,当运行MST时,我得到类似的东西。想象一下,将PP和两块MINIMAL COST树分开。这是A和B的最佳解决方案,是与PP的连接。我存储了成本并继续前进。

enter image description here

现在我对B和C连接做同样的事情

enter image description here

我可以得到类似的东西,所以将成本与之前的成本进行比较并选择更好的成本。

这样我必须尝试所有的连接对(B,A)(B,C)(B,D)(B,E)(B,F),最便宜的一对是赢家。

对于X = 3,我只测试其他元组,再次修复一个元组。 (A,B,C)(A,B,D)......(A,C,D)......(A,E,F)

答案 5 :(得分:0)

我刚刚提出了以下简易解决方案:

N - 节点数

C - 直接连接到网格

E - 可用边


1,按成本对所有边缘进行排序

2,重复(N-C)次:

  1. 选择最便宜的边缘
  2. 检查添加此边缘是否会导致已添加边缘的圆圈
  3. 如果没有,请添加此边缘
  4. 3,这就是全部...你将最终得到C个不相交的边集,将每一组连接到网格

答案 6 :(得分:-1)

听起来像着名的旅行推销员问题。已知的问题是NP难。以维基百科为起点:http://en.wikipedia.org/wiki/Travelling_salesman_problem

相关问题