我给出了一个包含许多单独组件的图表。每个组件都是二分的。如何将顶点分布为两组A
和B
,以使两组之间的差异最小?
示例:
1:1 -> 2 ->3 -> 4 -> 5
2:6 -> 7 -> 8
最佳解决方案是
A = {1, 3, 5, 7}
B = {2, 4 ,6, 8}
另一个(非最佳)解决方案是
A = {1, 3, 5, 6, 8}
B = {2, 4, 7}
当图表有许多单独的二分组件时,你如何解决这个问题?
答案 0 :(得分:3)
这是Partition Problem,略带伪装。对于每个二分组件,取独立集中元素数量的差异(实际上,它是绝对值。)这是分区问题的输入。对于你的例子,它将是[1,1](从(3-2)和(2-1)。)
现在将解决方案转换回图表。对于编号以集合S1结尾的每个图表,将其较大的集合放在A
(以及B
中的较小集合)中,对于编号以S2结尾的每个图表,将其较小的集合放在{{1}中}(和A
中的较大者。)在您的示例中,解决方案是S1 = [1]和S2 = [1]。回到关联的图表,您可以从示例中获得最佳解决方案。
答案 1 :(得分:2)
这是分区问题的变体,它是NP完成的。
对于每个组件,找到两边的顶点数,比如[m,n],然后你必须决定是将m放在池A还是池B中,这样池A中术语总和之间的差异并且在B池中是最小的。
现有技术通过动态编程以及IPP的变化来解决这类问题。但是,如果有大量的组件,那么你就会注定NP的完整性。