Perkalian Matriks

Nopember 23, 2007 at 3:14 pm (Programming)

Soal 5 Olimpiade Sains Mahasiswa 2007, Yogyakarta.

Deskripsi Soal :

Diberikan sebuah perkalian matriks, P=A*B*C*D, dengan ordo/ ukuan masing-masing A(20X50), B(50X100), C(100X10), dan D(10X30). Ada beberapa cara melakukan perkalian matriks ini, dan tiap cara mempunyai jumlah operasi perkalian yang berbeda, antara lain :

1) P=(A*B)*C*D => (20*50*100)+(20*100*10)+(20*10*30) = 126000 perkalian

2) P=A*((B*C)*D) => (50*100*10)+(50*10*30)+(20*50*30) = 95000 perkalian

3) P=A*(B*C)*D => (50*100*10)+(20*50*10)+(20*10*30) = 66000 perkalian

Ternyata jumlah operasi perkalian terkecil yang mungkin terjadi adalah 66000 perkalian, yaitu dengan P=A*(B*C)*D. Buatlah program yang menerima input 2 baris. Baris pertama adalah jumlah matriks(N) dan baris kedua berisi N+1 bilangan asli yang menyatakan ukuran matriks pada perkalian. Program harus meng-outputkan jumlah opersi perkalian terkecildari perkalian matriks tersebut.

Contoh Input 1 :

4

20 50 100 10 30

 

Contoh Output 1 :

66000

 

Contoh Input 2 :

3

1 4 7 5

 

Contoh Output 2 :

63

 

Solusi :

Dalam perkalian dua matriks A(mxn) dan B(nxo) akan menghasilkan matriks baru C dengan ukuran (mxo). Sedangkan jumlah operasi perkaliannya adalah (m*n*o).

Awalnya saya berpikir untuk mengalikan 2 matriks A(mxn) dan B(nxo) dengan nilai n terbesar, sehingga nilai n hilang dan tidak dipakai lagi dalam perkalian matriks berikutnya(greedy). Tapi ternyata algoritma itu tidak menghasilkan nilai minimum untuk contoh input ke-2. Jadi saya beralih ke DP, meskipun kompleksitasnya lumayan besar, sekitar O((n+1)^3/2).

 

Formula DPnya kira-kira seperti ini :

Untuk data ukuran matriks i sampai j, nilai awal min[i,j] adalah ∞.

Kemudian untuk k= i+1 sampai j-1,

tmp:=min[i,k]+min[k,j]+(data[i]*data[k]*data[k])

            jika tmp<min[i,j], maka min[i,j]=tmp

 

Tenti saja kita harus mencari nilai min[i,k] dan min [k,j] terlabih dahulu. Dengan kata lain, formula DP diatas harus dilakukan pada selisih i dan j yang terkecil terlebih dahulu. Kita definisikan bahwa min[i,i+1]:=0 (karena merupakan data satu matriks saja) dan min[i,i+2]=data[i]*data[i+1]*data[i+2] (karena hanya mencakup 2 matriks saja, yaitu matriks A(data[i]xdata[i+1]) dan matriks B(data[i+1],data[i+2]))

Kira-kira kode Pascalnya seperti ini :

 

var data:array[1..100] of integer;

    min:array[1..100,1..100] of longint;

    k,i,j,n,selisih:integer;

    tmp:longint;

 

begin

  readln(n);

  n:=n+1;

  for i:=1 to n do

    read(data[i]);

 

  for selisih:=2 to n-1 do

    for i:=1 to n-selisih do

      begin

        j:=i+selisih;

        min[i,j]:=high(longint);

        for k:=i+1 to j-1 do

          begin

            tmp:=min[i,k]+min[k,j]+(data[i]*data[k]*data[j]);

            if tmp<min[i,j] then

              min[i,j]:=tmp;

          end;

      end;

 

  writeln(min[1,n]);

end.

6 Tanggapan

  1. Dwika berkata,

    Desember 9, 2007 pada 9:06 pm

    Ons… Masih pegang programming ya???
    manteppp…
    haha…. gw dah cupu super neh di sini… hahaha…

  2. ghostyoen berkata,

    Januari 16, 2008 pada 2:41 am

    itu semua kan program untuk matriks yang elemennya filed.Seandainya elemen matriksnya atas ring komutatif gmn ?
    Thank jawabannya nt. Ghostyoen.wordpress.com

  3. Riza berkata,

    Januari 17, 2008 pada 1:35 am

    Waduh mbak, ring komutatif itu yang kayak gimana ya?
    Saya belum dapet matematika diskrit , jadi belum paham.
    Maklum, baru kelar semester 1.

    Misalnya elemen matriksnya atas ring komutatif, apa sifat2 perkalian matriksnya tetap atau berubah?

  4. a-vip berkata,

    Maret 7, 2008 pada 12:30 pm

    bagus anak muda,,, terus semangat.. jgn berhenti sampai disini..
    jangan meniru jalan abang mu yang satu ini (g pernah megang coding, skrg jadi bingung)

    masi banyak hal baru yg bisa kmu dapat..
    keep your dream ahead..

  5. arie berkata,

    April 1, 2008 pada 11:52 am

    wuuuuaaaah…………………………
    kalian ngomongin apa sich…..?
    kok aku ga mudeng………

  6. mita berkata,

    Juni 12, 2008 pada 8:14 am

    w masih bingung ni,…
    ko susah bgt ya programnya,
    w masih tingkat 2 sih
    boleh ga ka jelasin programnya secara deteil
    biar lebih ngerti

Tulis sebuah Komentar