程序,选择10中最好的

时间:2011-03-14 13:35:44

标签: python algorithm variations

我需要在python中创建一个程序,从阵列中选择汽车,这个阵列充满了10辆汽车。这个想法是它填充驳船,可以最有效地容纳约8吨,最小的空间没有填充。我的想法是,它使质量的变化,并选择一个,最接近最大重量。但由于我是算法的新手,我不知道如何做到这一点

3 个答案:

答案 0 :(得分:1)

这是1D装箱问题。这是一个NP问题,并没有最佳解决方案。但是有一种方法可以用贪心算法来解决这个问题。很可能你想在phpclasses.org(bin-packing)尝试我的bin-packing解算器。

如果我有一个未经称量和未定向的图形,并且每个节点都连接到每个节点,那么我有(n ^ 2-n)/ 2对节点和整体n ^ 2-n可能性/组合:

1,2,3,4,5,...,64
2,1,X,X,X,...,X
3,X,1,X,X,...,X
4,X,X,1,X,...,X
5,X,X,X,1,...,X
.,X,X,X,X,1,.,X
.,X,X,X,X,X,1,X
64,X,X,X,X,X,X,1 

10辆车不一样吗? (45对汽车和90种组合/可能性)。我忘记了什么吗?错误在哪里?

答案 1 :(得分:1)

我会用动态编程来解决这个问题。您应该能够在O(m * n)操作中获得最佳解决方案(确定汽车数量,计算总质量)。 只有当群众都是整数时,这才有效。

通常,您有二进制线性编程问题。这些都很难(NP-complete)。

但是,这两种方式都会导致我不认为是初学者材料的算法。您可能会更好地进行反复试验(如您所建议的那样)或只是尝试所有可能的组合。

答案 2 :(得分:-1)

像你这样的问题类似于经典旅行商问题,它要求销售人员访问城市列表的最有效方式。不同的是,可以想象您可能不需要每辆车来填充驳船,而推销员必须访问每个城市。但问题是类似的。解决问题的蛮力方法是调查汽车的每种可能组合,从1辆汽车到10辆汽车。我们假设每辆汽车都有任意数量是有效的(即如果汽车2是福特福克斯,你可能有三个福特焦点)。如果汽车列表是特定汽车的确切列表,则很容易更改,但是,您只能使用其中的一个。

现在,这很快开始耗费大量时间。随着汽车数量的增加,汽车的可能组合数量几何上升,这意味着数量小于预期,运行程序需要更长的时间,然后生命中还剩下时间。 10应该是可管理的(结果是700,000多个组合,如果每个项目只有一个,则为1024)。

首先要确定每辆车的重量和驳船可以承载的最大重量。

weights = [1, 2, 1, 3, 1, 2, 2, 4, 1, 2, 2]
capacity = 8

现在我们需要一些方法来找到每种可能的组合。 Python的itertools模块有一个函数可以给我们给定长度的每个组合,但我们想要所有长度。因此,我们将编写一个从1到10的循环,并为每个长度调用itertools.combinations_with_replacement。然后我们可以找出每种组合的总重量,如果它高于我们已经找到的任何重量,但仍然在容量范围内,我们将记住它是迄今为止我们发现的最佳重量。

这里唯一真正的诀窍是我们不想要权重的组合 - 我们想要权重的索引组合,因为最后我们想知道哪些车要放在驳船上,而不是它们的重量。所以combinations_with_replacements(range(10), ...)而不是combinations_with_replacements(weights, ...)。在循环内部,你需要在与weights[i]的组合中得到每辆汽车的重量来总结它。

我最初在这里有代码,但是因为这是家庭作业所以把它拿出来。 :-)(它原本没有标记,但我应该知道 - 我责怪时间变化。)

如果您只想允许每辆车中的一辆,则使用itertools.combinations代替combinations_with_replacement

由于您在其他地方提到汽车重1-2吨,因此可以使用捷径。这意味着您知道您将需要至少4个(4 * 2 = 8),因此您可以跳过1-3辆汽车的所有组合。但是,如果教授更改了你的参数,这将不会很好地概括。