17.09.2013 Aufrufe

5 Entwurfsmethoden für Algorithmen

5 Entwurfsmethoden für Algorithmen

5 Entwurfsmethoden für Algorithmen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!