我有一个图表(~250个节点)。要连接到节点,我必须使用Points - >加权图来购买它。 总是有节点(“声称的节点”)和我可以开始连接到其他节点的节点。此外,我的积分数量有限。所有节点都可以连接在一起。
有什么方法可以获得一个图表,其中所有必须有节点连接在一起,点数最少?如果可能的话,给定最大分数。
第二)有没有必要完全连接图的方法?例如:一个“必须具有节点”的节点直接连接到“声明的节点”,因此获得它的最便宜的方法就是获取必须拥有的节点,而不是将其与剩余的图形连接。
编辑(关于前三个问题):我必须购买Node本身,而不是Connection。所以,我不计算旅行距离,而是计算节点成本。例如:如果我有一个从A到B的图,B到C和A到C和B是一个“必须拥有节点”我可以从A到B“行进”,然后从B到A,从A到C(如果是比B到C更短,因为从B到A没有额外费用,因为B已经声明了。
我提出了这个算法: 我确实制作了一个包含所有“必须有节点”的表,并从其中一个开始。我使用呼吸优先搜索或深度优先搜索(什么会更好?)并让它分支,只要它找不到“必须有节点”,并且 - 如果需要 - 将更新最短距离。当它找到“必须有节点”时,它结束这个分支并存储它的路径。距离将在表格中注册。只要发现没有“必须拥有节点”,它就会运行。当它完成后,我将继续在表中继续下一个“必须有节点”,做同样的事情并建立表格 当我完成所有节点后,我将在表上运行最小生成树算法,并且应该得到我的最佳图。
任何人确实发现此问题?
答案 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 to为FPT。
答案 1 :(得分:1)
这看起来像Steiner树问题[0],它是NP难的,但可以解决250个节点。我想你可以这样改变它:
如果你可以使用近似解决方案:对于steiner树问题有一些近似值(维基百科的文章也应该提到)。
[0] https://en.wikipedia.org/wiki/Steiner_tree_problem#Generalization_of_minimum_Steiner_tree