查找满足特定约束的子集

时间:2012-07-04 17:22:54

标签: python boolean subset discrete-mathematics

我有一组变量 S ,以及在 S 上定义的布尔函数 f ,如下所示:

f (x 1 ,x 2 ,... x n )= true iff f (x i ,x j )=真∀1≤i≤ n ∀1≤j≤ n n > 1,否则为假。

f (a,b)已知且 f (a,a)为True∀a,b S

我很感激在设计快速算法方面提供了一些帮助,该算法可以返回 f 返回True的所有 S 子集。

例如,让 S = [a,b,c]和 f (a,b)= f (b, c)= f (a,c)=真。然后该算法应返回[[a,b],[a,c],[b,c],[a,b,c]]。

我想到了四种改进暴力搜索的策略:

1) f 的参数顺序无关紧要。

2)使用 f (a,a)为真且 f (x i ,x j < / sub>)= f (x j ,x i )所以只有i&lt; j需要检查。

2)使用 f (x 1 ,x 2 ,... x n < / em> +1 )= f (x 1 ,x 2 ,... x n )∧( f (x i ,x n +1 ) ∀1≤i≤ n )其中∀表示迭代连接。

3)注意2)暗示如果 f (x 1 ,x 2 ,... x n )返回False,然后 f (x 1 ,x 2 ,... x n )也可以减少解空间。

4)如果 f (x i ,x j )对于某些i,j为假,则返回False。 / p>

如果你想编写一些代码,如果你能在python中给它,我将不胜感激。

非常感谢。

1 个答案:

答案 0 :(得分:5)

双参数函数f(a, b)可以看作S上的对称,自反关系,可以看作是无向图。

如果f(x1, ..., xn)形成一个完整的子图,{x1, ..., xn}为真。

从那里开始,你最终到了clique problem,遗憾的是,这是NP完全的。换句话说,快速算法不太可能存在。