簡體   English   中英

背包問題(優化后無法正常工作)

[英]Knapsack problem(optimized doesn't work correctly)

我正在編寫 Python 代碼以解決背包問題。

這是我的代碼:

import time
start_time = time.time()
#reading the data:
values = []
weights = []
test = []
with open("test.txt") as file:

  W, size = map(int, next(file).strip().split())
  for line in file:
    value, weight = map(int, line.strip().split())
    values.append(int(value))
    weights.append(int(weight))

weights = [0] + weights
values = [0] + values

#Knapsack Algorithm:


hash_table = {}
for x in range(0,W +1):
  hash_table[(0,x)] = 0

for i in range(1,size + 1):
  for x in range(0,W +1):
    if weights[i] > x:
      hash_table[(i,x)] = hash_table[i - 1,x]
    else:
      hash_table[(i,x)] = max(hash_table[i - 1,x],hash_table[i - 1,x - weights[i]] + values[i])

print("--- %s seconds ---" % (time.time() - start_time))

此代碼工作正常,但在大文件上,由於 RAM 問題,我的程序崩潰。

所以我決定改變以下部分:

for i in range(1,size + 1):
  for x in range(0,W +1):
    if weights[i] > x:
      hash_table[(1,x)] = hash_table[0,x]
      #hash_table[(0,x)] = hash_table[1,x]
    else:
      hash_table[(1,x)] = max(hash_table[0,x],hash_table[0,x - weights[i]] + values[i])
      hash_table[(0,x)] = hash_table[(1,x)]

正如您所看到的,我只使用了兩行而不是使用 n 行(將第二行復制到第一行以重新創建以下代碼行hash_table[(i,x)] = hash_table[i - 1,x] ) ,這應該可以解決 RAM 問題。

但不幸的是,它給了我錯誤的結果。

我使用了以下測試用例:

190 6

50 56

50 59

64 80

46 64

50 75

5 17

Should get a total value of 150 and total weight of 190 using 3 items:

item with value 50 and weight 75,

item with value 50 and weight 59,

item with value 50 and weight 56,

更多測試用例: https : //people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html

這里的問題是您需要重置 i 上迭代中的所有值,但還需要 x 索引,因此,您可以使用另一個循環:

for i in range(1,size + 1):
  for x in range(0,W +1):
    if weights[i] > x:
      hash_table[(1,x)] = hash_table[0,x]
    else:
      hash_table[(1,x)] = max(hash_table[0,x],hash_table[0,x - weights[i]] + values[i])
  for x in range(0, W+1): # Make sure to reset after working on item i
    hash_table[(0,x)] = hash_table[(1,x)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM