かなり標準的なナップサック問題を解決するために、Pythonで二分決定木を実装しました。それぞれに重みと値が関連付けられたオブジェクトのコレクションがあり、重みの制約に従って、値を最大化するようにオブジェクトを選択する必要があります。
最大値を返す方法はわかりますが、最大値を生成したオブジェクトのIDを返す賢い方法を見つけるのに苦労しています。
現在、私は「文字列ベクトル」を作成しています。「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