【发布时间】:2016-02-19 18:16:48
【问题描述】:
我试图从这个列表中选择最多 10 个项目以获得更高的利润。
Item name | Item "Weight" | Item "Profit"
[A, 1084, 424],
[B, 1143, 391],
[C, 1205, 351],
[D, 1088, 328],
[E, 5, 21],
[F, 996, 241],
[G, 13, 23],
[H, 2, 9],
[I, 5, 13],
[J, 14, 21],
[K, 11, 18],
[L, 4, 12],
[M, 121, 59],
...
Total length: 249
我发现我的问题可以定义为0/1 Bidimensional Knapsack problem。重量将是第一个维度,10 项限制将是第二个维度。所以我用python尝试了不同的解决方案来优化选择。
搜索不同的来源后,我无法找到针对我的具体问题的 python 解决方案:
- 定义的重量限制(介于 100-10.000 之间)
- 每个项目只能选择一次
- 总共只能选择 10 项
- 最大化“利润”!
最后我找到了this java 解决方案,我试图翻译,但在某处出错,该功能几乎可以正常工作,但无法找到正确的解决方案。我花了几天时间试图找出代码失败的地方,但这有点令人困惑。
from collections import namedtuple
Bounty = namedtuple('Bounty', 'name value size volume')
sack = Bounty('sack', value=0, size=800, volume=10)
items = results #A big list as mentioned above
dynNoRep = [[[0 for k in xrange(sack.volume+1)] for j in xrange(sack.size+1)] for i in xrange(
len(items) + 1)]
for i,item in enumerate(items):
for j in range(sack.size):
for h in range(sack.volume):
if item.size > j:
#pdb.set_trace()
dynNoRep[i][j][h] = dynNoRep[i-1][j][h]
elif item.volume > h:
dynNoRep[i][j][h] = dynNoRep[i-1][j][h]
else:
dynNoRep[i][j][h] = max(
dynNoRep[i-1][j][h], dynNoRep[i-1][j - items[i-1].size][h - items[i-1].volume] + items[i-1].value)
for i,item in enumerate(items):
for j in range(sack.size):
dynNoRep[i][j][sack.volume] = dynNoRep[i][j][sack.volume-1]
j = sack.size
h = sack.volume
finalSize = 0
finalValue = 0
finalVolume = 0
for i in range(len(items)-1, -1, -1):
#pdb.set_trace()
if dynNoRep[i][j][h] != dynNoRep[i-1][j][h]:
print"Value {} | Size {} | Volume {}".format(str(items[i-1].value), str(items[i-1].size), str(items[i-1].volume))
finalSize += items[i-1].size
finalValue += items[i-1].value
finalVolume += items[i-1].volume
j -= items[i - 1].size
h -= items[i - 1].volume
print('Final size {} / {}'.format(str(finalSize), str(sack.size)))
print('Final volume {} / {}'.format(str(finalVolume), str(sack.volume)))
print('Final value {}'.format(str(finalValue)))
这是输出,有时它显示更好的东西,但从来不是正确的解决方案:
Final size 0 / 800
Final volume 0 / 10
Final value 0
上下文:Windows 8.1 32 位。 Ipython 笔记本。 Python 2.
对使代码有效的任何建议?提前谢谢!
【问题讨论】:
标签: python dynamic-programming knapsack-problem