Получение всевозможных комбинаций при максимальном ограничении

  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, но я не добавляю все возможные комбинации. Я просто добавляю, пока не достигну максимального значения ограничения

Как я могу получить все возможные комбинации?

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, где вы можете установить это как целочисленную задачу, используя переменные двоичного выбора. Я думаю, что для этого потребуется задать еще один вопрос.

Другие вопросы по тегам