# quote from 'introduction to computation and programming
# using Python, revised, MIT press
class Item(object):
def __init__(self, n, v, w):
self.name = n
self.value = float(v)
self.weight = float(w)
def getName(self):
return self.name
def getValue(self):
return self.value
def getWeight(self):
return self.weight
def __str__(self):
result = '<' + self.name + ', ' + str(self.value)\
+ ', ' + str(self.weight) + '>'
return result
def value(item):
return item.getValue()
def weightInverse(item):
return 1.0/item.getWeight()
def density(item):
return item.getValue()/item.getWeight()
def buildItems():
names = ['clock', 'painting', 'radio', 'vase', 'book', 'computer']
values = [175,90,20,50,10,200]
weights = [10,9,4,2,1,20]
Items = []
for i in range(len(values)):
Items.append(Item(names[i], values[i], weights[i]))
return Items
def greedy(items, maxWeight, keyFunction):
"""Assumes Items a list, maxWeight >= 0,
keyFunction maps elements of Items to floats"""
itemsCopy = sorted(items, key=keyFunction, reverse = True)
result = []
totalValue = 0.0
totalWeight = 0.0
for i in range(len(itemsCopy)):
if (totalWeight + itemsCopy[i].getWeight()) <= maxWeight:
result.append(itemsCopy[i])
totalWeight += itemsCopy[i].getWeight()
totalValue += itemsCopy[i].getValue()
return (result, totalValue)
def testGreedy(items, constraint, keyFunction):
taken, val = greedy(items, constraint, keyFunction)
print 'Total value of items taken = ', val
for item in taken:
print ' ', item
def testGreedys(maxWeight = 20):
items = buildItems()
print 'Use greedy by value to fill knapsack of size', maxWeight
testGreedy(items, maxWeight, value)
print '\nUse greedy by weight to fill knapsack of size', maxWeight
testGreedy(items, maxWeight, weightInverse)
print '\nUse greedy by density to fill knapsack of size', maxWeight
testGreedy(items, maxWeight, density)
testGreedys()
%run "C:\Users\Administrator\test.py"
Use greedy by value to fill knapsack of size 20
Total value of items taken = 200.0
<computer, 200.0, 20.0>
Use greedy by weight to fill knapsack of size 20
Total value of items taken = 170.0
<book, 10.0, 1.0>
<vase, 50.0, 2.0>
<radio, 20.0, 4.0>
<painting, 90.0, 9.0>
Use greedy by density to fill knapsack of size 20
Total value of items taken = 255.0
<vase, 50.0, 2.0>
<clock, 175.0, 10.0>
<book, 10.0, 1.0>
<radio, 20.0, 4.0>