Matrix-Kettenmultiplikation

Aus testwiki
Version vom 2. April 2019, 07:55 Uhr von imported>Crazy1880 (dafür kein HTML (ID 11))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Matrix-Kettenmultiplikation bezeichnet die Multiplikation von mehreren Matrizen. Da die Matrizenmultiplikation assoziativ ist, kann man dabei beliebig klammern. Dadurch wächst die Anzahl der möglichen Berechnungswege überpolynomial mit der Länge der Matrizenkette an. Mit der Methode der dynamischen Programmierung kann die Klammerung der Matrix-Kette optimiert werden, so dass die Gesamtanzahl arithmetischer Operationen minimiert wird. Der Algorithmus hat eine Laufzeit von O(n3).

Die Anzahl der möglichen Klammerungen für n Matrizen lässt sich mit der Catalan-Zahl Cn-1 bestimmen.

Beispiel: Sei A eine 10×30 Matrix, B eine 30×5 Matrix und C eine 5×60 Matrix. Dann gibt es zwei verschiedene Arten, das Matrizenprodukt ABC zu klammern:

(AB)C
A(BC)

Die Anzahl der grundlegenden Operationen berechnet sich wie folgt:

(AB)C(10305)+(10560)=1500+3000=4500
A(BC)(30560)+(103060)=9000+18000=27000

Algorithmus

Der Algorithmus berechnet mittels dynamischer Programmierung eine Ergebnis-Matrix. Bei einer Kette A0A1A2An1 von n Matrizen ist die Eingabe des Algorithmus die Sequenz s der Dimensionspaare s=[(𝑓𝑖𝑟𝑠𝑡𝑑𝑖𝑚(Ai),𝑠𝑒𝑐𝑜𝑛𝑑𝑑𝑖𝑚(Ai))|0i<n], wobei die Funktion firstdim bzw. seconddim angewendet auf eine m×n-Matrix m bzw. n zurückgibt.

s[0..2] bezeichnet die Teilsequenz von s, die die ersten beiden Dimensionspaare enthält. Also ist s[0..𝑙𝑒𝑛𝑔𝑡(s)]=s.

Der Algorithmus wird durch eine Matrix-Rekurrenz spezifiziert.

Initialisierung

M[i,i+2]=𝑓𝑖𝑟𝑠𝑡𝑑𝑖𝑚(i)𝑠𝑒𝑐𝑜𝑛𝑑𝑑𝑖𝑚(i+1)𝑓𝑖𝑟𝑠𝑡𝑑𝑖𝑚(i+1),0i<𝑙𝑒𝑛𝑔𝑡(s)1

Für alle zwei Matrizen lange Ketten gibt es nur eine Möglichkeit der Klammerung.

Rekursion

M[i,j]=mini<k<j{M[i,k]+M[k+1,j]+𝑓𝑖𝑟𝑠𝑡𝑑𝑖𝑚(i)𝑠𝑒𝑐𝑜𝑛𝑑𝑑𝑖𝑚(j1)𝑓𝑖𝑟𝑠𝑡𝑑𝑖𝑚(k)},

wobei i+2<j,0i𝑙𝑒𝑛𝑔𝑡(s),0j𝑙𝑒𝑛𝑔𝑡(s).

In der Zelle M[i,j] steht die minimale Anzahl von grundlegenden arithmetischen Operationen, um die Teilsequenz s[i..j] der Matrizenkette zu multiplizieren. Also ist die minimale Anzahl der Operationen bei der Multiplikation der gesamten Kette in der Zelle M[0,𝑙𝑒𝑛𝑔𝑡(s)] gespeichert.

Um die optimale Klammerung zu konstruieren, die zu dem optimalen Ergebnis in M[0,𝑙𝑒𝑛𝑔𝑡(s)] geführt hat, muss der Pfad in der DP-Matrix M mittels Backtracking von M[0,𝑙𝑒𝑛𝑔𝑡(s)] aus zurückverfolgt werden.

Effizienz

Die Länge der Eingabesequenz wird mit n bezeichnet. Der Algorithmus benötigt zum Speichern der Zwischenergebnisse für alle Teilsequenzen eine quadratische n×n-Matrix. Also liegt der Speicherbedarf in O(n2).

Für jede Zelle muss über O(n) Aufteilungen optimiert werden. Also ist die Gesamtlaufzeit in O(n3)

Varianten

Der Optimierungsalgorithmus ist für beliebige Sequenzen von Objekten verwendbar, welche durch eine assoziative Operation verkettet sind, wenn eine Kostenfunktion für die Ausführung der Operation existiert.

Durch eine einfache Modifikation der Rekurrenz kann die Anzahl der Klammerungen in O(n3) berechnet werden.

Abgrenzung

Cormen, 2001 (S. 369), verweist auf einen Algorithmus von Hu und Shing[1] zur Optimierung der Klammerung bei der Matrix-Kettenmultiplikation, der eine Laufzeit von O(nlogn) hat.

Literatur

Quellen