我正在尝试编写一个贪婪的算法,我对一个盒子中可容纳的项目有一个限制,我必须尽可能多地在一个盒子中放置一个项目,然后再转到下一个(即最大化每个盒子的重量。)
我一直试图通过创建两个相同的列表来解决这个问题,让我们说a_list
和b_list
。
a_list = [9, 8, 6, 4, 3, 2, 2, 2]
b_list = [9, 8, 6, 4, 3, 2, 2, 2]
这里对每个方框的约束为10,所以例如我只能在移动到下一个方框之前将第一个项目(9)合并为一个。以下框应包含8 + 2。
每个方框都是主要清单中的清单,即
list_ = [[9], [8,2],[6,4].....]
一旦当前的盒子无法装入更多物品,我只能转到下一个盒子。
当我尝试迭代这两个列表时,我不知道如何删除项目以避免它们在list_
中多次出现。
我很接近,但我有两件物品出现两次而一件物品根本没有出现。
同样的情况是,尽管我按降序排列列表,但并非所有的盒子都是最佳的,其中一个只有一个值为“2”的项目。我知道这与循环有关,但我不明白为什么它不会按降序顺序浏览项目。
limit = 10
list_ = [[]]
for i in a_list:
for j in b_list:
if sum(l[-1]) + i + j <= limit:
l[-1].append(i)
l[-1].append(j)
b_list.remove(j)
elif sum(l[-1]) + j <= limit:
l[-1].append(j)
b_list.remove(j)
else:
l.append([])
答案 0 :(得分:0)
我认为您使用a_list
和b_list
的唯一原因是您认为每个盒子需要选择两个项目,但不一定是这样。
我认为您应该使用单个列表,并使用基于列表索引的方法来跟踪添加的项目。
您也会遇到删除问题,因此请尝试设置添加到-1的项目并在每次传递后将其过滤掉,以避免在循环时与删除混淆。
我在这里拒绝分享解决方案代码,但是如果你需要的话可以ping我。
答案 1 :(得分:0)
迭代时更改列表始终是一项挑战。这是一个使用while
循环的解决方案,我通常不认可,但它是一个简单的算法,它应该在这里工作没有问题。
while
循环检查初始列表中是否还有任何元素。然后它弹出(删除并保存)列表的第一个元素,并迭代列表的其余部分,寻找满足求和条件的其他元素,使其小于约束。如果找到一个元素,则将其附加到子列表并记录其索引。在for循环结束时,子列表将附加到输出列表,然后以相反的顺序删除记录的索引。
a_list = [9, 8, 6, 4, 3, 2, 2, 2]
constraint = 10
out = []
while a_list:
# grab first element of a_list and reset the list of
# to pop from a_list to pop from a_list
sub_out = [a_list.pop(0)]
pop_list = []
for i,a in enumerate(a_list):
if a+sum(sub_out) <= constraint:
sub_out.append(a)
pop_list.append(i)
# append the sub_list to the output list
out.append(sub_out)
# remove each item in the pop_list in the reverse order
for i in reversed(pop_list):
a_list.pop(i)
#output:
>>> out
[[9], [8, 2], [6, 4], [3, 2, 2]]