Algoritam za množenje ulančanih...
Transcript of Algoritam za množenje ulančanih...
Algoritam za množenje ulančanih matrica
Alen Kosanović Prirodoslovno-matematički fakultet
Matematički odsjek
O problemu (1)
• Neka je 𝐴1, 𝐴2, … , 𝐴𝑛 niz ulančanih matrica duljine 𝑛 ∈ 𝑵 , gdje su dimenzije matrice 𝐴𝑖 redom 𝑚𝑖−1 𝑥 𝑚𝑖 , 0 ≤ 𝑖 ≤ 𝑛 .
• Prisjetimo se da je množenje matrica asocijativno: A(BC) = (AB)C
• Postavlja se pitanje koji je redoslijed za množenje matrica optimalan.
• Uvjerimo se da je redoslijed bitan!
O problemu (2)
((AB)C)D = 100×30×20 + 100×20×3 + 100x3x10 = 69.000
(A(BC))D = 30×20×3 + 100x30x3 + 100×3×10 = 13.800
(AB)(CD) = 100x30x20 + 20x3x10 + 100x20x10 = 80.600
A((BC)D) = 30×20×3 + 30x3x10 + 100x30x10 = 32.700
A(B(CD)) = 20x3x10 + 30x20x10 + 100x30x10 = 36.600
100 x 30 30 x 20 20 x 3 3 x 10
*Matrice u primjeru osobno sam odabrao.
O rješenju (3)
• Problem možemo ilustrirati binarnim stablom:
A B
C
D
A B C D
((AB)C)D (AB)(CD)
Pristup problemu dinamičkim programiranjem (1)
• 𝑛 – duljina našeg lanca
• Za 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛, 𝐿(𝑖, 𝑗) = lanac 𝐴𝑖 , … , 𝐴𝑗
• Za lanac 𝐿(𝑖, 𝑗) definiramo:
– 𝐶(𝑖, 𝑗): =optimalni broj operacija za zadani lanac
– 𝐾(𝑖, 𝑗)≔𝑘 td 𝑖 ≤ 𝑘 < 𝑗 i 𝐶(𝑖, 𝑘) + 𝐶(𝑘 + 1, 𝑗) = 𝐶(𝑖, 𝑗) (predstavlja indeks na kojem je najbolje „presjeći” lanac)
• 𝑇1 = 𝐶 𝑖, 𝑗 : 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛
• 𝑇2 = {𝐾 𝑖, 𝑗 : 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛}
Pristup problemu dinamičkim programiranjem (2)
i\j 1 2 3 4
1 0
2 0
3 0
4 0
i\j 1 2 3 4
1
2
3
4
T1 T2
Lanac duljine 1. A, B, C, D. Množenja nema stoga je cijena 0. Sjecanja lanca nema pa ništa ne upisujemo u drugu tablicu.
Pristup problemu dinamičkim programiranjem (3)
i\j 1 2 3 4
1 0 60.000
2 0 1.800
3 0 600
4 0
i\j 1 2 3 4
1 1
2 2
3 3
4
T1 T2
Lanac duljine 2. AB, BC, CD. Obično množenje matrica. Lanac je moguće presjeći samo na prvoj matrici.
Pristup problemu dinamičkim programiranjem (4)
i\j 1 2 3 4
1 0 60.000 10.800
2 0 1.800 2.700
3 0 600
4 0
i\j 1 2 3 4
1 1 1
2 2 3
3 3
4
T1 T2
Lanac duljine 3. 1. ABC
1. A|BC = 1.800 + 9.000 = 10.800 <- Sječemo na 1. matrici 2. AB|C = 60.000 + 6.000 = 66.000
2. BCD 1. B|CD = 600 + 6.000 = 6.600 2. BC|D = 1.800 + 900 = 2.700 <- Sječemo na 3. matrici
Pristup problemu dinamičkim programiranjem (5)
i\j 1 2 3 4
1 0 60.000 10.800 13.800
2 0 1.800 2.700
3 0 600
4 0
i\j 1 2 3 4
1 1 1 3
2 2 3
3 3
4
T1 T2
Lanac duljine 4. 1. ABCD
1. A|BCD = 2.700 + 30.000 = 32.700 2. AB|CD = 60.000 + 600 + 20.000 = 80.600 3. ABC|D = 10.800 + 3.000 = 13.800 <- Sječemo na 3. mjestu
Pseudokod
for i = 1 to n: 𝐶(𝑖, 𝑖) = 0
for s = 1 to n – 1:
for i = 1 to n – s
j = i + s
𝐶(𝑖, 𝑗) = min {𝐶(𝑖, 𝑘) + 𝐶(𝑘 + 1, 𝑗) + 𝑚𝑖−1𝑚𝑘𝑚𝑗: 𝑖 ≤ 𝑘 < 𝑗}
return 𝐶(1, 𝑛)
Složenost
• Za računanje tablica potrebne su 2 for-petlje za prolazak čitavog gornjeg trokuta i 1 for-petlja za traženje minimuma.
• Složenost: 𝑶(𝑛3).
• Ipak, konačan broj operacija je nešto bolji i može se dobiti sumiranjem:
• 𝑛𝑖=1 𝑛−𝑠
𝑠=1 1𝑗+𝑠𝑘=𝑖 = … ≈
𝑛3
3
Rezultati testiranja (1)
• Vršena su 3 testiranja:
1. Usporedba klasičnog i dinamičkog algoritma „Veliki lanci, manje matrice” (lanci duljina 50 – 1000, matrice dimenzija između 10 i 100).
2. „Veliki lanci, manje matrice” (lanci duljina 50 – 1000, matrice dimenzija između 10 i 100).
3. Trajanje samog algoritma računanja optimalnog redoslijeda (lanci duljina 100 – 2500).
Rezultati testiranja (2)
• Tesitranje je vršeno na kompjutoru s procesorom Intel Core i5-3570k CPU @ 3.40GHz.
• Algoritam je implementiran u programskom jeziku Java. Izvorni kod i rezultati zapisani su na eng. jeziku.
• Za svaki lanac uzeta je populacija od 20 matrica čije su dimenzije odabrane nasumično. Korišten je algoritam za nasumično biranje brojeva koji dolazi zajedno s Java SDK. Detalji.
Rezultati testiranja (3)
Chain Length Classic Dynamic Difference
450 0,02 0,07 -0,05
450 0,09 0,08 0,01
450 0,02 0,05 -0,03
450 0,06 0,05 0,01
450 0,09 0,06 0,03
450 0,09 0,05 0,04
450 0,05 0,05 0,00
450 0,04 0,05 -0,01
450 0,10 0,05 0,05
450 0,02 0,05 -0,03
450 0,02 0,05 -0,03
450 0,09 0,05 0,04
450 0,12 0,05 0,07
450 0,06 0,05 0,01
450 0,06 0,05 0,01
450 0,02 0,05 -0,03
450 0,05 0,05 0,00
450 0,02 0,17 -0,15
450 0,02 0,05 -0,03
450 0,03 0,04 -0,01
AVG 0,05 0,06 -0,01
Chain Length Classic Dynamic Difference
1000 0,10 1,60 -1,50
1000 0,16 1,78 -1,62
1000 0,14 1,79 -1,65
1000 0,25 1,73 -1,48
1000 0,15 1,60 -1,45
1000 0,21 1,77 -1,56
1000 0,17 1,82 -1,65
1000 0,18 1,83 -1,65
1000 0,21 1,93 -1,72
1000 0,08 1,93 -1,85
1000 0,24 1,41 -1,17
1000 0,18 1,48 -1,30
1000 0,13 1,51 -1,38
1000 0,23 1,38 -1,15
1000 0,23 1,27 -1,04
1000 0,20 1,28 -1,08
1000 0,08 2,01 -1,93
1000 0,04 2,01 -1,97
1000 0,17 1,93 -1,76
1000 0,25 1,90 -1,65
AVG 0,17 1,70 -1,53
Test 1, usporedba klasičnog i dinamičkog algoritma. Mjerna jedinica: sekunde Matrice duljina: od 10 do 1000, duljine lanaca: od 450 do 1000.
Primjećujemo da za zadane parametre našeg problema, naš algoritam prestaje biti efikasan za lanac duljine 450.
Rezultati testiranja (4) Test 2, usporedba klasičnog i dinamičkog algoritma. Mjerna jedinica: sekunde Matrice duljina: od 100 do 1000, duljine lanaca: od 3 do 30.
Primjećujemo da dinamičkim računanjem drastično povećavamo efikasnost.
0
5
10
15
20
25
30
35
40
0 5 10 15 20 25 30 35
Tim
e/s
Chain Length
Comparison of Algorithms
Classic Dynamic
Chain Length Classic Dynamic Difference
3 3,24 2,35 0,88
6 6,99 1,96 5,03
9 8,30 2,96 5,34
12 18,15 3,97 14,18
15 23,04 3,17 19,86
18 24,69 4,65 20,04
21 35,53 5,65 29,88
24 27,91 5,54 22,37
27 29,30 5,40 23,90
30 31,49 6,58 24,91
Navedene vrijednosti u 2. i 3. koloni su aritmetičke sredine rezultata.
Rezultati testiranja (5) Test 3, trajanje algoritma nalaženja najboljeg redoslijeda množenja. Duljine lanca: 50 – 2500.
y = 3E-09x3 - 3E-07x2 - 0,001x + 0,2524
-5
0
5
10
15
20
25
30
35
40
45
0 500 1000 1500 2000 2500 3000
Ch
ain
Le
ng
th
Time/s
Algoritam pronalaska optimalnog redoslijeda množenja
Zaključak (1)
Kada se isplati računati redoslijed množenja?
• U većini slučajeva netrivijalnih lanaca – DA.
• Za slučajeve velikih matrica, promjena može biti drastična.
• S druge strane, cijena samog algoritma dosta je niska, tako da ga se isplati koristiti čak i kod lanaca razumnih duljina, manjih matrica.
Zaključak (2)
Kada se ne isplati računati redoslijed množenja?
• Ukoliko nam problem nalaže da ćemo često množiti lanac matrica čija duljina prelazi veličinu trostruko većoj od dimenzija matrica.
• Ukoliko nam je problem toliko jednostavan, da pisanje samog koda oduzima više resursa.
Literatura
• Algorithms by S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani
• http://en.wikipedia.org/