Algorithm 选择大多数不重叠的元素,以使其大小之和最大化

Algorithm 选择大多数不重叠的元素,以使其大小之和最大化,algorithm,dynamic-programming,combinatorics,network-flow,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 给定一个对象及其

我正试图找到一个解决以下问题的算法

假设我有很多对象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的速度非常慢。寻找其他优雅的方法来解决它。我可以把它转换成网络吗?然后用最大流算法求解?还是动态程序?被困在如何着手解决这个问题上。

你可以把这个问题简化为NP难的问题

构建一个图形,使每个组合都是一个顶点,其权重等于该组合的长度,如果相应的组合不共享任何对象(即,如果可以同时拾取它们),则连接顶点。然后,一个解是有效的当且仅当它是该图中的一个团


在谷歌上进行简单的搜索,就可以找到很多近似算法来解决这个问题,比如。

我第一次试图证明这个问题是NP难的,这是错误的,因为它没有考虑到只有大小2或4的组合才被允许。然而,使用reducefrom(3DM),我们可以证明这个问题仍然是NP难的

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

给定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实例的答案为“是”,即T中至少有k个不重叠的三元组。然后,该解决方案中的k个三元组中的每个对应于问题输入C中的4个组合,并且这4个组合中没有两个重叠,因为通过构造,它们的第4个元素都是不同的,并假设。因此,在您的问题实例中至少有m=k个非重叠的4个组合,因此该问题的解决方案也必须是“是”

在另一个方向上,假设问题构造实例的解决方案为“是”,即C中至少有m个不重叠的4-组合。我们可以简单地取每个4-组合的前3个元素(扔掉第4个),以生成T中的一组k=m个不重叠的三元组,因此,原始3DM实例的答案也必须是“是”


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

“CEGH,组合的长度。”​ -> ​ “CEGH,组合的长度是4。”​ ​ ​ ? ​ ​ ​ ​ ​ ​ ​ ​考虑[[x和y相邻] ]给出的对象上的无向图,当且仅当[XY是至少一个有效组合的子集]时。​ (您只需通过有效组合进行一次操作即可构建该图。)​ 那个图是连通的吗?​ 如果不是,那么您可以轻松地将问题分解为严格更小的不相交子问题。​ ​ ​ ​如果已连接,则计算顶点容量,如下所示:​ 日志(1+对象所在的有效组合数)​ 和e