Python 程序,从10个选项中选择最佳选项

Python 程序,从10个选项中选择最佳选项,python,algorithm,variations,Python,Algorithm,Variations,我需要用python编写一个程序,从一个数组中选择汽车,数组中填充了10辆汽车的质量。这个想法是,它填充一艘驳船,最有效地容纳约8吨的货物,并且最小的未填充空间。我的想法是,它改变质量,选择一个最接近最大重量的。但由于我对算法还不熟悉,所以我不知道该怎么做这是一个一维装箱问题。这是一个NP问题,没有最优解。然而,有一种方法可以用贪婪算法来解决这个问题。您很可能想在phpclasses.org(bin packing)上试用我的bin packing解算器 如果我有一个未偏移且无向的图,并且每个节

我需要用python编写一个程序,从一个数组中选择汽车,数组中填充了10辆汽车的质量。这个想法是,它填充一艘驳船,最有效地容纳约8吨的货物,并且最小的未填充空间。我的想法是,它改变质量,选择一个最接近最大重量的。但由于我对算法还不熟悉,所以我不知道该怎么做这是一个一维装箱问题。这是一个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种组合/可能性)。我忘了什么吗?错误在哪里?

我会用动态规划解决这个问题。你应该能够在O(m*n)操作中得到最优解(n是汽车数量,m是总质量)。 然而,只有当质量都是整数时,这才有效

一般来说,你有一个二元线性规划问题。这些都是非常困难的(NP完全)


<>但是,这两种方法都导致了我不认为是初学者的算法。你最好是反复试验(如你所建议的),或者只是尝试各种可能的组合。

像你这里遇到的问题类似于经典的旅行推销员问题,它要求推销员访问一系列城市的最有效方式。不同之处在于,可以想象,你可能不需要每辆车都装满驳船,而销售人员必须访问每一个城市。但问题是类似的。解决问题的蛮力方法是调查所有可能的汽车组合,从1辆到所有10辆。我们将假设每辆车有任意数量是有效的(即,如果第2辆车是福特福克斯,您可以有三辆福特福克斯)。但是,如果汽车列表是特定汽车的精确列表,并且每个汽车只能使用1辆,则很容易更改

现在,这很快开始消耗大量时间。随着汽车数量的增加,可能的汽车组合的数量呈几何级数增加,这意味着如果汽车数量比你预期的少,那么运行程序所需的时间就会更长,那么你的生命中还有时间。10应该是可以管理的(结果是超过700000个组合,或者1024个,如果每个项目只能有一个)

第一件事是确定每辆汽车的重量以及驳船能够承载的最大重量

weights = [1, 2, 1, 3, 1, 2, 2, 4, 1, 2, 2]
capacity = 8
现在我们需要找到每种可能的组合。Python的
itertools
模块有一个函数,可以为我们提供给定长度的所有组合,但我们需要所有长度。因此,我们将编写一个从1到10的循环,并为每个长度调用
itertools.combines\u和\u replacement
。然后,我们可以找出每个组合的总重量,如果它比我们已经找到的任何重量都高,但仍在容量范围内,我们将记住它是迄今为止我们找到的最好的组合

这里唯一真正的诀窍是,我们不需要权重的组合——我们需要权重指数的组合,因为在最后,我们想要知道哪些车要放在驳船上,而不是它们的权重。因此,
带替换的组合(范围(10),…)
而不是带替换的组合(权重…)。在循环中,您需要获得每辆车的重量,并将其与
重量[i]
组合起来

我最初在这里有代码,但由于这是家庭作业,所以删除了它。:-)(最初并没有这样标记,但我应该知道——我责备时间的变化。)

如果您想只允许每辆车中的一辆,您可以使用
itertools.combinations
而不是
combinations\u with\u replacement


一条捷径是可能的,因为你在别处提到汽车的重量在1-2吨之间。这意味着您知道您至少需要4辆车(4*2=8),因此您可以跳过1-3辆车的所有组合。然而,如果教授改变了你的参数,这将不能很好地概括。

当然,这是作业的班级(对吧?)给了你一些想法。听起来像这样:重量是你唯一的考虑因素吗,还是应该考虑汽车的尺寸?目前只考虑重量这听起来像是贪婪算法典型示例的一个变体-请参阅描述和解决策略。如何没有最佳解决方案?我只有10个数字,从中提取变化后,至少会有1个,最接近8吨。汽车的重量在1-2吨之间,你需要简化这个问题。如果你忘记了10个数字,那么你就只剩下8吨了,这就成了一个难题,因为你不知道你必须使用哪种组合车来减少吨数。我们被告知,所有时间最多只有10辆车。这就是我所说的,这是一个1D垃圾箱包装问题,只是一个陷阱。忘了车吧!我不知道这将如何解决两辆车以上的问题。如何在python中尝试每种可能的组合,同时给出8吨的限制?好吧,生成每种可能的组合,计算它们的重量,检查是否低于8,如果低于8,检查数量。然后简单地记住找到的最佳解决方案。对于10辆汽车,候选解决方案可以是一个包含10个元素的布尔数组,每个元素指示是否使用了特定的汽车。您需要生成所有可能的此类布尔数组(将有2^10=1024)。这不是真的。10辆车的所有可能性只有45,这是数学(n^2-n)/2。我可能错了,但不可能选择更多的吗