ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 按照产品顺序获取列表的每个可能子集的算法,无需构建和排序整个列表(即生成器)

2019-06-21 14:45:01  阅读:281  来源: 互联网

标签:python generator dynamic-programming knapsack-problem powerset


实际上,我有一组具有概率的对象,我想看看它们中的每一个可能的组,按照它们是否可能的假设它们是独立的可能性 – 即按照从的顺序降序子集元素的乘积 – 或者如果概率相同则按长度顺序(使得(1,0.5)在(0.5)之后).

示例:如果我有[1,0.5,0.1]我想要[(),(1),(0.5),(1,0.5),(0.1),(1,0.1),(0.5,0.1),(1) ,0.5,0.1)]

本质上,这意味着我想按顺序迭代一组元素的powerset,我可以相当容易地生成它,对它进行排序,并完成.然而,powersets变得非常快,我希望我通常会想要第一个子集中的一个,而我宁愿不生成数千个子集的列表,对它们进行排序,然后再也不会超过第三个子集.这就是python生成器希望挽救这一天的地方!

更正式的问题说明,我需要找出一种方法来排序(powerset(输入),key = lambda l:reduce(lambda(p,n),e:(p * e,n-1),l ,(1,0)),reverse = True),作为生成器,或以其他方式让我避免构建和排序整个列表.

我有理由相信这与背包问题以及子集产品问题有关,但我真的很难为它获得一个很好的算法,并且非常感谢帮助:-).这不是一个问题,因为它比在最坏的情况下构建排序整个过程要慢(迭代一直到最后),它只需要更好的最佳情况(在前10%,比如说)性能.

解决方法:

好问题,解决起来相当棘手.我想不出按顺序生成组合的方法,但是我使用强大的heapq(也就是优先级队列)来保持候选者的排序.

from heapq import heappush, heappop
import operator

def prob(ps):
    """ returns the probability that *not* all ps are True """
    return 1-reduce(operator.mul, ps)

def gen(ps):
    # turn each to a tuple
    items = ((x,) for x in sorted(ps, reverse=True))

    # create a priority queue, sorted by probability
    pq = [(prob(x),x) for x in items]

    # because you wanted this
    yield ()

    # as long as there are valid combinations
    while pq:
        # get the best un-yielded combination, the pq makes sure of that
        p, x = heappop(pq)
        yield x

        # generate all the combinations from this item
        for other in ps:

            # keeping the tuples sorted -> unique combinations
            if other < x[-1]:

                # create a new combination
                new = x+(other,)
                item = prob(new), new

                # add it to the queue
                heappush(pq,item)


a = [1, 0.1, 0.5] 
print list(gen(a))

标签:python,generator,dynamic-programming,knapsack-problem,powerset
来源: https://codeday.me/bug/20190621/1255823.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有