und
wird maximiert.
Der naive Lösungsansatz überprüft alle 2n Möglichkeiten.
Ein Dynamic-Programming-Ansatz definiert
F[i,x] : = | maximaler Profit, den die Objekte 1,...,i in einem |
Rucksack mit Kapazität x erreichen können. |
Offenbar
Eine iterative Formulierung füllt die Profitmatrix F zeilenweise:
FOR x := 1 TO w1 -1 DO F[1,x] := 0 END;
FOR x := w1 TO c DO F[1,x] := p1 END;
FOR i := 2 TO n DO
FOR x := 1 TO c DO
F[i, x] := max { F[i-1,x], F[i-1, x- wi ] + pi}
END
END
Die Laufzeit beträgt
O(n · c) .
Zur parallelen Abarbeitung mit einer CREW-PRAM
verwendet man c Prozessoren.
Während der i -ten Iteration ist Prozessor Px zuständig für die
Bestimmung von F[i,x] .
Die Laufzeit beträgt offenbar O(n) , die Kosten
O(n · c) , also
liegt ein kostenoptimaler Algorithmus vor.
Zur parallelen Abarbeitung auf einem Hypercube
verwendet man c Prozessoren.
Jeder Prozessor kennt alle Gewichte wi und alle Profitwerte pi .
Prozessor Px ist zuständig für Spalte x der Profitmatrix F .
Während der i -ten Iteration kann Px auf das lokal
vorhandene F[i - 1,x] zugreifen; der Wert
F[i - 1,x - wi]
muß besorgt werden durch einen zyklischen Shift über die
Distanz wi , ausgeführt von allen Prozessoren.
Die Laufzeit hierfür beträgt log (c) .
Die Gesamtzeit beträgt daher
O(n · log c) , die Kosten
O(n · c · log c) .
Bei p Prozessoren im Hypercube ist jeder Prozessor für
c/p Spalten zuständig.
Während der i -ten Iteration
kann Prozessor Px auf c/p lokale Werte zugreifen und
muß weitere c/p Werte durch einen zyklischen Shift besorgen.
Die Zeit dafür beträgt
c/p + log p .
Die Gesamtzeit beträgt daher
O(n · c/p + n · log p) , die
Kosten
O(n · c + n · p · log p) .
Für
c = (p · log p)
ist dies kostenoptimal.