21.08.2013 Aufrufe

3.5 Aufwandsabschätzung - WINFOR

3.5 Aufwandsabschätzung - WINFOR

3.5 Aufwandsabschätzung - WINFOR

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.

<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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!