我想解决以下类型的最小集覆盖问题。所有列表仅包含 1 和 0。
我说如果您可以通过准确插入符号 来制作列表,则列表A
涵盖了列表。B
B
A
x
考虑所有 2^n 个长度为 1 和 0 的列表n
和 set x = n/3
。2n/3
我会计算一组涵盖所有内容 的最小长度列表。
这是我开始的一种天真的方法。对于每个可能的长度列表,2n/3
我创建了一组可以使用此函数(由 DSM 编写)从中创建的所有列表。
from itertools import product, combinations
def all_fill(source, num):
output_len = len(source) + num
for where in combinations(range(output_len), len(source)):
# start with every possibility
poss = [[0,1]] * output_len
# impose the source list
for w, s in zip(where, source):
poss[w] = [s]
# yield every remaining possibility
for tup in product(*poss):
yield tup
n = 6
然后,我使用以下示例创建集合集。
n = 6
shortn = 2*n/3
x = n/3
coversets=set()
for seq in product([0,1], repeat = shortn):
coversets.add(frozenset(all_fill(seq,x)))
我想从联合为allset = set(product([0,1], repeat=n))
.
在这种情况下,set(all_fill([1,1,1,1],2)), set(all_fill([0,0,0,0],2)), set(all_fill([1,1,0,0],2)), set(all_fill([0,0,1,1],2))
会做。
我的目标是解决问题n = 12
。如果有帮助的话,我很乐意使用外部库,我希望在n
最坏的情况下时间会成倍增长。