选择大多数不重叠的元素,以便最大化它们的大小总和

时间:2017-02-02 20:35:35

标签: algorithm dynamic-programming combinatorics network-flow

我试图找到解决以下问题的算法。

说我有许多对象A,B,C,......

我有这些对象的有效组合列表。每种组合的长度为2或4。

例如。 AF,CE,CEGH,ADFG,......等等。

对于两个对象的组合,例如。 AF,组合的长度为2.对于四个对象的组合,例如CEGH,组合的长度。

我只能选择不重叠的组合,即我不能选择AF和ADFG,因为它们都需要对象' A'和' F'。我可以选择AF和CEGH组合,因为它们不需要普通对象。 如果我的解决方案只包含两个组合AF和CEGH,那么我的目标是组合长度的总和,即2 + 4 = 6.

给定一个对象列表及其有效组合,如何选择彼此不重叠的最有效组合,以便最大化组合长度的总和?我不想将其表述为IP,因为我正在处理具有180个对象和1000万个有效组合的问题实例,并且使用CPLEX解决IP的速度非常慢。寻找一些其他优雅的方法来解决它。我可以将其转换为网络吗?并使用max-flow算法解决它?还是一个动态程序?坚持如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

你可以将这个问题减少到maximum weighted clique problem,遗憾的是,这是NP难的。

构建一个图形,使每个组合都是一个重量等于组合长度的顶点,如果相应的组合不共享任何对象(即如果你可以同时选择它们),则连接顶点。然后,当且仅当它是该图中的派系时,解决方案才有效。

谷歌上的简单搜索为这个问题带来了很多近似算法,例如this one

答案 1 :(得分:0)

我第一次尝试将此问题显示为NP-hard是错误的,因为它没有考虑到只允许组合2或4的事实。但是,使用Jim D.'s suggestion3-dimensional matching(3DM)减少,我们可以证明问题仍然是NP难的。

我将展示你的问题的自然决策问题形式("给定一组O对象,以及来自O的2或4个对象的组合C和整数m,是否存在C的子集D,使得D中的所有集合成对不相交,并且D中所有集合的并集具有至少m的大小?并且#34;)是NP难的。显然,优化问题(即您的原始问题,我们寻求最大化m的组合的实际子集)至少与此问题一样困难。 (要看到优化问题不是决策问题,请注意,您可以首先使用m上的二进制搜索找到解决方案所存在的最大m值,您可以在其中解决决策问题在每个步骤中出现问题,然后,一旦找到这个最大m值,就解决了一系列决策问题,其中每个组合依次被删除:如果删除某个特定组合后的解决方案仍然是"是" ,然后它也可能被排除在所有未来的问题实例之外,而如果解决方案变为" NO",则有必要将此组合保留在解决方案中。)

给定3DM的实例(X,Y,Z,T,k),其中X,Y和Z是彼此成对不相交的集合,T是X * Y * Z的子集(即,一组有序三元组分别有来自X,Y和Z的第一,第二和第三个成分)并且k是一个整数,我们的任务是确定是否存在任何T的子集U,使得| U | > = k并且U中的所有三元组是成对不相交的(即,回答问题," T中是否存在至少k个非重叠三元组?")。要将任何此类3DM实例转换为您的问题实例,我们需要做的就是从T中的每个三元组创建一个新的4组合,方法是为每个三元组添加一个不同的虚拟值。构造的问题实例中的对象集将包含X,Y,Z和| T |的并集我们创建的虚拟值。最后,将m设置为k。

假设原始3DM实例的答案为" YES",即T中至少有k个非重叠三元组。那么这种解决方案中的每个k三元组对应于4 - 在输入C中组合你的问题,并且这四个组合中没有两个重叠,因为通过构造,它们的第四个元素都是不同的,并且通过假设。因此,在您的问题实例中至少有m = k个非重叠的4组合,因此该问题的解决方案也必须是"是"。

在另一个方向,假设您构造的问题实例的解决方案是"是",即在C中至少有m个非重叠的4组合。我们可以简单地采用4个组合中的每一个的前3个元素(丢掉第四个)在T中产生一组k = m个非重叠三元组,因此原始3DM实例的答案也必须是“#34;是”"

我们已经证明,对一个问题的肯定答案意味着对另一个问题的答案是肯定的,因此对一个问题的否定答案意味着对另一个问题没有答案。因此问题是等价的。您的问题的实例可以明确地在多项式时间和空间中构建。因此,你的问题是NP难的。