greedy algorithm DEMO

来源:互联网 发布:阿里云学生服务器 编辑:程序博客网 时间:2024/06/07 23:06
# 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 Itemsdef 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 20Total value of items taken =  200.0   <computer, 200.0, 20.0>Use greedy by weight to fill knapsack of size 20Total 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 20Total 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>                                  

0 0