设置封面:生成测试实例

时间:2017-05-27 14:19:06

标签: python set genetic-algorithm set-cover

我期待使用遗传算法解决Set Cover Problem问题。我一直在寻找一些好的测试实例,但没有取得任何重大成功。

我正在寻找的是形式下的一些实例:集合U = {1,2,...,n}及其子集的集合S = {{1,2},{ 4},{3,4,5}},其中S的联合是U。

当然,这是一个小例子,因为我想找到更大的实例。

那么,有没有人知道这种情况的良好来源,或者可能是关于产生它们的方法?

稍后编辑:所以我看到问题已被搁置。那时我不好,我会补充一点细节。

首先,我搜索了一些有关集合覆盖问题的测试实例。我期待找到的是一些像我上面描述的那样的例子。运气好,我发现了与this类似的东西。我必须说,链接中没有那么多细节借给我这些实例。

所以我开始思考一种生成它们的方法。一种伪编码解决方案:

given set G=[1,2....,n]
no_of_subsets  = random integer
subsets = []
for i in k: 
    subset = random.sample(G, random(0, len(G))
    subsets.add(subset)

虽然我不确定union(子集)是否为G,所以我怀疑的地方就是这样,这就是为什么我需要一些已经生成的测试实例。

1 个答案:

答案 0 :(得分:0)

您可以生成一个从可能数字列表中获取随机样本的集合。并且他们还通过获取具有随机大小的随机样本来生成其子集的列表(具有预定大小),并且对于最后一个子集,您只需完成缺失的内容,因此子集的总和将是整个集合。

示例:

import random

n = 100
m = 10 #size of set
l = 5 #size of list of subsets
possible_numbers = range(n)

U = set(random.sample(possible_numbers, m))

subsets = []
control = set()
for i in range(l - 1):
    sub_size = random.randrange(m)
    sub = set(random.sample(U, sub_size))
    subsets += [sub]
    control |= sub

rest = U - control     
if rest:
    subsets += [rest]

print(U)
--> {97, 99, 69, 9, 15, 52, 53, 55, 28, 30}

print(subsets)
--> [{28, 52, 69, 55}, {69}, {99, 28, 52, 55}, {69, 9, 15, 52, 53, 55}, {97, 30}]