5 Entwurfsmethoden für Algorithmen
5 Entwurfsmethoden für Algorithmen
5 Entwurfsmethoden für Algorithmen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Also ist der Gewinn der modifizierten Rucksackfüllung nicht größer als der unter der berechneten<br />
Rucksackfüllung. Da sich jede andere Rucksackfüllung, welche die Kapazität ausschöpft,<br />
durch mehrere derartige Modifikationen ergibt, in denen ein Fragment z = xℓ − x von Objekt ℓ<br />
durch ein Fragment z ′ = y − x j eines anderen Objekts j mit ℓ < j ersetzt wird, ist die berechnete<br />
Lösung optimal. Wegen der Annahme w1 +...+wn > K und da alle Gewinne positiv sind,<br />
kommen nur Rucksackfüllungen, welche die Kapazität ausschöpfen, als optimale Lösungskandidatinnen<br />
in Frage.<br />
Weiter halten folgende offensichtliche Aussage fest:<br />
Lemma 5.2.6 (Obere und untere Schranken des {0,1}-Rucksackproblems). Der Gewinn einer<br />
optimalen Lösung des rationalen Rucksackproblems (Algorithmus 47) ist eine obere Schranke<br />
<strong>für</strong> den Gewinn einer optimalen Lösung <strong>für</strong> das zugehörige {0,1}-Rucksackproblem. Algorithmus<br />
48 liefert eine untere Schranke <strong>für</strong> den Gewinn einer optimalen Lösung des {0,1}-Rucksackproblems.<br />
Im folgenden werden wir <strong>Algorithmen</strong> vorstellen, die eine optimale Rucksackfüllung <strong>für</strong> das<br />
{0,1}-Rucksack-Problem ermitteln.<br />
Backtracking-Algorithmus <strong>für</strong> das {0,1}-Rucksackproblem. Wir lösen das {0,1}-Rucksackproblem<br />
mit einem Backtracking-Algorithmus, dem ein binärer Aufzählungsbaum zugrundeliegt.<br />
In jedem inneren Knoten der Tiefe i − 1 findet die Entscheidung xi = 0 (i-tes Objekt wird<br />
nicht mitgenommen) oder xi = 1 (i-tes Objekt wird mitgenommen) statt. Dies entspricht dem<br />
Berechnungsbaum der nicht-deterministischen Guess & Check Methode “rate n Bits x1,...,xn<br />
und prüfe, ob die Mitnahme der Objekte i mit xi = 1 eine zulässige Rucksackfüllung ergibt”. In<br />
diesem Aufzählungsbaum suchen wir nun nach einer Lösung, welche den Gewinn maximiert.<br />
Der Backtracking-Algorithmus (siehe Algorithmus 49 auf Seite 183) benutzt einen rekursiven<br />
Algorithmus Rucksack(i,〈x1,...,xi−1〉), welcher initial mit Rucksack(1,〈·〉) aufgerufen wird<br />
und welcher Teile des Aufzählungsbaums durchläuft. Dieser verwendet eine globale Variable<br />
optgewinn, die initial den Wert −∞ hat und die jeweils den Gewinn der besten bisher gefundenen<br />
Lösung angibt. Das n-Tupel optlsg stellt am Ende eine optimale Rucksackfüllung dar.<br />
Algorithmus 49 Backtracking Algorithmus Rucksack(i,〈x1,...,xi−1〉) (Variante 1)<br />
IF i ≤ n THEN<br />
Rucksack(i+1,〈x1,...,xi−1,0〉)<br />
IF Gewicht(x1,...,xi−1,1) ≤ K THEN<br />
Rucksack(i+1,〈x1,...,xi−1,1〉)<br />
FI<br />
ELSE<br />
IF optgewinn < Gewinn(x1,...,xn) THEN<br />
optgewinn := Gewinn(x1,...,xn);<br />
optlsg := (x1,...,xn)<br />
FI<br />
FI<br />
Aus Effizienzgründen sollten der jeweils aktuelle Gewinn und das aktuelle Gewicht (also die<br />
Zahlen Gewinn(x1,...,xi−1) und Gewicht(x1,...,xi−1)) als weitere Parameter in Rucksack(i,...)<br />
183