0
  def pickSubs(self, subjects, maxWork, maxLottery):

    totWork = 0
    totLott = 0
    studentSubs = []
    for s in subjects:
        totWork += s.getWork()
        totLott += s.getLottery()

        if totLott <= maxLottery and totWork <= maxWork:
                studentSubs.append(s)

    return studentSubs 

我正在尝试使用比较器根据不同的因素来决定学生的最佳选择。

我的问题是,如果总工作量和彩票值低于 maxWork、maxLottery,我想附加所有可能的对象“s”,但我没有附加所有可能的组合。我只是追加直到达到最大约束值

如何获得所有可能的组合?

4

1 回答 1

1

这应该可以解决您的问题:

def pickSubs(self, subjects, maxWork, maxLottery):
    from itertools import chain, combinations

    validcombinations = []

    for comb in chain.from_iterable(combinations(subjects, n) 
                                    for n in range(1, len(subjects)+1):
        sumWork = sum(s.getWork() for s in comb)
        sumLottery = sum(s.getLottery() for s in comb)

        if sumWork <= maxWork and sumLottery <= maxLottery:
            validcombinations.append(comb)
    return validcombinations

但是,请注意,这通常会经过一个非常长的列表。如果您实际上是在尝试找到满足这些标准的“最佳”主题选择,我真的建议您看一下PuLP 之类的东西,您可以在其中使用二元选择变量将其设置为整数问题。我认为如何做到这一点需要你问另一个问题。

于 2013-05-28T07:25:11.047 回答