使用最少数量的组件形成节点集

时间:2014-07-20 13:55:12

标签: python algorithm graph graph-theory

我有一个n个节点的图表。我得到了图的k个分区,每个分区包含m1,m2 ... mk节点。

我想从组件中找到一个子集,以便这些子集中的节点联合给出图的节点集。在这样做时,我想确保使用所需的最少数量的组件。我正在使用节点集和组件的python列表。让我举个例子:

node set - [49,57,3,95,98,100,44,40]
components - [57, 49, 100, 44], [57, 3, 95, 44], [3, 95, 44], [95, 44], [98, 44], [100, 44], [44], [40]

所以,如果我选择组件[49, 100, 44], [57, 3, 95, 44] and [98, 44]。这些集合的联合给了我节点集。我也可以选择其他4种或更多组件的组合,但这是不可取的。 请有人帮忙! 感谢

编辑 - 我尝试解决的原始问题有以下限制:

  1. 每个节点都根据其相关性进行编号*
  2. 组件中连续节点的相关性之间的差异应该大于给定值。 (节点的顺序很重要,在下一点提到)
  3. 组件中节点的顺序应与原始节点集中的顺序相同。

1 个答案:

答案 0 :(得分:2)

这个答案是基于你的“分区”或“组件”可以是节点集的任意子集的假设,因此你的问题是set cover的优化形式,这是一个已知的NP难问题。对子集的任何约束都可能使它更容易处理,所以请将它们添加到问题中。

对于任何NP难问题,没有已知的多项式时间精确算法,除非P==NP,否则不能存在。

你基本上有两种选择,蛮力和近似。蛮力可能适用于小型子集,只需尝试所有可能的解决方案,从最小的子集开始,直到找到封面。

您的示例有8个子集,因此有8个大小为1的候选解,(8 * 7)/(2!)= 28个大小为2的候选,并且(8 * 7 * 6)/(3!)= 56个大小为3的候选者。由于存在大小为3的解,因此算法停在那里。这是非常可行的计算。您可以通过存储N个子集的联合来节省一些时间,并使用它们来计算N + 1个子集的联合。

正如对于NP难问题的精确解决方案所期望的那样,时间随着问题规模呈指数级增长,因此它无法扩展到更大的问题。

或者,参考文章包含贪心近似算法。如果这些想法都不适合您,请考虑使用限制可接受方法的任何术语搜索“set cover”。