您的位置:首页 > 编程语言 > Go语言

greedy algorithm demo(knapsack problem)

2015-05-29 07:30 501 查看
#quote from 'introduction to computation and programming using python,
# revised edition, MIT'
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)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: