Python 背包问题,有固定选择(必选)

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__

我是python新手,正在一本书中解决一些问题。现在,我实现了一个代码(在开始创建类等时)来优化给定项的组合。 现在我想提出一些要求,比如在组合中必须是项目1或项目2。另一个例子是,如果项目1也包含在项目2之后。 我尝试更改函数fastMaxVal下面的代码,但没有成功解决问题

我希望有人能告诉我需要改变什么。这将非常有帮助,并提前感谢您

致以最良好的祝愿


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的?