在Python

时间:2016-11-22 22:47:17

标签: python algorithm optimization set-cover

我在python中调用itertools(见下文)。在此代码中,snp_dic是具有整数键并设置为值的字典。这里的目标是找到最小值的键列表,其值的组合是等同于set_union的集合的组合的组合。 (这相当于为那些感兴趣的人解决流行的NP-hard图论问题集的全局最优化)!下面的算法有效,但这里的目标是优化。

我看到的最明显的优化与itertools有关。让我们说长度为r,在snp_dic中存在r个集合,其union = set_union。基本概率规定如果该组合存在并且在组合上随机均匀地分布在某处,则预期平均仅需要迭代才能找到该组覆盖组合。然而,Itertools将返回所有可能的组合,通过在每次迭代时检查,检查set_unions的预期时间的两倍。

逻辑解决方案似乎只是在本地实现itertools.combinations()。基于"等效" python文档中的itertools.combinations()的python实现但是时间大约是两倍慢,因为itertools.combinations调用C级实现而不是python本地实现。

问题(最后)是,我怎样才能逐个传递itertools.combinations()的结果,这样我就可以检查set unions,因为它仍然在python实现的近似等效时间运行itertools.combinations()。在一个答案中,我将不胜感激,如果你可以包括计算新方法的结果,以证明它在与python-native实现类似的时间运行。任何其他优化也表示赞赏。

def min_informative_helper(snp_dic, min, set_union):
    union = lambda set_iterable : reduce(lambda a,b: a|b, set_iterable) #takes the union of sets
    for i in range(min, len(snp_dic)):
       combinations = itertools.combinations(snp_dic, i)
       combinations = [{i:snp_dic[i] for i in combination} for combination in combinations]
       for combination in combinations:
           comb_union = union(combination.values())
           if(comb_union == set_union):
           return combination.keys()

1 个答案:

答案 0 :(得分:2)

itertools 为它返回的东西提供生成器。要流式传输它们,只需使用

即可
for combo in itertools.combinations(snp_dic, i):
    ... remainder of your logic

组合模块每次访问时都会返回一个新元素:每次循环迭代一次。