如何在某些条件下将集合划分为给定数量的不相交子集?


11

给我一个集合,一个整数,和一个非负整数a_ {ij}。我的问题是要找到小号不相交的子集S_j\ {1,\ ldots,K \}这样的:{ 1 ... ķ } A{1,,k}小号ķ sk一个Ĵaij小号s小号ĴSj { 1 ... ķ }{1,,k}

  1. 小号Ĵ = 1个小号Ĵ = sj=1Sj=A ; 和
  2. | 小号Ĵ | 一个Ĵ| 小号Ĵ| Ĵ对于S_j中的所有i \,小号Ĵ小号Ĵ并且j = 1 sj = 1 s

如何解决这个问题呢?找到可行的解决方案难吗?

我认为解决这个问题并不容易,因为我尝试了一些以j \ in \ {1,\ ldots,n \}开头的过程,Ĵ { 1 ... ñ }Ĵ { 1 ... ñ }并分配{ 1 ... ķ }{ 1 ... ķ }直到数字的一世一世分配给ĴĴ是大于一个Ĵ一种Ĵ一些一世一世分配。但是,这是不正确的,因为我可以留下一些一世一世不能被分配给任何ĴĴ(因为他们的一个Ĵ一种Ĵ可能被不满意)。

当我必须生成A的所有子集一种一种并测试每个子集时,蛮力方法对我有用(k = 8 n = 3k = 8 n = 3),但是效率很低。


检查编辑是否与您要提出的问题相对应。另外,一个最大一种最大值来自哪里?这是一个固定常数(不是输入的一部分,而是一直固定的),还是输入的一部分?最后,您在寻找实用的解决方案吗?还是您正在寻找该问题的理论复杂性?如果是前者,您是否尝试过使用整数线性编程?
DW

Answers:


10

通过减少“顶点覆盖”可以解决此问题。

在“顶点覆盖”问题中,我们得到一个图形和一个数,并且我们的任务是确定是否存在从到最多个顶点的某个子集,从而使中的每个边都入射在中至少一个顶点上。(等效地:是否可以通过删除最多个顶点来杀死的每个边?)G = V E r U r V E U G rG = VE[Rü[RVËüG[R

首先,将划分为不相交的子集等效于将每个元素分配为可能的标签中的一个。减少的基本思想是建立标签为每个顶点在,和“允许”仅被分配对应于它的端点两个标签中的一个的每个边缘,在下面的意义:分配相应的边缘标签没有对其他可以分配相同标签的边引入(真正的)约束,而将边分配给不对应的标签则可以防止其他边被分配相同的标签-当然,这样做可以提高数字需要不同的标签。小号小号小号Ĵ v Ĵ V一种s一种s小号ĴvĴV

从Vertex Cover 实例构造问题的实例:A a s G r A a s G r

  1. 将设置为,并创建一个元件在对于每个边缘在。(可以将这些对视为整数;它们之间的任何双射都可以。)k | E | i j A v i v j E 1 kķ| Ë|i j 一种v一世vĴË1 k
  2. 将为如果或 ; 否则,将为1。a b c d | E | d = b d = c一种(b,c),d|E|d=bd=c a b c da(b,c),d
  3. 设置。s = rs=r

如果是顶点覆盖的YES实例,那么很容易看到问题的刚刚构造的实例也是YES实例:只需在任何解决方案选择与顶点对应的标签,并为每个边分配相应的元素以选择标签或之一为准(如果同时选择了两个标签,则任意选择)。此解决方案使用子集,并且有效,因为有效的唯一是对应于g ^ - [R š Ĵ v Ĵ ü v b v Çë b c ^ 小号b 小号Ç小号一个Ĵ | E |(G,r)SjvjUvbvcEb c ASbSCsaĴ标签,具有(|非)防止超过边缘被分配了相同的标签。|E|

仍有待证明,问题的YES实例表示原始是“顶点覆盖”的YES实例。这是稍微更复杂的,因为一个有效的解决方案到一般可以分配一个边缘一个 -对应标签,即,这意味着我们不能不一定是“读出”有效的顶点覆盖从一个有效的解决方案。X = 小号g ^ - [R ÿ X Ĵ 小号{ ĴX= A a s G r ÿXi j S } û ÿm{i,j}UY

但是,分配不对应的标签的成本很高,严重地限制了解决方案的结构:每当分配一条边这样的标签,,事实那确保了它必须是唯一分配了该标签边缘。因此,在包含这样的非对应标记的边任何解决方案中,我们都可以按如下方式构造替代解决方案:Ĵ 小号{ Ĵ } 一个Ĵ = 1 Ý Ĵ 小号ÿ '(i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. 任意选择新标签的是要么或。小号ŽĴ Sz(i,j) S i S jSiSj
  2. 分配这个新标签。如果这导致无效的解决方案,那一定是因为恰好另一个边缘,已被分配了标签。在这种情况下,设置并转到步骤1。Ĵ 'Ĵ 'Ž { 'Ĵ ' } 小号ŽĴ = 'Ĵ '(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

上面的算法必须以以下两种方式之一终止:找到没有引入矛盾的新标签,或者找到完整的顶点循环。在前一种情况下,找到具有集合的有效新解,而在后一种情况下,找到具有集合的有效新解;无论哪种方式,我们都构建了一个有效的新解决方案,并将至少一个以上的边分配给相应的标签。最多重复整个过程之后次,我们将产生一个有效的解决方案,从中可以读取原始Vertex Cover问题的解决方案。S z s - 1 sSzs1s| E | Ÿ | Ë|ÿ

这种构造显然是多项式时间,因此得出的问题是NP难的。


谢谢您的帮助。您是否知道如何解决(近似)这一问题?(例如,例如,我可以使用技术解决顶点覆盖问题吗?)我尝试了一些贪婪的方法,但有时无法输出可行的解决方案。(我选择的方法使贪婪方法在可能存在解决方案的地方失败。)小号Ĵ小号Ĵ
drzbir

好吧,可以预料的是,贪婪的方法有时将无法输出可行的解决方案,因为如果总是这样,那么您将在多重时间解决NP难题;-)请记住,如果不能做到,那就不一定是错误的寻找解决方案:很可能不存在可行的解决方案。
j_random_hacker 2016年

关于解决方案技术,我喜欢的一种称为波束搜索。这基本上是一种分支绑定的方法,它“忘记”足够糟糕的部分解决方案以限制其内存使用量。(B&B本身是一种很好的方法,有时可以快速解决问题,它比波束搜索要简单一些,因此值得一试-但由于它是一种精确的方法,因此在某些情况下当然要花费数千年。)
j_random_hacker

(以下所有内容同样适用于波束搜索以及B&B。)B&B是一项非常通用的技术。关键是要利用问题的具体情况来组织您做出的决策,以便尽可能早地在搜索树中做出错误的决策(即不会导致可行解决方案的决策)。(这些决定将进行的地方,每深入一层,他们得到由双打的数量,他们获得制造)。对于你的问题,我建议先居元素一个在降低“坏”,这里的秩序。 ..A
j_random_hacker

...元素的捣蛋可能是,例如,最小的一个Ĵ在所有iaij j上的最小值,以第二个最小值,然后是第三个最小值的比例断开联系,等等。大致而言,“最差”元素是最严格地约束添加到其中的任何集合。在搜索树中深度为 d的每个节点上,您将拥有部分解决方案,其中第一个(因此也是“最差”) d个元素已分配给集合;您将需要选择 n个集合中的哪一个来将第d + 1 个元素分配给:也就是说,您最多需要 n个j递归调用。(“最多”,因为希望我们拥有...
j_random_hacker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.