蟒蛇。贪婪算法,2用于遍历列表的循环

时间:2016-11-06 12:27:41

标签: python list greedy

我正在尝试编写一个贪婪的算法,我对一个盒子中可容纳的项目有一个限制,我必须尽可能多地在一个盒子中放置一个项目,然后再转到下一个(即最大化每个盒子的重量。)

我一直试图通过创建两个相同的列表来解决这个问题,让我们说a_listb_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([])

2 个答案:

答案 0 :(得分:0)

我认为您使用a_listb_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]]