3.5 Aufwandsabschätzung - WINFOR
3.5 Aufwandsabschätzung - WINFOR
3.5 Aufwandsabschätzung - WINFOR
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>3.5</strong> <strong>Aufwandsabschätzung</strong><br />
Bei der Auswahl eines Algorithmus für eine<br />
Lösung wird stets<br />
ein korrekter Algorithmus ausgewählt. Stehen<br />
mehrere korrekte Algorithmen zur Auswahl wird<br />
hieraus<br />
ein effizienter Algorithmus ausgewählt, d.h. ein<br />
Algorithmus der hinsichtlich der betrachteten<br />
Kapazitätsbeanspruchung einen Aufwand verursacht,<br />
der nicht durch einen anderen Algorithmus in allen<br />
Kategorien nicht übertroffen wird und in mindestens<br />
einer Kategorie unterboten wird<br />
Als Kategorien werden die Betriebsmittel<br />
Rechenzeit und<br />
Speicherplatz<br />
betrachtet<br />
Wirtschaftsinformatik und Operations Research<br />
473
Beachte<br />
Die Kategorien Speicherplatz und Rechenzeit sind<br />
konfliktär, d.h. unter Umständen gegenläufig<br />
Konkret bedeutet dies zum Beispiel, dass durch die Bereitstellung<br />
umfangreicher Datenstrukturen Rechenoperationen vermieden<br />
werden können und somit Rechenzeiten gesenkt werden können<br />
Andersherum, lässt sich auch der Speicherplatzbedarf durch<br />
Neuberechnungen reduzieren. Hierbei wächst dann der<br />
Zeitaufwand der Algorithmen entsprechend<br />
Hieraus ergibt sich eine mehrdimensionale Zielsetzung<br />
bei der Algorithmenentwicklung<br />
Ein Algorithmus heißt somit effizient für ein<br />
spezifiziertes Problem, falls es keinen anderen<br />
Algorithmus für dieses Problem gibt, der<br />
weniger Speicherbedarf bei höchstens gleichem Zeitaufwand oder<br />
weniger Zeitaufwand bei höchstens gleichem Speicherbedarf<br />
verursacht<br />
Wirtschaftsinformatik und Operations Research<br />
474
Größenordungen<br />
Aufwand wird in der Regel nur asymptotisch, d.h.<br />
in seiner Größenordnung erfasst<br />
Dabei werden Abschätzungen vorgenommen, die<br />
durch empirische Analysen zu spezifizieren sind<br />
Größenordnung wird durch eine mathematische<br />
Analyse ermittelt<br />
Konstanten werden anschließend durch Experimente<br />
genauer ausgewertet<br />
Mögliches Beispiel<br />
Ein Algorithmus hat die asymptotische Laufzeit c . n 4<br />
Anschließend ist die Konstante c näher durch<br />
Experimente zu untersuchen<br />
Wirtschaftsinformatik und Operations Research<br />
475
Abschätzungsarten<br />
Schlimmster Fall (worst case)<br />
Maximaler Aufwand der bei allen möglichen Eingaben auftreten<br />
kann<br />
D.h. es wird die ungünstigste Konstellation ermittelt und dann<br />
näher analysiert<br />
Häufigster Untersuchungsgegenstand<br />
Bester Fall (best case)<br />
Minimaler Aufwand der bei allen möglichen Eingaben auftreten<br />
kann<br />
D.h. es wird die günstigste Konstellation ermittelt und dann näher<br />
analysiert<br />
Von geringer Relevanz<br />
Mittlerer Fall (average case)<br />
Es wird über alle möglichen Eingaben der durchschnittliche<br />
Aufwand bestimmt<br />
Von höchster Relevanz<br />
Leider häufig schwer analysierbar (unendlich viele<br />
Eingabekonstellationen)<br />
Wirtschaftsinformatik und Operations Research<br />
476
<strong>3.5</strong>.1 Der exakte Aufwand<br />
Kann nur für einzelne Eingaben berechnet<br />
werden<br />
Ist von vielen Faktoren abhängig, die unabhängig<br />
vom gewählten Algorithmus sind und deshalb zu<br />
einer Verzerrung der Bewertung führen können.<br />
Dies sind z.B.<br />
Programmierstil<br />
Gewählte Programmiersprache<br />
Gewählter Übersetzer<br />
Gewählte Maschine<br />
Deshalb: Systematische Vereinheitlichung der<br />
Analyse durch Abstraktionen<br />
Wirtschaftsinformatik und Operations Research<br />
477
Von Neumann Rechnermodell<br />
Anstelle eines realen Rechners führt ein abstraktes<br />
Maschinenmodell unsere Algorithmen aus<br />
Dies ist die Random Access Machine (RAM)<br />
Modell des von Neumann Rechners (Programm ist ein<br />
Datum)<br />
Rechenzeit für Elementaroperationen und<br />
Speicherzugriffe sind durch eine vorgegebene Konstante<br />
beschränkt (Einheitskostenmaß)<br />
Eingabeumfang (Anzahl von Variablen, Parametern) wird<br />
durch n gemessen, wodurch sich der Aufwand in<br />
Abhängigkeit von n ergibt<br />
Die Aufwandsfunktionen werden jeweils auf die<br />
bestimmende Größenordnung vergröbert<br />
Wirtschaftsinformatik und Operations Research<br />
478
Eingesetzte Notationen<br />
Im Einzelnen sind wir an der Ermittlung der folgenden<br />
Größen interessiert:<br />
T min (n): Rechenzeit im besten Fall bei Eingabegröße n<br />
T max (n): Rechenzeit im schlechtesten Fall bei<br />
Eingabegröße n<br />
T avg (n): Rechenzeit im durchschnittlichen Fall bei<br />
Eingabegröße n<br />
S min (n): Speicherplatzbedarf im besten Fall bei<br />
Eingabegröße n<br />
S max (n): Speicherplatzbedarf im schlechtesten Fall bei<br />
Eingabegröße n<br />
S avg (n): Speicherplatzbedarf im durchschnittlichen Fall<br />
bei Eingabegröße n<br />
Wirtschaftsinformatik und Operations Research<br />
479
Beispiel – Sequentielle Suche<br />
Wir wollen nun den Aufwand der einfachen Suche<br />
analysieren<br />
Funktion Suche (A, a, l, r)<br />
if (l>r)<br />
then p:=0<br />
else<br />
end if<br />
p:=r /* Wir suchen von rechts nach links */<br />
if (A p ≠a)<br />
end if<br />
– then p:=Suche(A, a, l, p-1) /* Abstieg in die Rekursion */<br />
Wirtschaftsinformatik und Operations Research<br />
480
Best case<br />
Zunächst überlegen wir was die optimale, d.h.<br />
beste Problemkonstellation für unsere<br />
sequentielle Suche wäre, d.h. genau die<br />
Konstellation, bei der das Suchverfahren die<br />
wenigsten Rechenschritte ausführen muss<br />
Wir sehen unmittelbar<br />
T min (0)=2 (Vergleich l und r & Zuweisung)<br />
n>0: T min (n)=3 (Vergleich l und r, Zuweisung &<br />
Vergleich)<br />
Damit konstanter Aufwand im best case<br />
Damit wenden wir uns nun dem ungünstigsten<br />
Fall, dem worst case zu<br />
Wirtschaftsinformatik und Operations Research<br />
481
Worst case<br />
Offensichtlich entsteht der größte<br />
Rechenaufwand, d.h. der Algorithmus führt dann<br />
die meisten Schritte aus, wenn das gesuchte<br />
Element nicht in der Folge vorkommt<br />
In diesem Fall sind alle Folgeglieder<br />
nacheinander zu überprüfen<br />
Damit erhalten wir unmittelbar<br />
T max (0)=2 (Vergleich l und r & Zuweisung)<br />
n>0: T min (n)=4+T min (n-1) (Vergleich l und r, Zuweisung,<br />
Vergleich & Zuweisung)<br />
Damit erhalten wir insgesamt<br />
T min (n)=4 . n+2<br />
Wirtschaftsinformatik und Operations Research<br />
482
Worst case – Beweis der Rekursion<br />
Induktionsanfang (n=0)<br />
Induktionsschritt<br />
( )<br />
T 0 = 4⋅ n+ 2= 2<br />
max<br />
Es gelte die Behauptung für n≥0<br />
( ) ( ) ( )<br />
T n = 4+ T n− 1 = 4+ 4⋅ n− 1 + 2<br />
max max<br />
= 4+ 4⋅n− 4+ 2= 4⋅ n+ 2<br />
Damit ist die Behauptung bewiesen<br />
Wirtschaftsinformatik und Operations Research<br />
483
Average case<br />
Hierfür müssen wir gewisse Annahmen<br />
hinsichtlich der Verteilung der betrachteten Folge<br />
machen<br />
So gehen wir davon aus, dass jedes Element der<br />
Folge mit gleicher Wahrscheinlichkeit (=(n+1) -1 )<br />
gesucht wird<br />
Zudem unterstellen wir vereinfachend, dass mit<br />
gleicher Wahrscheinlichkeit (=(n+1) -1 ) ein<br />
Element gesucht wird, das nicht in der Folge<br />
vorhanden ist<br />
Wirtschaftsinformatik und Operations Research<br />
484
Wir definieren<br />
( )<br />
T n,j<br />
Notation<br />
als Aufwand falls bei einer Folge von n Elementen der gesuchte Eintrag<br />
an der j-ten Stelle von hinten vorkommt<br />
j=0 bedeutet dabei, dass das Element nicht in der Folge vorkommt<br />
Mit Hilfe dieser Notation gilt offensichtlich<br />
Zur Berechnung des Aufwandes sind die einzelnen Elemente zu<br />
bestimmen<br />
Offensichtlich gilt T( n,0) = Tmax ( n)<br />
und<br />
j> 0:T n,j = T j− 1 +<br />
1<br />
( ) ( )<br />
max<br />
Warum?<br />
Wenn es das j-te Element von hinten ist, dann entspricht dies dem worst<br />
case für j-1 Elemente ohne die letzten beiden Befehle und<br />
drei weitere Operationen<br />
Damit also insgesamt eine zusätzliche Operation<br />
( )<br />
T n<br />
Wirtschaftsinformatik und Operations Research<br />
avg<br />
=<br />
n<br />
∑<br />
j= 0<br />
( )<br />
T n,j<br />
n+ 1<br />
485
Durchschnittlicher Aufwand<br />
Aufgrund dieser Berechnungen erhalten wir insgesamt<br />
avg<br />
( )<br />
T n<br />
n n<br />
∑T( n,j) Tmax ( n) + ∑(<br />
1+ Tmax ( j−1) )<br />
j= 0 j= 1<br />
= =<br />
n+ 1 n+ 1<br />
n n<br />
( ( ) ) ( )<br />
∑ ∑<br />
4⋅ n+ 2+ 1+ 4⋅ j− 1 + 2 4⋅ n+ 2+ 4⋅j−1 =<br />
j1 =<br />
n+ 1<br />
=<br />
j1 =<br />
n+ 1<br />
n n<br />
∑ ∑<br />
4⋅ n+ 2− n+ 4⋅j 3⋅ n+ 2+ 4⋅ j<br />
j1 = j1 = 3n ⋅ + 2+ 2n ⋅ ⋅ n+ 1<br />
= = =<br />
n+ 1 n+ 1 n+ 1<br />
3⋅ ( n+ 1) + 2⋅n⋅ ( n+ 1) + 1 1<br />
= = 2⋅ n+ 3+ ≈2⋅ n+ 3<br />
n+ 1 n+ 1<br />
Wirtschaftsinformatik und Operations Research<br />
( )<br />
486
Exakter Aufwand<br />
Häufig ist es nicht so einfach möglich den<br />
durchschnittlichen Aufwand oder den maximalen Aufwand<br />
zu bestimmen<br />
Dann sind wir schon mit einer Näherung zufrieden<br />
Diese Näherung sollte dann lediglich das asymptotische<br />
Verhalten des Rechenaufwandes wiedergeben<br />
Für den asymptotischen Aufwand ist lediglich der Term<br />
relevant, der mehr und mehr das Verhalten der Funktion<br />
für große Eingabewerte von n bestimmt<br />
In unserem Fall also für<br />
den worst case: 4 . n<br />
und im average case: 2 . n<br />
oder einfach allgemein n, d.h. linearer Aufwand<br />
Wirtschaftsinformatik und Operations Research<br />
487
<strong>3.5</strong>.2 Asymptotischer Aufwand – O Kalkül<br />
Das O-Kalkül gestattet es, komplizierte<br />
Aufwandsfunktionen durch ihre wesentlichen Anteile zu<br />
klassifizieren, die für große Werte des<br />
Aufwandsparameters n allein die Art des Wachstums der<br />
Aufwandsfunktion bestimmen<br />
t<br />
( ) 6 4 2<br />
n = 17⋅<br />
n + 6⋅<br />
n + 3⋅<br />
n + 5<br />
Unterdrückung konstanter Anteile<br />
( n)<br />
t =<br />
⋅<br />
6 4 2<br />
17⋅ n + 6⋅<br />
n + 3 n<br />
Unterdrückung von Summanden kleinerer Ordnung<br />
( n)<br />
t = 17⋅ n<br />
Unterdrückung von konstanten Faktoren<br />
6 ( n)<br />
n<br />
t =<br />
Wirtschaftsinformatik und Operations Research<br />
6<br />
488
Asymptotischer Aufwand – O Kalkül<br />
Man sagt:<br />
Gesprochen:<br />
Und man meint:<br />
t<br />
( n)<br />
steigt<br />
stärker<br />
als<br />
( ) ( 6<br />
n O n )<br />
t ∈<br />
ab<br />
t<br />
die<br />
( ) ( 6<br />
n hat die Ordnung O n )<br />
einer<br />
bestimmten<br />
Funktion<br />
n<br />
6<br />
Eingabegröße<br />
Wirtschaftsinformatik und Operations Research<br />
nicht<br />
489
Seien<br />
∃c<br />
t,g:IN<br />
Funktionen,<br />
> 0 : ∃n<br />
Definition des O-Kalküls<br />
0<br />
IR<br />
> 0 : ∀n<br />
( t,g:IR → IR )<br />
→ +<br />
+<br />
dann<br />
gilt<br />
><br />
t<br />
( n)<br />
∈O(<br />
g(<br />
n)<br />
)<br />
n<br />
( n)<br />
≤ c ⋅ g(<br />
n)<br />
Asymptotisch wächst t nicht stärker als g<br />
Auch<br />
gilt<br />
0<br />
somit<br />
: t<br />
:<br />
limn→∞<br />
positive<br />
t<br />
g<br />
wenn<br />
( n)<br />
( n)<br />
≤<br />
Wirtschaftsinformatik und Operations Research<br />
reellwertige<br />
gilt<br />
c<br />
:<br />
490
Klasse<br />
O(1)<br />
O(log(n))<br />
O(n)<br />
O(n . log(n))<br />
O(n 2 )<br />
O(n!)<br />
O(2 n )<br />
Typische Aufwandsklassen<br />
Vertreter<br />
Polynomiell lösbare Probleme<br />
Minimum aus geordneter Folge<br />
Binäre Suche<br />
Sequentielle Suche<br />
Schnelles Sortieren<br />
Elementares Sortieren<br />
Exponentiell lösbare Probleme<br />
Rucksack Problem<br />
Travelling Salesman Problem<br />
Wirtschaftsinformatik und Operations Research<br />
491
Aufwandsanalyse rekursiver Algorithmen<br />
Rekursive Algorithmen der einfachen Form<br />
Typ 1: f(n): … f(n-1) …<br />
Typ 2: f(n): … f(n/c) … f(n/c) …<br />
führen zu folgenden allgemeinen<br />
Rekurrenzgleichungen für den Aufwand<br />
Typ 1:<br />
Typ 2:<br />
( )<br />
t n<br />
⎧b<br />
für n=1<br />
= ⎨<br />
⎩t(<br />
n− 1) + d⋅( n−1<br />
) für n>1<br />
⎧b<br />
für n=1<br />
⎪ ⎛n⎞ = ⎨ ⎜ ⎟<br />
⎪ <br />
⎝c⎠ ⎪Anzahl<br />
der Aufrufe<br />
⎩ von Teilproblemen<br />
für n>1<br />
Nebenaufwand zur<br />
Verarbeitung<br />
der Teilergebnisse<br />
( ) a⋅ t + b⋅n t n<br />
Wirtschaftsinformatik und Operations Research<br />
492
Lösung der rekursiven Formel vom Typ 1<br />
Wir erhalten als Aufwand für den Typ 1<br />
n<br />
Typ 1: t n b d n 1 O n<br />
2<br />
( ) ( ) ( 2<br />
= + ⋅ ⋅ − ∈ )<br />
Dies lässt sich sehr einfach zeigen<br />
1<br />
Induktionsanfang: t() 1 = b+ d⋅ ⋅( 1− 1) = b+ 0 = b⇒korrekt<br />
2<br />
n −1<br />
Induktionsschritt: t n t n 1 d n 1 b d n 1 1 d n 1<br />
2<br />
2<br />
n−1 n −3⋅ n+ 2+ 2⋅n−2 = b+ d⋅ ⋅( n− 2) + d⋅( n− 1)<br />
= b+ d⋅<br />
2 2<br />
2<br />
n − n n⋅( n−1)<br />
n<br />
= b+ d⋅ = b+ d⋅ = b+ d⋅ ⋅( n−1)<br />
⇒korrekt<br />
2 2 2<br />
( ) = ( − ) + ⋅( − ) = + ⋅ ⋅( − − ) + ⋅( − )<br />
Wirtschaftsinformatik und Operations Research<br />
493
Lösung der rekursiven Formel vom Typ 2<br />
Wir erhalten als Aufwand für den Typ 2<br />
Typ 2:<br />
( )<br />
( )<br />
( )<br />
logc<br />
( a<br />
⎛ )<br />
logc ( a)<br />
a ⎞<br />
=<br />
( )<br />
logc n<br />
⎛a⎞ t( n) = b⋅n⋅ ∑ ⎜ ⎟<br />
i=<br />
0 ⎝c⎠ logc n<br />
⎛a⎞ ⇒ 1 .a< c: b⋅n⋅ ∑ ⎜ ⎟ ∈On<br />
i=<br />
0 ⎝c⎠ ( )<br />
logc n<br />
⎛a⎞ ⇒ 2 .a= c: b⋅n⋅ ∑ ⎜ ⎟ ∈On⋅logn i=<br />
0 ⎝c⎠ i<br />
i<br />
i<br />
( ( ) )<br />
c ⎛ ( ) ⎞ ⎛ ( )<br />
logc ( a)<br />
⎞<br />
⎜ ⎟ ⎜ log ( a)<br />
⎟<br />
i log a<br />
logc n logc a<br />
⎛a⎞ ⎛a⎞ a<br />
⇒ 3 .a> c: b⋅n⋅ ∑ ⎜ ⎟ ∈On⋅ ⎜ ⎟ = O n ⋅<br />
c<br />
i=<br />
0 ⎝c⎠ ⎜ ⎝c⎠ ⎟<br />
⎝ ⎠ ⎝ c ⎠<br />
= O⎜n ⋅ ⎟<br />
⎝ a ⎠<br />
( log ( ) ) c a<br />
O n<br />
Wirtschaftsinformatik und Operations Research<br />
494
Lösung der rekursiven Formel vom Typ 2<br />
Die allgemeine Formel lässt sich sehr einfach<br />
zeigen<br />
0<br />
⎛a⎞ ⎛a⎞ Induktionsanfang: t() 1 = b⋅1⋅ ∑⎜<br />
⎟ = b⋅1⋅ ⎜ ⎟ = b⋅ 1 = b⇒korrekt<br />
i=<br />
0 ⎝ c⎠ ⎝c⎠ logc ( n)<br />
−1<br />
i<br />
⎛ ⎞<br />
⎛n⎞ ⎛n⎞ Induktionsschritt: t( n) = a⋅ t⎜ ⎟+ b⋅ n = a⋅⎜b⋅⎜ ⎟⋅ ⎝c⎠ ⎜<br />
⎝ ⎝c⎠ ∑<br />
i=<br />
0<br />
⎛a⎞ ⎜ ⎟ ⎟+<br />
b⋅n ⎝ c⎠<br />
⎟<br />
⎠<br />
logc( n) i logc( n)<br />
i<br />
logc ( n)<br />
i<br />
⎛a⎞ ⎛ ⎛a⎞ ⎞ ⎛a⎞ = bn ⋅ ⋅ ∑ ⎜ ⎟ + bn ⋅ = bn ⋅ ⋅⎜<br />
⎜ ⎟ + 1 = bn ⋅ ⋅ ⇒korrekt<br />
i= 1 ⎝c⎠ ⎜ ∑ ⎟<br />
i=<br />
1 ⎝ c⎠<br />
⎟ ∑<br />
⎜ ⎟<br />
⎝ ⎠<br />
i=<br />
0 ⎝c⎠ Die hergeleiteten Formeln lassen sich auf viele<br />
Beispiele direkt anwenden<br />
i<br />
Wirtschaftsinformatik und Operations Research<br />
0<br />
495
<strong>3.5</strong>.3 Binäre Suche<br />
Im Folgenden betrachten wir die so genannte<br />
binäre Suche auf einer Folge<br />
Bisher haben wir lediglich sequentiell gesucht<br />
D.h., in Unkenntnis zusätzlicher Informationen<br />
über die einzelnen Folgeglieder sind wir die Folge<br />
von vorne nach hinten oder von hinten nach<br />
vorne durchgegangen<br />
Damit entsteht sowohl im schlechtesten wie auch<br />
im durchschnittlichen Fall ein linearer Aufwand,<br />
d.h., wir führen asymptotisch zur Folgenlänge<br />
viele Schritte aus<br />
Wirtschaftsinformatik und Operations Research<br />
496
Sortierte Folge<br />
Wenn wir aber – im Gegensatz dazu – eine<br />
sortierte Folge vorliegen haben, lassen sich<br />
durch jeden einzelnen Vergleich wichtige<br />
zusätzliche Informationen ableiten<br />
So ist sofort klar, dass bei einer ansteigend<br />
sortierten Folge für ein gesuchtes Element a f t
while l≤r do<br />
p:=(l+r) DIV 2<br />
if a≤A p<br />
then r:=p-1<br />
end if<br />
if a≥A p<br />
then l:=p+1<br />
end if<br />
end while<br />
if r≠l-2<br />
then p:=0<br />
end if<br />
Binäre Suche<br />
Man sieht: Wird a gefunden, gilt r=p-1 und l=p+1<br />
Wirtschaftsinformatik und Operations Research<br />
498
Falls n=0<br />
<strong>Aufwandsabschätzung</strong><br />
Nun gilt l>r (Vergleich)<br />
Zweiter Vergleich (if r≠l-2)<br />
Zuweisung (p:=0)<br />
Gesamtaufwand: 3 Anweisungen<br />
Falls n>0<br />
Für eine Lösung des Problems der Größe n wird ein<br />
rekursiver Aufruf der Größe n/2 getätigt<br />
Daneben maximal 5 Befehle<br />
Zuweisung (p:=(l+r) DIV 2)<br />
2 Vergleiche<br />
2 Zuweisungen<br />
Wirtschaftsinformatik und Operations Research<br />
499
Damit ergibt sich<br />
<strong>Aufwandsabschätzung</strong><br />
A<br />
max<br />
( )<br />
0 = 3<br />
⎛⎢n+ 1⎥<br />
⎞<br />
Amax ( n+ 1) = 5+<br />
Amax<br />
⎜⎢2⎥⎟ ⎝⎣⎦⎠ Wirtschaftsinformatik und Operations Research<br />
500
n<br />
0<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
Aufwandabschätzung<br />
floor(log 2 (n))<br />
-<br />
0<br />
1<br />
1<br />
2<br />
2<br />
2<br />
2<br />
3<br />
A max (n)<br />
5+ A max (0)=8<br />
5+ A max (1)=13<br />
5+ A max (1)=13<br />
5+ A max (2)=18<br />
5+ A max (2)=18<br />
5+ A max (3)=18<br />
5+ Amax (3)=18<br />
5+ Amax (4)=23<br />
Wirtschaftsinformatik und Operations Research<br />
3<br />
501
<strong>Aufwandsabschätzung</strong><br />
Damit ergibt sich als Gesamtaufwand<br />
( ) ( )<br />
( )<br />
( ⎢ ) 2 ⎥<br />
2(<br />
)<br />
Amax n = 5⋅ ⎣log n ⎦+<br />
1 + 3∈O<br />
log n<br />
Damit haben wir eine signifikante Reduktion des<br />
Rechenaufwandes erreicht<br />
Beachte<br />
Das Prinzip „Teile und Herrsche“ (Englisch: „Divide and<br />
Conquer“) wurde bei der binären Suche angewendet<br />
Das heißt, das Gesamtproblem wurde in der Weise gelöst, dass<br />
es aufgeteilt (verkleinert) wurde und die Einzellösungen mit Hilfe<br />
einer gefundenen Gesetzmäßigkeit zur Gesamtlösung<br />
zusammengesetzt wurden<br />
Dieses wichtige Prinzip findet seine Anwendung für eine Reihe<br />
von Problemstellungen<br />
Wirtschaftsinformatik und Operations Research<br />
502
3.6 Ausgewählte Algorithmentechniken<br />
Dynamische Programmierung<br />
Erweiterung des „Divide and Conquer” in der Weise, dass das<br />
Gesamtproblem mit Hilfe einer gefunden rekursiven Gleichung in kleinere<br />
Probleme zerlegt wird und aus den Teillösungen die Lösung des<br />
Gesamtproblems erzeugt wird<br />
Dieses Prinzip wird innerhalb der Dynamischen Programmierung in der<br />
Weise vollständig durchgeführt, dass alle möglichen Teilprobleme des<br />
betrachteten Gesamtproblems gelöst werden<br />
Auf diese Weise werden rückwärts ausgehend von den elementaren<br />
Problemen alle größeren Probleme gelöst<br />
Branch & Bound<br />
Bei dieser Technik wird das Gesamtproblem ebenfalls schrittweise<br />
verkleinert<br />
Diesmal allerdings in der Weise, dass in jedem Verzweigungsschritt für<br />
ausgewählte Teile der Lösung alle möglichen Belegungen getestet<br />
werden (Branching)<br />
Hierdurch verkleinert sich das Problem und es werden untere und obere<br />
Schranken für eine gegebene Konstellation bestimmt, um zu<br />
entscheiden, ob diese Teillösung noch einer neuen optimalen Lösung<br />
ergänzt werden kann (Bounding)<br />
Wirtschaftsinformatik und Operations Research<br />
503
3.6.1 Dynamische Programmierung<br />
Wir erläutern diese Technik anhand eines einfachen und<br />
sehr bekannten Beispiels<br />
Betrachtetes Problem: All pair shortest path<br />
Gegeben:<br />
Gewichteter Graph G=(V,E)<br />
V ist die Knotenmenge des Graphen<br />
E ist die Kantenmenge des Graphen<br />
∀(v,w)∈VxV: c(v,w) Kantengewicht<br />
Gesucht:<br />
– mit c(v,w)>0: Gewicht der Kante zwischen v und w<br />
– mit c(v,w)=0 für v=w<br />
– Mit c(v,w)=∞sonst Matrix A (a(v,w)) mit<br />
a(v,w) als Länge des kürzesten Pfades p von v nach w (Summe der<br />
Kantengewichte der Kanten entlang des Pfades)<br />
Wirtschaftsinformatik und Operations Research<br />
504
Lösung des Problems<br />
Wir definieren eine neue Matrix A i , die<br />
schrittweise in die Ergebnismatrix überführt wird<br />
Dazu definieren wir konkret<br />
i<br />
{ } ( )<br />
∀∈ i 0, 1 ,...,n : ∀v,w∈ V × V: a v,w bezeichnet die Länge<br />
des längsten Pfades von v nach w unter ausschließlicher<br />
{ }<br />
Nutzung von Knoten j ∈ 1 ,...,i als Zwischenstationen<br />
Wir können direkt festhalten<br />
( ) ( )<br />
∀ ∈ × =<br />
0<br />
v,w V V: a v,w c v,w<br />
Wirtschaftsinformatik und Operations Research<br />
505
Die rekursive Berechnungsformel<br />
Wird der kürzeste Pfad von v nach w über alle<br />
Knoten kleiner gleich p gesucht und sind alle<br />
kürzesten Pfade unter Verwendung der Knoten<br />
mit Index kleiner gleich p-1 bekannt so gilt<br />
Entweder geht dieser Pfad über Knoten p<br />
Dann aber als kürzester Weg von v nach p über alle Knoten<br />
kleiner gleich p<br />
Und anschließend von p nach w über alle Knoten kleiner<br />
gleich p<br />
Oder dieser Pfad geht nicht über Knoten p; dann<br />
entspricht er dem bereits bekannten Pfad über alle<br />
Knoten kleiner gleich p<br />
Aus diesen Überlegungen folgt bereits die<br />
folgende rekursive Berechnungsformel<br />
Wirtschaftsinformatik und Operations Research<br />
506
Rekursive Berechnungsformel<br />
Wir erhalten somit<br />
{ 1 }<br />
( ) =<br />
−1( ) −1( ) +<br />
−1(<br />
)<br />
( ) =<br />
( )<br />
∀p ∈ ,...,n : ∀v,w∈ V × V :<br />
0<br />
a v,w c v,w<br />
Offensichtlich gilt<br />
{ }<br />
p p p p<br />
a v,w min a v,w ,a v, p a p,w<br />
A p kann direkt aus A p-1 bestimmt werden<br />
A n ist die gesuchte Matrix mit allen kürzesten Wegen<br />
A 0 ist direkt aus der Kantengewichtematrix c<br />
ermittelbar<br />
Wirtschaftsinformatik und Operations Research<br />
507
for v:=1 to n do<br />
for w:=1 to n do<br />
a(v,w):=c(v,w)<br />
for v:=1 to n do<br />
for w:=1 to n do<br />
Lösungsverfahren<br />
for p:=1 to n do<br />
/* Nun sind alle Einträge a(v,p) und a(p,w) bereits für p-1<br />
aktualisiert */<br />
– a(v,w):=min{ a(v,w), a(v,p)+a(p,w) }<br />
end do<br />
end do<br />
end do<br />
Wirtschaftsinformatik und Operations Research<br />
508
Komplexität<br />
Ansätze der Dynamischen Programmierung lassen sich<br />
sehr leicht hinsichtlich ihres zeitlichen Rechenaufwandes<br />
analysieren<br />
So besitzen sie häufig ein sehr stabiles Verhalten, d.h.<br />
worst und best case fallen in der Regel zusammen<br />
Offensichtlich ergibt sich im konkreten Fall unabhängig<br />
von konkreten Werten der Zeitaufwand O(n 3 )<br />
Am konkreten Beispiel zeigte sich die Mächtigkeit des<br />
Instrumentes<br />
Es gibt eine Reihe von wichtigen Problemen, für die erste<br />
polynomiell zeitbeschränkte Lösungsverfahren lediglich<br />
auf der Basis der dynamischen Programmierung bekannt<br />
sind<br />
Wirtschaftsinformatik und Operations Research<br />
509