Python 寻找成本最低的等于和的子集的算法

Python 寻找成本最低的等于和的子集的算法,python,dynamic-programming,knapsack-problem,integer-programming,Python,Dynamic Programming,Knapsack Problem,Integer Programming,给定一(1xN)个正权重列表(不一定是整数,即浮点数)和一个相等长度(1xN)的相应成本列表,我想找到权重列表的子集,该子集与给定的总和S精确相加,且成本最低(成本之和*权重对应于权重列表中的子集)。用Python编写最好(如果可能的话),因为我不太擅长其他语言 例如: w = [2.5, 3.0, 1.0, 5.5] # Weight list c = [1.0, 1.5, 2.0, 3.0] # Cost list S = 6.5 # Target sum 对于这种情况,我们有两个可能的子

给定一(1xN)个正权重列表(不一定是整数,即浮点数)和一个相等长度(1xN)的相应成本列表,我想找到权重列表的子集,该子集与给定的总和S精确相加,且成本最低(成本之和*权重对应于权重列表中的子集)。用Python编写最好(如果可能的话),因为我不太擅长其他语言

例如:

w = [2.5, 3.0, 1.0, 5.5] # Weight list
c = [1.0, 1.5, 2.0, 3.0] # Cost list
S = 6.5 # Target sum
对于这种情况,我们有两个可能的子集,其总和为S:

sub1 = [2.5, 3.0, 1.0]
sub2 = [1.0, 5.5]
这些子集的成本为:

cost1 = 2.5*1.0+3.0*1.5+1.0*2.0 = 9.0
cost2 = 1.0*2.0+5.5*3.0 = 18.5
因为子集1的成本最低(9.0),所以这就是我想要的子集

当然,一个可能的解决方案是计算所有可能的组合,然后只选择计算成本中的最小值。我希望有一个更有效的办法来解决这个问题


我已经寻找了不同的解决方案,但我只能找到Python的解决方案,这些解决方案解决了等和问题,而不是同时获得最低成本。下面是这样一个解决方案的示例:。

我最终按照约翰·科尔曼的建议,使用二进制整数规划解决了这个问题。以下是代码:

权重至少是正的吗?无论如何,这是一个非常简单的0-1整数线性规划问题,只有一个等式约束。因此,像分支定界算法这样的东西将起作用,尽管可能有更简单的方法。动态规划当然是一种自然的方式。你尝试过什么?作为参考,这被称为子集和问题,人们普遍认为它不存在有效的解决方案。(当然,你不是在要求一个有效的解决方案,只是一个解决方案)我更新了这个问题。是的,权重是正实值。我希望至少有比检查所有可能的组合更有效的方法。@sheg如果你看看我链接的维基百科页面,它解释了我们目前知道的最有效的算法。你不能指望比他们做得更好。您只需要稍微修改它,以根据您的权重测试可能的解决方案。应该是一个很小的修改你的工作呢?现在是你跟进克朗彻研究的时候了。我会注意到,即使您的数据不是整数,您仍然可以通过使用整数打开一些选项。OP可以表示为精确整数,也可以使用ε。