#python #algorithm #bin-packing
Вопрос:
Я пытаюсь создать Первый подходящий алгоритм. Подход, который я использую, заключается в создании списка пустых списков, представляющих ячейки, где они будут заполнены определенными значениями области, которые складываются в область ячеек. Я хочу, чтобы это продолжалось до тех пор, пока большинство областей не будут заполнены.
Вот где возникает моя проблема:
lists.append([])
for i in lists:
for box in boxes:
l = box[0]
w = box[1]
area = l * w
if area <= bin_area:
bin_area = bin_area - area
lists[0].append(area)
else:
bin_area = 15
if area <= bin_area:
bin_area = bin_area - area
lists[1].append(area)
# Here I want to then create a new empty list
# where I can add more values that add up to the bin value.
Поэтому в конце приведенного выше кода я хочу создать новый пустой список, в который я могу добавить дополнительные значения, которые дополняют значение корзины.
Я попытался, угадав lists[ i ].append([area])
, но индекс должен быть целочисленным.
Как мне этого добиться?
Кроме того, вот мой полный код:
def FirstFitAlg():
box1 = (3,2)
box2 = (1,4)
box3 = (2,1)
box4 = (4,3)
box5 = (1,2)
boxes = [box1,box2,box3,box4,box5]
num_of_boxes = len(boxes)
bin_area = 15
n_bin = 0
lists = []
lists.append([])
lists.append([])
#for i in lists:
for box in boxes:
l = box[0]
w = box[1]
area = l * w
if area <= bin_area:
bin_area = bin_area - area
lists[0].append(area)
else:
bin_area = 15
if area <= bin_area:
bin_area = bin_area - area
lists[1].append(area)
# Here I want to then create a new empty list
# where I can add more values that add up to the bin value.
print(lists)
for i in lists:
if len(i) >= 1:
n_bin = 1
print(n_bin)
efficiency = (n_bin/num_of_boxes) * 100
print(efficiency)
Ответ №1:
Не используйте функцию печати и передайте ей информацию о поле в качестве аргумента. Таким образом, это более общее.
Вот как это могло бы сработать:
def firstFitAlg(boxes, bin_area):
bins = []
current_bin_area = 0
total_occupied = 0
for box in boxes:
l, w = box
area = l * w
total_occupied = area
if area > current_bin_area: # Overflow. Need new bin
current_bin = [] # Create new bin
current_bin_area = bin_area # All space is available in it
bins.append(current_bin) # This bin is part of the solution
current_bin.append(box) # Add box in this bin
current_bin_area -= area # and reduce the available space in it
return bins, total_occupied
boxes = [(3,2),(1,4),(2,1),(4,3),(1,2)]
bin_area = 15
bins, total_occupied = firstFitAlg(boxes, bin_area)
print(bins)
print(f"Bumber of bins: {len(bins)}")
efficiency = (total_occupied/(bin_area * len(bins))) * 100
print(f"Efficiency: {efficiency}")
Комментарии:
1. Большое вам спасибо за вашу помощь! Я наполовину новичок в python и часто делаю что-то немного лишнее. В этом гораздо больше смысла!