找到等于总和且成本最低的子集的算法

时间:2017-03-07 13:34:28

标签: 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

对于这种情况,我们有两个可能的子集,它们总和为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),因此这是我想要的子集。

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

我已经搜索了不同的解决方案,但我只能找到解决方案,解决了总和的问题,而不是同时获得最低的成本。以下是此类解决方案的示例:Algorithm to find which number in a list sum up to a certain number

1 个答案:

答案 0 :(得分:0)

我终于使用John Coleman建议的二进制整数编程解决了这个问题。以下是代码:https://github.com/sebastianheg/knapsack-problem