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