DavidNorgren

v2

Jan 30th, 2016
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.94 KB | None | 0 0
  1. from collections import namedtuple
  2. from collections import deque
  3. import time;
  4.  
  5. Item = namedtuple("Item", "benefit weight")
  6. Node = namedtuple("Node", "addedItems totalBenefit totalWeight")
  7.  
  8. # Appends a value to the end of a list and returns the new list
  9. def apnd(lst, item):
  10.     nlst = list(lst)
  11.     nlst.append(item)
  12.     return nlst
  13.  
  14. # Breadth-first search
  15. def solveKnapsackBFS(items, maxWeight):
  16.     root = Node([], 0, 0)
  17.     bestSolution = root
  18.     nodeQueue = deque()
  19.     nodeQueue.append(root)
  20.  
  21.     while nodeQueue:
  22.         n = nodeQueue.popleft()
  23.         if (n.totalBenefit > bestSolution.totalBenefit):
  24.             bestSolution = n
  25.         for i in range(len(items)):
  26.             #if i not in n.addedItems and n.totalWeight + items[i].weight < maxWeight:
  27.             if (not n.addedItems or i > n.addedItems[-1]) and n.totalWeight + items[i].weight < maxWeight:
  28.                 nodeQueue.append(Node(apnd(n.addedItems, i), n.totalBenefit + items[i].benefit, n.totalWeight + items[i].weight))
  29.  
  30.     return bestSolution
  31.  
  32. # Depth-first search
  33. def solveKnapsackDFS(items, maxWeight):
  34.     root = Node([], 0, 0)
  35.     bestSolution = root
  36.     nodeStack = deque()
  37.     nodeStack.append(root)
  38.  
  39.     while nodeStack:
  40.         n = nodeStack.pop()
  41.         if (n.totalBenefit > bestSolution.totalBenefit):
  42.             bestSolution = n
  43.         for i in range(len(items)):
  44.             #if i not in n.addedItems and n.totalWeight + items[i].weight < maxWeight:
  45.             if (not n.addedItems or i > n.addedItems[-1]) and n.totalWeight + items[i].weight < maxWeight:
  46.                 nodeStack.append(Node(apnd(n.addedItems, i), n.totalBenefit + items[i].benefit, n.totalWeight + items[i].weight))
  47.  
  48.     return bestSolution
  49.  
  50. # Run both functions on a set of items and measure time
  51. items = [
  52.     Item(20, 15),
  53.     Item(40, 32),
  54.     Item(50, 60),
  55.     Item(36, 100),
  56.     Item(25, 63),
  57.     Item(64, 120),
  58.     Item(54, 77),
  59.     Item(18, 6),
  60.     Item(46, 93),
  61.     Item(28, 35),
  62.     Item(61, 45),
  63.     Item(45, 65),
  64.     Item(88, 100),
  65.     Item(10, 30),
  66.     Item(23, 43),
  67.     Item(155, 400),
  68.     Item(12, 53),
  69.     Item(0, 500)
  70.     ]
  71.  
  72. print("BFS...")
  73. startTime = time.time()
  74. solutionBFS = solveKnapsackBFS(items, 1000)
  75. endTime = time.time()
  76. print("Best solution was the following sequence")
  77. for i in solutionBFS.addedItems:
  78.     print("%d: %d %d" % (i, items[i].benefit, items[i].weight))
  79. print("Total benefit was %d, total weight %d" % (solutionBFS.totalBenefit, solutionBFS.totalWeight))
  80. print("Time taken: %.2fs" % (endTime - startTime))
  81.  
  82. print("DFS...")
  83. startTime = time.time()
  84. solutionDFS = solveKnapsackDFS(items, 1000)
  85. endTime = time.time()
  86. print("Best solution was the following sequence")
  87. for i in solutionDFS.addedItems:
  88.     print("%d: %d %d" % (i, items[i].benefit, items[i].weight))
  89. print("Total benefit was %d, total weight %d" % (solutionDFS.totalBenefit, solutionDFS.totalWeight))
  90. print("Time taken: %.2fs" % (endTime - startTime))
Advertisement
Add Comment
Please, Sign In to add comment