Борьба с логикой, лежащей в основе алгоритма тройного набора мощности - PullRequest
0 голосов
/ 24 октября 2018

Я беру 6.00.2х, и это одна из первых проблем, которая возникла.Мгновенно тупой отстой, но я пытаюсь справиться с этим.По сути, я делаю набор мощности для решения проблемы с рюкзаком, но вместо одной сумки есть две.Был предоставлен образец для решения этой проблемы с одной сумкой, и мне потребовалось некоторое время, чтобы выяснить:

def powerSet(items):
    N = len(items)
    for i in range(2**N):
        combo = []
        for j in range(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo

Так что я понимаю, что это смотрит на двоичное представление того, какой цикл происходит, и проверяет правильность-много бит, чтобы увидеть, если это 1. Это работает так же, как отображение всех 1 в двоичных представлениях от 0 до (2 ^ n - 1) к вашему исходному набору, но отчасти наоборот.Вот как я это увидел.

Теперь я понял, что версия этого с другой сумкой будет рассматривать 3 ^ n возможностей.Однако, кроме этого, я не вижу, как преобразовать этот пример кода в обновленную версию, потому что я не знаю, как преобразовать i в тройной (0, 1 и 2), о котором я знаю.Вот спецификации для функции, которую я должен делать:

def yieldAllCombos(items):
"""
  Generates all combinations of N items into two bags, whereby each 
  item is in one or zero bags.

  Yields a tuple, (bag1, bag2), where each bag is represented as 
  a list of which item(s) are in each bag.
"""

Я не ищу кого-то, кто бы просто написал решение для меня (у меня уже есть ответ), мне нужна помощьс логикой.Я знаю, что "магия" заключается в преобразовании строки if (i >> j) % 2 == 1: из примера кода, но я не уверен, как это сделать.Сначала я подумал, что могу предположить, что если бы самый правый бит был 0, соответствующий элемент был бы в сумке 1, а если бы это был 1, он был бы в сумке 2, но это не покрывает случаи, когдани в одной сумке!

Я также подумал, что в конечном итоге каждая сумка будет иметь одинаковый точный набор мощности, но это кажется чрезмерным упрощением.Я даже не уверен, как нарисовать дерево для возможностей, учитывая, что элемент может быть либо в сумке 1 / не в сумке 1, либо в сумке 2 / не в сумке 2.

Извините, что это былотак долго с небольшой работой.У меня явно много затяжных вопросов по этому поводу.Если бы кто-нибудь мог ELI5 помочь мне пройти через это, я был бы очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...