Python 在二叉决策树中跟踪导致目标结果的节点序列?

Python 在二叉决策树中跟踪导致目标结果的节点序列?,python,tree,binary-tree,nodes,decision-tree,Python,Tree,Binary Tree,Nodes,Decision Tree,我在Python中实现了一个二叉决策树来解决一个相当标准的背包问题:有一个对象集合,每个对象都有一个关联的权重和值,并且必须选择对象以最大化值,并受权重约束 我知道如何返回最大值,但我正在努力找到一种聪明的方法来返回产生最大值的对象的标识 现在,我正在创建一个“字符串向量”,可以说,“1”和“0”代表打包或不打包某个对象的选择。字符串向量中的第一个“1”或“0”表示为与对象列表中的第一个对象相对应的对象所做的决定,依此类推 有更好的方法吗 我写的代码是: def knapsack(weightL

我在Python中实现了一个二叉决策树来解决一个相当标准的背包问题:有一个对象集合,每个对象都有一个关联的权重和值,并且必须选择对象以最大化值,并受权重约束

我知道如何返回最大值,但我正在努力找到一种聪明的方法来返回产生最大值的对象的标识

现在,我正在创建一个“字符串向量”,可以说,“1”和“0”代表打包或不打包某个对象的选择。字符串向量中的第一个“1”或“0”表示为与对象列表中的第一个对象相对应的对象所做的决定,依此类推

有更好的方法吗

我写的代码是:

def knapsack(weightList, valueList, availableWeight, index):
    if index == 0:
        if weightList[index] <= availableWeight:
            return valueList[index], '1'
        else:
            return 0, '0'
    else:
        reject, rVector = knapsack(weightList, valueList, availableWeight, index - 1)
        rVector += "0"
        if weightList[index] <= availableWeight:
            take, tVector = knapsack(weightList, valueList, availableWeight - weightList[index], index - 1)
            take += valueList[index]
            tVector += "1"
        else:
            take = -1

        if take > reject:
            return take, tVector
        else:
            return reject, rVector

weightList = [1, 2, 6, 5, 8, 3, 7, 2, 4, 7, 1]
valueList = [2, 5, 4, 6, 7, 8, 2, 4, 5, 6, 8]
availableWeight = 5
index = len(weightList) - 1

maxValue, vector = knapsack(weightList, valueList, availableWeight, index)
print maxValue
print vector

如果字符串最终大部分包含“0”和几个“1”,那么最好返回一个Python集对象。一旦将结果作为一个集合得到,它仍然允许您有效地决定索引是否在集合中——因此,首先使用一串标志没有什么好处

请注意,集合是可变的,如果在算法中实现不正确,可能会造成混乱。我建议您更喜欢“冷冻套装”而不是“套装”

18
10000100001