Python 背包问题,有固定选择(必选)
我是python新手,正在一本书中解决一些问题。现在,我实现了一个代码(在开始创建类等时)来优化给定项的组合。 现在我想提出一些要求,比如在组合中必须是项目1或项目2。另一个例子是,如果项目1也包含在项目2之后。 我尝试更改函数fastMaxVal下面的代码,但没有成功解决问题 我希望有人能告诉我需要改变什么。这将非常有帮助,并提前感谢您 致以最良好的祝愿Python 背包问题,有固定选择(必选),python,algorithm,math,knapsack-problem,Python,Algorithm,Math,Knapsack Problem,我是python新手,正在一本书中解决一些问题。现在,我实现了一个代码(在开始创建类等时)来优化给定项的组合。 现在我想提出一些要求,比如在组合中必须是项目1或项目2。另一个例子是,如果项目1也包含在项目2之后。 我尝试更改函数fastMaxVal下面的代码,但没有成功解决问题 我希望有人能告诉我需要改变什么。这将非常有帮助,并提前感谢您 致以最良好的祝愿 class Item(object): # return object which is choosen def __init__
class Item(object): # return object which is choosen
def __init__(self, n, v, w):
self.name = n
self.value = v
self.weight = 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 + ' PV: ' + str(self.value) + ', Weight of investment: $'\
+ str(self.weight) + ' >'
return result
def value(item): #for the value
return item.getValue()
def weightInverse(item): #weight inverse as said in the name
return 1.0/item.getWeight()
def density(item):
return item.getValue()/item.getWeight()
#toConsider(items that are higher in the tree)
#avail = available
#memo = memorized (kepp track of possibilities it has already evaluated)
def fastMaxVal(toConsider, avail, memo = {}):
if (len(toConsider), avail) in memo:
result = memo[(len(toConsider), avail)]
elif toConsider == [] or avail == 0:
result = (0, ())
elif toConsider[0].getWeight() > avail:
result = fastMaxVal(toConsider[1:], avail, memo)
else:
nextItem = toConsider[0]
withVal, withToTake = fastMaxVal(toConsider[1:], avail - nextItem.getWeight(), memo)
withVal += nextItem.getValue()
withoutVal, withoutToTake = fastMaxVal(toConsider[1:], avail, memo)
if withVal > withoutVal:
result = (withVal, withToTake + (nextItem,))
else:
result = (withoutVal, withoutToTake)
memo[(len(toConsider), avail)] = result
return result
def smallTest():
names = ['Project 1', 'Project 2', 'Project 3', 'Project 4', 'Project 5', 'Project 6',
'Project 7', 'Project 8', 'Project 9', 'Project 10']
vals = [NPV_1, NPV_2, NPV_3, NPV_4, NPV_5, NPV_5, NPV_7, NPV_8, NPV_9, NPV_10]
weights = [-inv_1[0], -inv_2[0], -inv_3[0], -inv_4[0], -inv_5[0], -inv_6[0], -inv_7[0],
-inv_8[0], -inv_9[0], -inv_10[0]]
Items = []
for i in range(len(vals)):
Items.append(Item(names[i], vals[i], weights[i]))
val, taken = fastMaxVal(Items, 100000)
for item in taken:
print(item)
print('Total PV of investments taken = $', round(val, 2))
类项(对象):#返回选择的对象
定义初始值(self,n,v,w):
self.name=n
自我价值=v
自重=w
def getName(self):
返回self.name
def getValue(自身):
回归自我价值
def getWeight(自身):
回重
定义(自我):
结果=“<”+self.name+“PV:“+str(self.value)+”,投资权重:$”\
+str(自重)+'>'
返回结果
定义值(项目):#对于值
return item.getValue()
def WeightReverse(项目):#名称中所述的重量反转
return 1.0/item.getWeight()
def密度(项目):
返回item.getValue()/item.getWeight()
#考虑(树中较高的项目)
#可用=可用
#备忘录=记忆(kepp已评估的可能性跟踪)
def fastMaxVal(考虑、利用、备忘录={}):
如果备忘录中有(len(toConsider),则可用):
结果=备忘录[(len(toConsider),avail)]
elif toConsider=[]或avail==0:
结果=(0,())
elif toConsider[0]。getWeight()>avail:
结果=fastMaxVal(考虑因素[1]、效用、备忘录)
其他:
nextItem=toConsider[0]
withVal,withToTake=fastMaxVal(考虑[1:],avail-nextItem.getWeight(),memo)
withVal+=nextItem.getValue()
withoutVal,withoutToTake=fastMaxVal(考虑[1]、可用、备注)
如果withVal>withoutVal:
结果=(withVal,withToTake+(nextItem,))
其他:
结果=(不带VAL,不带TOTAKE)
备注[(len(考虑),avail)]=结果
返回结果
def smallTest():
名称=[“项目1”、“项目2”、“项目3”、“项目4”、“项目5”、“项目6”,
“项目7”、“项目8”、“项目9”、“项目10”]
VAL=[NPV_1、NPV_2、NPV_3、NPV_4、NPV_5、NPV_5、NPV_7、NPV_8、NPV_9、NPV_10]
权重=[-inv_1[0]、-inv_2[0]、-inv_3[0]、-inv_4[0]、-inv_5[0]、-inv_6[0]、-inv_7[0],
-库存8[0],-库存9[0],-库存10[0]]
项目=[]
对于范围内的i(len(vals)):
Items.append(项目(名称[i]、VAL[i]、权重[i]))
val,take=fastMaxVal(项目,100000)
对于拍摄的项目:
打印(项目)
打印(‘投资的总PV=$’,四舍五入(val,2))
我不知道你在问什么我猜你是从另一种语言来到Python的?