图中具有多个“必须拥有”节点的最短路径

时间:2016-07-22 23:25:53

标签: algorithm graph graph-algorithm

我有一个图表(~250个节点)。要连接到节点,我必须使用Points - >加权图来购买它。 总是有节点(“声称的节点”)和我可以开始连接到其他节点的节点。此外,我的积分数量有限。所有节点都可以连接在一起。

有什么方法可以获得一个图表,其中所有必须有节点连接在一起,点数最少?如果可能的话,给定最大分数。

第二)有没有必要完全连接图的方法?例如:一个“必须具有节点”的节点直接连接到“声明的节点”,因此获得它的最便宜的方法就是获取必须拥有的节点,而不是将其与剩余的图形连接。

编辑(关于前三个问题):我必须购买Node本身,而不是Connection。所以,我不计算旅行距离,而是计算节点成本。例如:如果我有一个从A到B的图,B到C和A到C和B是一个“必须拥有节点”我可以从A到B“行进”,然后从B到A,从A到C(如果是比B到C更短,因为从B到A没有额外费用,因为B已经声明了。

我提出了这个算法: 我确实制作了一个包含所有“必须有节点”的表,并从其中一个开始。我使用呼吸优先搜索或深度优先搜索(什么会更好?)并让它分支,只要它找不到“必须有节点”,并且 - 如果需要 - 将更新最短距离。当它找到“必须有节点”时,它结束这个分支并存储它的路径。距离将在表格中注册。只要发现没有“必须拥有节点”,它就会运行。当它完成后,我将继续在表中继续下一个“必须有节点”,做同样的事情并建立表格 当我完成所有节点后,我将在表上运行最小生成树算法,并且应该得到我的最佳图。

任何人确实发现此问题?

2 个答案:

答案 0 :(得分:2)

您的问题与Node Weighted Steiner Tree相对应。
(tinLoaf的链接是边加权版本,这是Steiner Tree的默认版本。)


节点加权Steiner树 - >你的问题:
如果S为空,那么空子图是一个解,否则让S的任何一个元素成为
唯一声明的节点,让“必须有”节点成为S的其他元素。

你的问题 - >节点加权Steiner树:
如果你的意思是声明的节点也需要相互连接,那么这些节点和必备节点之间没有区别,所以让S成为[声明的节点集合]的联合
[必备节点集]。如果您的意思是每个必备节点只需要连接到至少一个声明的节点,那么collapse声明的节点就会相互连接
并且让S成为{outcome_node}与[必须拥有的“节点集合]的联合。



请注意the uni-bonn link(从此答案的开头)
至少有一个关于近似的错误结果 -
实际的主要积极结果是“The node weighted Steiner tree problem can
be approximated to a factor of ​ 1.35 (1+epsilon') ln k ​ for any ​ epsilon' > 0 .“ (他们遗漏了1 + epsilon'因素。)

此外,单一链接的近似硬度参考在这方面没有任何说法,
虽然结果已知 - 它至少as hard to近似as set cover


parameterized乘以[解决方案中既没有声明也不必要的节点数]时,
套装的减少仍然适用,所以如果这个数字很小那么你就是
在最坏的情况下,你不可能做得比蛮力更好。
我没有找到适用于参数化复杂性的任何其他适用的东西
当按终端数量参数化时, edge - 加权Steiner树is known toFPT

答案 1 :(得分:1)

这看起来像Steiner树问题[0],它是NP难的,但可以解决250个节点。我想你可以这样改变它:

  • 插入虚拟根顶点
  • 将其连接到每个"声明的顶点"通过权重为0的边缘 - 现在所有的"声明的顶点"可以使用权重0
  • 连接到树(即要构建)
  • 解决"广义Steiner树问题" [0]其中"的集合必须有节点"在维基百科描述中形成集合S.

如果你可以使用近似解决方案:对于steiner树问题有一些近似值(维基百科的文章也应该提到)。

[0] https://en.wikipedia.org/wiki/Steiner_tree_problem#Generalization_of_minimum_Steiner_tree