python - 查找满足特定约束的子集

标签 python boolean subset discrete-mathematics

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

f(x1, x2, ... xn) = True iff f(xi, xj) = True ∀ 1 ≤ i ≤ n ∀ 1 ≤ j ≤ nn> 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/

相关文章:

python - 在 Python 中从一组数字创建 "slice notation"样式列表

python - 如何在 Bigquery Python API 中使用projection_fields参数

python - 我是否过度生成了 IO 绑定(bind)的网络抓取线程?

mysql - Rails boolean 值 - True 和 False 与 1 和 0

objective-c - 初始化 boolean 数组 - 返回 null

r - 用函数子集向量的每个级别并返回一个新的数据帧(在 R 中)

python - Spyder-IDE 如何打开参数检查

python - 使用正则表达式提取 url

java - 如何在数组列表中添加选定的值并从数组列表中删除未选定的值

R:根据一天中的时间有效地对数据框进行子集化