0
我已經在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
輸出是:
18
10000100001