【发布时间】:2020-07-27 18:53:31
【问题描述】:
我正在尝试运行背包问题的变体,我需要总价值最小但组合重量等于或超过容量重量的项目组合。
maxn = 3
vm = [60, 100, 120, 50, 10, 10] # Values
wt = [10, 20, 30, 20, 5, 5] # Weights
W = 50 # Capacity weight
n = len(vm)
我所拥有的,给了我经典的背包答案(总价值最高):
def knapsack(n, W, wt, vm):
for i in range(n+1):
for w in range(W+1):
if i == 0 or w == 0:
K[i][w] = 0
elif wt[i-1] <= w:
K[i][w] = max(vm[i-1]
+ K[i-1][w-wt[i-1]], K[i-1][w])
else:
K[i][w] = K[i-1][w]
print(K[n][W])
return K[n][W]
def items_in_optimal(n, W, wm):
i = n
j = W
while (i > 0 and j > 0):
if(K[i][j] != K[i-1][j]):
print(i-1)
j = j-wm[i-1]
i = i-1
else:
i = i-1
K = [[0 for i in range(W + 1)] for j in range(n + 1)]
knapsack(n, W, wt, vm)
items_in_optimal(n, W, wt)
Output:
220
2
1
我要找的结果是:
Output:
170
3
2
非常感谢任何帮助!
编辑问题更清楚
编辑 2: 这是我想出的,但如果有更快的方法,我会非常感兴趣:
from itertools import combinations
import numpy as np
rlen = [2, maxn]
a = []
for r in rlen:
best_value = sum(vm)
for i in combinations(np.arange(0, len(vm)), r):
if sum(np.array(wt)[list(i)]) >= W:
if sum(np.array(vm)[list(i)]) < best_value:
best_value = sum(np.array(vm)[list(i)])
best_indices = list(i)
a.append([r, best_value, best_indices])
split_inv = min(a, key=lambda t: t[1])[2]
print(split_inv)
【问题讨论】:
-
解决经典变体并输出未包含在解决方案中的项目。弄清楚容量应该是多少。
标签: python algorithm dynamic-programming knapsack-problem