Last active
April 4, 2021 09:10
-
-
Save smith0022/d05ff9398a2ba8a212cb11f5da5b44c3 to your computer and use it in GitHub Desktop.
its a search tree and greedy algorithm example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Food(object): | |
def __init__(self, n, v, w): | |
self.name = n | |
self.value = v | |
self.calories = w | |
def getValue(self): | |
return self.value | |
def getCost(self): | |
return self.calories | |
def density(self): | |
return self.getValue() / self.getCost() | |
def __str__(self): | |
return self.name + ': <' + str(self.value) \ | |
+ ', ' + str(self.calories) + '>' | |
def buildMenu(names, values, calories): | |
"""names, values, calories lists of same length. | |
name a list of strings | |
values and calories lists of numbers | |
returns list of Foods""" | |
menu = [] | |
for i in range(len(values)): | |
menu.append(Food(names[i], values[i], | |
calories[i])) | |
return menu | |
def greedy(items, maxCost, keyFunction): | |
"""Assumes items a list, maxCost >= 0, | |
keyFunction maps elements of items to numbers""" | |
itemsCopy = sorted(items, key=keyFunction, | |
reverse=True) | |
result = [] | |
totalValue, totalCost = 0.0, 0.0 | |
for i in range(len(itemsCopy)): | |
if (totalCost + itemsCopy[i].getCost()) <= maxCost: | |
result.append(itemsCopy[i]) | |
totalCost += itemsCopy[i].getCost() | |
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(foods, maxUnits): | |
print('Use greedy by value to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, Food.getValue) | |
print('\nUse greedy by cost to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, | |
lambda x: 1 / Food.getCost(x)) | |
print('\nUse greedy by density to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, Food.density) | |
names = ['wine', 'beer', 'pizza', 'burger', 'fries', | |
'cola', 'apple', 'donut', 'cake'] | |
values = [89, 90, 95, 100, 90, 79, 50, 10] | |
calories = [123, 154, 258, 354, 365, 150, 95, 195] | |
foods = buildMenu(names, values, calories) | |
testGreedys(foods, 1000) | |
def maxVal(toConsider, avail): | |
if toConsider == [] or avail == 0: | |
result = (0, ()) | |
elif toConsider[0].getCost() > avail: | |
# Explore right branch only | |
result = maxVal(toConsider[1:], avail) | |
else: | |
nextItem = toConsider[0] | |
# Explore left branch | |
withVal, withToTake = maxVal(toConsider[1:], avail - nextItem.getCost()) | |
withVal += nextItem.getValue() | |
# Explore right branch | |
withoutVal, withoutToTake = maxVal(toConsider[1:], avail) | |
# Explore better branch | |
if withVal > withoutVal: | |
result = (withVal, withToTake + (nextItem,)) | |
else: | |
result = (withoutVal, withoutToTake) | |
return result | |
def testMaxVal(foods, maxUnits, printItems = True): | |
print('Use search tree to allocate', maxUnits, | |
'calories') | |
val, taken = maxVal(foods, maxUnits) | |
print('Total value of items taken =', val) | |
if printItems: | |
for item in taken: | |
print(' ', item) | |
names = ['wine', 'beer', 'pizza', 'burger', 'fries', | |
'cola', 'apple', 'donut', 'cake'] | |
values = [89,90,95,100,90,79,50,10] | |
calories = [123,154,258,354,365,150,95,195] | |
foods = buildMenu(names, values, calories) | |
testGreedys(foods, 75) | |
class Food(object): | |
def __init__(self, n, v, w): | |
self.name = n | |
self.value = v | |
self.calories = w | |
def getValue(self): | |
return self.value | |
def getCost(self): | |
return self.calories | |
def density(self): | |
return self.getValue() / self.getCost() | |
def __str__(self): | |
return self.name + ': <' + str(self.value) \ | |
+ ', ' + str(self.calories) + '>' | |
def buildMenu(names, values, calories): | |
"""names, values, calories lists of same length. | |
name a list of strings | |
values and calories lists of numbers | |
returns list of Foods""" | |
menu = [] | |
for i in range(len(values)): | |
menu.append(Food(names[i], values[i], | |
calories[i])) | |
return menu | |
def greedy(items, maxCost, keyFunction): | |
"""Assumes items a list, maxCost >= 0, | |
keyFunction maps elements of items to numbers""" | |
itemsCopy = sorted(items, key=keyFunction, | |
reverse=True) | |
result = [] | |
totalValue, totalCost = 0.0, 0.0 | |
for i in range(len(itemsCopy)): | |
if (totalCost + itemsCopy[i].getCost()) <= maxCost: | |
result.append(itemsCopy[i]) | |
totalCost += itemsCopy[i].getCost() | |
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(foods, maxUnits): | |
print('Use greedy by value to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, Food.getValue) | |
print('\nUse greedy by cost to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, | |
lambda x: 1 / Food.getCost(x)) | |
print('\nUse greedy by density to allocate', maxUnits, | |
'calories') | |
testGreedy(foods, maxUnits, Food.density) | |
names = ['wine', 'beer', 'pizza', 'burger', 'fries', | |
'cola', 'apple', 'donut', 'cake'] | |
values = [89, 90, 95, 100, 90, 79, 50, 10] | |
calories = [123, 154, 258, 354, 365, 150, 95, 195] | |
foods = buildMenu(names, values, calories) | |
testGreedys(foods, 1000) | |
def maxVal(toConsider, avail): | |
if toConsider == [] or avail == 0: | |
result = (0, ()) | |
elif toConsider[0].getCost() > avail: | |
# Explore right branch only | |
result = maxVal(toConsider[1:], avail) | |
else: | |
nextItem = toConsider[0] | |
# Explore left branch | |
withVal, withToTake = maxVal(toConsider[1:], avail - nextItem.getCost()) | |
withVal += nextItem.getValue() | |
# Explore right branch | |
withoutVal, withoutToTake = maxVal(toConsider[1:], avail) | |
# Explore better branch | |
if withVal > withoutVal: | |
result = (withVal, withToTake + (nextItem,)) | |
else: | |
result = (withoutVal, withoutToTake) | |
return result | |
def testMaxVal(foods, maxUnits, printItems = True): | |
print('Use search tree to allocate', maxUnits, | |
'calories') | |
val, taken = maxVal(foods, maxUnits) | |
print('Total value of items taken =', val) | |
if printItems: | |
for item in taken: | |
print(' ', item) | |
names = ['wine', 'beer', 'pizza', 'burger', 'fries', | |
'cola', 'apple', 'donut', 'cake'] | |
values = [89,90,95,100,90,79,50,10] | |
calories = [123,154,258,354,365,150,95,195] | |
foods = buildMenu(names, values, calories) | |
testGreedys(foods, 750) | |
print('') | |
testMaxVal(foods, 750) | |
print('') | |
testMaxVal(foods, 750) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment