我有一组变量S,以及一个在S 上定义的 boolean 函数f,如下所示:
f(x1, x2, ... xn) = True iff f(xi, xj) = True ∀ 1 ≤ i ≤ n ∀ 1 ≤ j ≤ n,n> 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) = 真。然后算法应该返回 [[a, b], [a, c], [b, c], [a, b, c]]。
我想到了四种改进暴力搜索的策略:
1) f 的参数顺序无关紧要。
2) 使用 f(a, a) 为真且 f(xi, xj) = f(xj, xi) 所以只有 i < j 需要检查。
2) 使用 f(x1, x2, ... xn+1) = f(x1, x2, ... x n) ∧ (f(xi, xn+1) ∀ 1 ≤ i ≤ n) 其中∀表示迭代连词。
3) 注意 2) 意味着如果 f(x1, x2, ... xn) 返回 False,然后 f(x1, x2, ... xn+Δ) 也一样,可能会减少解决方案空间。
4) 一旦 f(xi, xj) 对于某些 i, j 为假,就立即返回 False。
如果你想写一些代码,如果你能用python给出,我将不胜感激。
非常感谢。
最佳答案
双参数函数f(a, b)
可以看作是S上的对称自反关系,可以看作是无向图。
这样看来,f(x1, ..., xn)
为真当且仅当 {x1, ..., xn}
形成一个完整的子图。
从那里,您最终会到达 clique problem不幸的是,结果证明它是 NP 完全的。换句话说,不太可能存在快速算法。
关于python - 查找满足特定约束的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333277/