假设我有一组N个自然数和N个子集(S1,S2,...... Sn)。我想生成2个子集D1和D2(D1 + D2 = S,D1和D2没有公共元素),因此D1和D2不包含任何N个子集。
快速举例:
S = 1 2 3 4 5
S1 = 1 4
S2 = 1 2
S3 = 1 2 3
S4 = 1 2 3 4
S5 = 1 2 4
D1 = 1 3 5
D2 = 2 4
我的第一个想法是粒子占据的位置将描述元素的选择方式(假设位置是具有N个BYTE元素的数组,如果position [i]是1,则设置[i]在D1中,在D2中为2,使其变得简单)。
解决方案的适用性可以是N--解决方案中包含的初始子集的数量。
但速度会是什么?我无法弄清楚这一部分这一事实让我觉得我可能需要以另一种方式表达立场,但同样,我找不到会使情况过于复杂的事情。
我对理论答案更感兴趣。我应该以何种方式表示数据及其原因。
我是这个PSO的新手,所以对这个主题的任何好读(初级水平)都表示赞赏。
答案 0 :(得分:1)
正如amit建议的那样,这实际上是NP难题。给定CNF公式,让S与所有文字的集合(正面和负面)以及一个额外的对T和F一一对应。创建一个集合{T,F}。为每个变量设置一个包含该变量的正面和负面文字的两元素集,以便一个用T共享一个集合,另一个用F共享。对于析取的每个子句,用它的文字和F创建一个集合。 CNF-SAT实例的解决方案和这个问题的实例是一一对应的,通过为与T共享集合的所有文字赋值为真。
如果你想解决这个问题,我会建议一个SAT求解器,因为在CNF中表达它并不难。如果您想了解粒子群优化,我建议使用连续的解空间来解决另一个问题。