Как я могу изменить алгоритм упаковки своей корзины, чтобы элемент не был назначен более чем одной корзине? - PullRequest
0 голосов
/ 19 февраля 2019

Я изменил алгоритм упаковки бина отсюда: Алгоритм уменьшения первой аппроксимации .Теперь он работает для моего конкретного приложения, за исключением того, что я заметил, что нет ничего, что могло бы помешать назначению элементов более чем одной корзине

В моей программе я хочу вернуть список списков, в которых подсписки представляют отдельные ячейки, а элементы подсписка - это ключи элементов, помещенных в них.

Я пытался использовать items.remove(item) до и после обеих строк с .append(), но это не помешало назначению элемента более чем одной ячейке.

def binpack(articles,bin_cap):
    items = list(articles.items())   
    items.sort(key=lambda i: i[1], reverse=True)
    bins = [[items[0]]]

    for item in items:
        for bin in bins:
        # check to see if item will fit in bin
            if sum(i[1] for i in bin) + item[1] <= bin_cap:
                bin.append(item)
                break
        else:
        # item didn't fit into any bin, start a new bin
            bin = []
            bin.append(item)
            bins.append(bin)

    bin_contents = [[item[0] for item in bin] for bin in bins]
    print(bin_contents)

При тестировании:

articles = {0:20, 1:13, 2:22}
binpack(articles, bin_cap = 36)

Возвращает: [[2, 1], [2], [0]]

Элемент с ключом 2 помещается в первый и второй лот, когда он должен быть толькопомещено в один

Желаемый: [[2,1], [0]]

...