Mit einem Zweig-und-Grenze-Algorithmus habe ich den optimalen Gewinn aus einer bestimmten Menge von Elementen ausgewertet, aber jetzt möchte ich herausfinden, welche Elemente in dieser optimalen Lösung enthalten sind. Ich bin Bewertung der Gewinnwert des optimalen Tornister wie folgt (angepasst von here):Artikel berechnen in Zweig und gebundenen Rucksack
import Queue
class Node:
def __init__(self, level, profit, weight):
self.level = level # The level within the tree (depth)
self.profit = profit # The total profit
self.weight = weight # The total weight
def solveKnapsack(weights, profits, knapsackSize):
numItems = len(weights)
queue = Queue.Queue()
root = Node(-1, 0, 0)
queue.put(root)
maxProfit = 0
bound = 0
while not queue.empty():
v = queue.get() # Get the next item on the queue
uLevel = v.level + 1
u = Node(uLevel, v.profit + e[uLevel][1], v.weight + e[uLevel][0])
bound = getBound(u, numItems, knapsackSize, weights, profits)
if u.weight <= knapsackSize and u.profit > maxProfit:
maxProfit = uProfit
if bound > maxProfit:
queue.put(u)
u = Node(uLevel, v.profit, v.weight)
bound = getBound(u, numItems, knapsackSize, weights, profits)
if (bound > maxProfit):
queue.put(u)
return maxProfit
# This is essentially the brute force solution to the fractional knapsack
def getBound(u, numItems, knapsackSize, weight, profit):
if u.weight >= knapsackSize: return 0
else:
upperBound = u.profit
totalWeight = u.weight
j = u.level + 1
while j < numItems and totalWeight + weight[j] <= C:
upperBound += profit[j]
totalWeight += weights[j]
j += 1
if j < numItems:
result += (C - totalWeight) * profit[j]/weight[j]
return upperBound
So wie kann ich die Einzelteile erhalten, die die optimale Lösung, anstatt nur den Gewinn bilden?
Ich bin mir nicht sicher, dies wird eine maximale lineare Entspannung der Artikel Einschränkung geben. – franklin