查找满足特定约束的子集

use*_*040 1 python boolean subset discrete-mathematics

我有一组变量S,并在S上定义了一个布尔函数f,如下所示:

˚F(X 1,X 2,... X Ñ)= TRUE当且仅当˚F(X ,X Ĵ)= TRUE∀1≤I≤ Ñ ∀1≤Ĵ≤ Ñ,Ñ > 1,否则为False.

f(a,b)是已知的,f(a,a)是S中的真∀a,b .

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

例如,令S = [a,b,c]和f(a,b)= f(b,c)= f(a,c)= True.然后该算法应返回[[a,b],[a,c],[b,c],[a,b,c]].

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

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

2)使用f(a,a)为真且f(x i,x j)= f(x j,x i)的事实,因此只有i <j需要检查.

2)使用f(x 1,x 2,... x n +1)= f(x 1,x 2,... x n)∧(f(x i,x n +1)∀的事实1≤I≤ ñ)其中∀表示迭代结合.

3)注意2)暗示如果f(x 1,x 2,... x n)返回False,那么f(x 1,x 2,... x n)也会这样做,可能会减少解空间.

4)对于某些i,j ,f(x i,x j)为假时尽快返回False .

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

非常感谢.

Tho*_*mas 5

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

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

从那里开始,你最终会遇到集团问题,不幸的是,这个问题最终证明是NP完全的.换句话说,快速算法不太可能存在.