Wie würden Sie das Rucksackproblem in einer dynamischen Programmiersituation angehen, wenn Sie jetzt die Anzahl der Elemente im Rucksack durch eine Konstante begrenzen müssten ? Dies ist das gleiche Problem (maximales Gewicht von , jeder Gegenstand hat einen Wert und ein Gewicht ), aber Sie können dem Rucksack nur Gegenstände hinzufügen und müssen natürlich den Wert des Rucksacks optimieren.
Brauchen wir eine 3. Dimension oder könnten wir einen anderen Ansatz ohne sie finden? Ich habe versucht, einfach die Anzahl der Artikel im Rucksack in der Zelle hinzuzufügen und den Maximalwert am Ende mit der Anzahl der Artikel <= aber es ist nicht die BESTE Lösung.
Antworten:
Sehr schöne Frage!
Sie haben zweimal recht:
Im Folgenden gehe ich davon aus, dass Sie mit der auf dynamischer Programmierung basierenden Lösung vertraut sind. Insbesondere werde ich nicht diskutieren, wie die Tabelle rückwärts durchlaufen wird, um die Lösung zu bestimmen .
Konzentrieren wir uns zunächst auf den typischen Fall: Die Anzahl der Elemente ist uneingeschränkt . In diesem Fall erstellen Sie einfach eine Tabelle in der T i , j den optimalen Wert enthält, wenn die Gesamtkapazität des Rucksacks gleich i ist und nur die ersten j Elemente berücksichtigt werden. Von hier:T. T.ich , j ich j
Dabei stehen und für das Gewicht und den Wert des ten Elements. Wennv j j C ist die Gesamtkapazität Ihres Rucksacks und es gibt insgesamt N Gegenstände. Die optimale Lösung ist durch T C , N gegeben . Es ist bekannt, dass dieser Algorithmus in pseudo-polynomieller Zeit ausgeführt wird, und eine seiner Schönheiten besteht darin, dass nur die Kombinationen berücksichtigt werden, die zur maximalen Kapazität passen.wj vj j C. N. T.C., N.
Dies reicht jedoch nicht aus, wenn Sie Ihre Einschränkung hinzufügen: eine maximale Anzahl von Elementen . Der Grund dafür ist, dass die vorherige Wiederholungsformel unterschiedliche Kombinationen von Elementen nicht berücksichtigt:p
Damit besteht eine erste Lösung darin, eine dritte Dimension hinzuzufügen. Für Ihren Fall sei die optimale Lösung, wenn die Kapazität des Rucksacks i beträgt , nur die ersten j Elemente berücksichtigt werden und nicht mehr als k Elemente in den Rucksack gelegt werden dürfen. Jetzt,Ti,j,k i j k
Der erste Ausdruck sollte klar sein. Die zweite funktioniert, da die -te Schicht der Tabelle T die beste Kombination von ( k - 1 ) Elementen unter den ersten ( j - 1 ) verfolgt, wie oben erforderlich.( k - 1 ) T. ( k - 1 ) ( j - 1 )
Eine effiziente Implementierung dieses Algorithmus muss für alle k berechnen . Beachten Sie, dass die vorhergehenden Wiederholungsbeziehungen die Schicht k mit ( k - 1 ) in Beziehung setzen und es daher möglich ist, zwischen zwei aufeinanderfolgenden Schichten zu wechseln (z. B. wenn Sie an der optimalen Lösung mit k = 4 interessiert sind, verwenden Sie nur zwei aufeinanderfolgende Schichten: 0 und 1, 1 und 2, 2 und 3, 3 und 4 und du bist fertig). Mit anderen Worten, dieser Algorithmus benötigt doppelt so viel Speicher wie der herkömmliche Ansatz, der auf dynamischer Programmierung basiert, und kann daher immer noch in Pseudo-Polynom-Zeit ausgeführt werden.T.i , j , k k k ( k - 1 ) k = 4
Beachten Sie jedoch, dass dies nicht die einzige Lösung ist! Und es gibt noch eine andere, die Sie vielleicht eleganter finden. In den vorhergehenden Formeln haben wir die optimale Lösung gefunden, die aus nicht mehr als Elementen unter den ersten ( j - 1 ) als T i , j - 1 , k - 1 bestand . Es sollte jedoch klar sein, dass dies genau gleich max p = 0 , j - 1 { T i , p } ist.( k - 1 ) ( j - 1 ) T.i , j - 1 , k - 1 maxp = 0 , j - 1{ T.ich , p}} nur mit der Originaltabelle !! Das heißt, die optimale Lösung mit nicht mehr als Elementen kann auch abgerufen werden, indem die optimalen Lösungen mit 1 Element, 2 Elementen, 3 Elementen, ... ( j - 1 ) Elementen ... berücksichtigt werden, damit diese Formulierung funktioniert Verfolgen Sie auch die Anzahl der Elemente, die in jeder Teillösung berücksichtigt werden, sodass Sie zwei Ganzzahlen pro Zelle benötigen. Diese Speicherbelegung führt zu genau den gleichen Speicheranforderungen des oben gezeigten Algorithmus (unter Verwendung einer dritten Dimension in Form von Schichten k ) .k ( j - 1 ) k
Hoffe das hilft,
quelle