Matris zinciri çarpımı - Matrix chain multiplication

Matris zinciri çarpımı (veya Matris Zinciri Sipariş Problemi, MCOP) bir optimizasyon sorunu bu kullanılarak çözülebilir dinamik program. Bir dizi matris verildiğinde, amaç, bunu yapmanın en verimli yolunu bulmaktır. bu matrisleri çarp. Sorun aslında icra etmek çarpımlar, ancak sadece ilgili matris çarpımlarının sırasına karar vermek için.

Birçok seçenek vardır çünkü matris çarpımı ilişkisel. Başka bir deyişle, ürün nasıl olursa olsun parantez içinde elde edilen sonuç aynı kalacaktır. Örneğin, dört matris için Bir, B, C, ve D, bizde:

((AB)C)D = (Bir(M.Ö))D = (AB)(CD) = Bir((M.Ö)D) = Bir(B(CD)).

Bununla birlikte, ürünün parantez içine alındığı sıra, ürünü hesaplamak için gereken basit aritmetik işlemlerin sayısını etkiler; hesaplama karmaşıklığı. Örneğin, eğer Bir 10 × 30 bir matristir, B 30 × 5 bir matristir ve C 5 × 60'lık bir matristir, o zaman

bilgi işlem (AB)C ihtiyaçlar (10 × 30 × 5) + (10 × 5 × 60) = 1500 + 3000 = 4500 işlem
bilgi işlem Bir(M.Ö) ihtiyacı (30 × 5 × 60) + (10 × 30 × 60) = 9000 + 18000 = 27000 işlem.

Açıkça görülüyor ki ilk yöntem daha etkilidir. Bu bilgilerle, problem ifadesi, "bir ürünün optimal parantezinin nasıl belirleneceği şeklinde rafine edilebilir. n matrisler? "Olası her parantez kontrol ediliyor (kaba kuvvet ) bir Çalışma süresi yani matris sayısında üstel, bu çok yavaş ve büyük için pratik değil n. Sorunu bir dizi ilgili alt soruna bölerek bu soruna daha hızlı bir çözüm elde edilebilir. Alt problemleri bir kez çözerek ve çözümleri yeniden kullanarak, gerekli çalışma süresi büyük ölçüde azaltılabilir. Bu kavram olarak bilinir dinamik program.

Dinamik bir programlama algoritması

Başlamak için, gerçekten bilmek istediğimiz tek şeyin minimum maliyet veya matrisleri çarpmak için gereken minimum aritmetik işlem sayısı olduğunu varsayalım. Eğer sadece iki matrisi çarpıyorsak, onları çarpmanın tek bir yolu vardır, dolayısıyla minimum maliyet bunu yapmanın maliyetidir. Genel olarak, asgari maliyeti aşağıdakileri kullanarak bulabiliriz özyinelemeli algoritma:

  • Matrislerin sırasını alın ve iki alt sınıfa ayırın.
  • Her bir alt diziyi çarpmanın minimum maliyetini bulun.
  • Bu maliyetleri toplayın ve iki sonuç matrisini çarpmanın maliyetini ekleyin.
  • Bunu, matris dizisinin bölünebileceği her olası konum için yapın ve bunların hepsinin minimumunu alın.

Örneğin, dört matrisimiz varsa ABCD, her birini bulmak için gereken maliyeti hesaplarız (Bir)(BCD), (AB)(CD), ve (ABC)(D), hesaplamak için minimum maliyeti bulmak için yinelemeli çağrılar yapmak ABC, AB, CD, ve BCD. Daha sonra en iyisini seçiyoruz. Daha da iyisi, bu yalnızca minimum maliyeti sağlamakla kalmaz, aynı zamanda çarpmanın en iyi yolunu da gösterir: En düşük toplam maliyeti sağlayacak şekilde gruplayın ve her faktör için aynısını yapın.

Bununla birlikte, bu algoritmayı uygularsak, tüm permütasyonları denemenin naif bir yolu kadar yavaş olduğunu keşfederiz! Ne yanlış gitti? Cevap, çok fazla gereksiz iş yapıyor olmamızdır. Örneğin, yukarıda her ikisini de hesaplamanın en iyi maliyetini bulmak için yinelemeli bir çağrı yaptık. ABC ve AB. Ancak ABC'yi hesaplamak için en iyi maliyeti bulmak, aynı zamanda AB. Özyineleme derinleştikçe, bu tür gereksiz tekrarların sayısı gittikçe artmaktadır.

Basit bir çözüm denir hafızaya alma: Belirli bir alt diziyi çarpmak için gereken minimum maliyeti her hesapladığımızda, onu kaydederiz. Bir daha hesaplamamız istenirse, sadece kaydedilmiş cevabı veririz ve onu yeniden hesaplamayız. Hakkında olduğu için n2/ 2 farklı alt dizi, nerede n matrislerin sayısı, bunu yapmak için gereken alan makul. Bu basit numaranın çalışma süresini O'ya indirdiği gösterilebilir (n3) O (2n), bu da gerçek uygulamalar için yeterince verimli olmanın ötesinde. Bu yukarıdan aşağıya dinamik program.

Aşağıdaki aşağıdan yukarıya yaklaşım [1] her 2 ≤ için hesaplar k ≤ n, tüm uzunluk alt dizilerinin minimum maliyetleri k Daha küçük alt dizilerin maliyetlerini kullanarak zaten hesaplanmıştır.Aynı asimptotik çalışma zamanına sahiptir ve özyineleme gerektirmez.

Sözde kod:

// Matris A [i], i = 1.n için [i-1] x dims [i] boyut boyutlarına sahiptir.MatrixChainOrder(int karartma[]){    // uzunluk [dims] = n + 1    n = karartma.uzunluk - 1;    // m [i, j] = Minimum skaler çarpım sayısı (yani maliyet)    // A [i] A [i + 1] matrisini hesaplamak gerekiyor ... A [j] = A [i..j]    // Bir matris çarpıldığında maliyet sıfırdır    için (ben = 1; ben <= n; ben++)        m[ben, ben] = 0;    için (len = 2; len <= n; len++) { // Sonraki uzunluklar        için (ben = 1; ben <= n - len + 1; ben++) {            j = ben + len - 1;            m[ben, j] = MAXINT;            için (k = ben; k <= j - 1; k++) {                maliyet = m[ben, k] + m[k+1, j] + karartma[ben-1]*karartma[k]*karartma[j];                Eğer (maliyet < m[ben, j]) {                    m[ben, j] = maliyet;                    s[ben, j] = k; // Minimum maliyete ulaşan alt dizi ayrımının dizini                }            }        }    }}
  • Not: Dims için ilk indeks 0'dır ve m ve s için ilk indeks 1'dir.

Bir Java çözülmüş işlem sırasını yazdırmak için bir kolaylık yöntemiyle birlikte sıfır tabanlı dizi dizinlerini kullanarak uygulama:

halka açık sınıf MatrixOrderOptimization {    korumalı int[][]m;    korumalı int[][]s;    halka açık geçersiz matrixChainOrder(int[] karartma) {        int n = karartma.uzunluk - 1;        m = yeni int[n][n];        s = yeni int[n][n];        için (int lenMinusOne = 1; lenMinusOne < n; lenMinusOne++) {            için (int ben = 0; ben < n - lenMinusOne; ben++) {                int j = ben + lenMinusOne;                m[ben][j] = Tamsayı.MAKSİMUM DEĞER;                için (int k = ben; k < j; k++) {                    int maliyet = m[ben][k] + m[k+1][j] + karartma[ben]*karartma[k+1]*karartma[j+1];                    Eğer (maliyet < m[ben][j]) {                        m[ben][j] = maliyet;                        s[ben][j] = k;                    }                }            }        }    }    halka açık geçersiz printOptimalParenthesizations() {        Boole[] inAResult = yeni Boole[s.uzunluk];        printOptimalParenthesizations(s, 0, s.uzunluk - 1, inAResult);    }    geçersiz printOptimalParenthesizations(int[][]s, int ben, int j,  / * güzel baskı için: * / Boole[] inAResult) {        Eğer (ben != j) {            printOptimalParenthesizations(s, ben, s[ben][j], inAResult);            printOptimalParenthesizations(s, s[ben][j] + 1, j, inAResult);            Dize istr = inAResult[ben] ? "_result" : " ";            Dize jstr = inAResult[j] ? "_result" : " ";            Sistemi.dışarı.println("A_" + ben + istr + "* A_" + j + jstr);            inAResult[ben] = doğru;            inAResult[j] = doğru;        }    }}

Bu programın sonunda, tam sekans için minimum maliyetimiz var.

Daha verimli algoritmalar

Daha verimli olan algoritmalar var. Ö(n3) dinamik programlama algoritması, daha karmaşık olsalar da.

Hu ve Shing (1981)

Hu ve Shing tarafından 1981'de yayınlanan bir algoritma, Ö(n günlükn) hesaplama karmaşıklığı.[2][3][4]Matris zinciri çarpım probleminin nasıl dönüştürülebileceğini gösterdiler (veya indirgenmiş ) sorununa nirengi bir normal çokgen. Çokgen, nihai sonucu temsil eden taban adı verilen yatay bir alt taraf olacak şekilde yönlendirilir. Diğer n Çokgenin saat yönündeki kenarları matrisleri temsil eder. Bir tarafın her iki ucundaki köşeler, o taraf tarafından temsil edilen matrisin boyutlarıdır. İle n çarpım zincirindeki matrisler n−1 ikili işlemler ve Cn−1 parantez yerleştirmenin yolları, Cn−1 (n−1) -th Katalan numarası. Algoritma, aynı zamanda Cn−1 ile bir çokgenin olası üçgenlemeleri n+1 taraf.

Bu görüntü, normal bir altıgen. Bunlar, 5 matrisin çarpımlarını sıralamak için parantezlerin yerleştirilebileceği farklı yollara karşılık gelir.

Katalanca-Altıgenler-example.svg

Aşağıdaki örnek için dört taraf vardır: A, B, C ve nihai sonuç ABC. A 10 × 30 matristir, B 30 × 5 matristir, C 5 × 60 matristir ve nihai sonuç 10 × 60 matristir. Bu örnek için normal çokgen 4-gon, yani bir karedir:

Matris zinciri çarpım çokgeni örneği.svg

AB matris ürünü 10x5 matristir ve BC 30x60 matristir. Bu örnekteki olası iki üçgenleştirme:

Tek bir üçgenin ihtiyaç duyulan çarpma sayısı açısından maliyeti, köşelerinin çarpımıdır. Çokgenin belirli bir üçgenlemesinin toplam maliyeti, tüm üçgenlerinin maliyetlerinin toplamıdır:

(AB)C: (10 × 30 × 5) + (10 × 5 × 60) = 1500 + 3000 = 4500 çarpım
Bir(M.Ö): (30 × 5 × 60) + (10 × 30 × 60) = 9000 + 18000 = 27000 çarpma

Hu & Shing, en düşük maliyetli bölümleme problemi için optimum çözümü bulan bir algoritma Ö(n günlükn) zaman.

Chin-Hu-Shing Yaklaşım Algoritması

Girişinde [4] yaklaşık bir algoritma olan Chin-Hu-Shing yaklaştırma algoritması sunulmuştur. Bu algoritma, optimal üçgenlemenin bir yaklaşık değerini üretirken, Hu-Shing'in işlerinde kullandığı tekniklerin anlaşılmasını kolaylaştırdığı için açıklamaya değer.

Her köşeye V poligonun bir ağırlığı w. Ardışık üç köşemiz olduğunu varsayalım , ve şu minimum ağırlığa sahip tepe noktasıdır Dörtgene köşeli bakıyoruz (saat yönünde) Bunu iki şekilde üçgenleştirebiliriz:

  • ve , maliyetle
  • ve maliyetle .

Bu nedenle eğer

Veya eşdeğer olarak

tepe noktasını kaldırıyoruz poligondan ve kenarını ekleyin nirengi için. bu işlemi hayır olana kadar tekrarlıyoruz yukarıdaki koşulu karşılar. kalan tüm köşeler için , taraf ekliyoruz nirengi için. Bu bize neredeyse optimal bir üçgenleme sağlar.


Genellemeler

Matris zinciri çarpma problemi, daha soyut bir problemi çözmeye genelleşir: doğrusal bir nesne dizisi verildiğinde, bu nesneler üzerinde ilişkili bir ikili işlem ve bu işlemi herhangi iki nesnede gerçekleştirmenin maliyetini hesaplamanın bir yolu (ve tüm kısmi sonuçlar), işlemi sıraya uygulamak için nesneleri gruplandırmanın minimum maliyet yolunu hesaplayın.[5] Bunun biraz uydurulmuş özel bir durumu şudur: dize birleştirme dizeler listesi. İçinde C örneğin, iki uzunluk dizisini birleştirmenin maliyeti m ve n kullanma strcat O (m + n), O ihtiyacımız olduğundan (m) ilk dizenin sonunu bulma zamanı ve O (n) ikinci dizeyi sonuna kopyalama zamanı. Bu maliyet fonksiyonunu kullanarak, bir dizi dizeyi birleştirmenin en hızlı yolunu bulmak için dinamik bir programlama algoritması yazabiliriz. Bununla birlikte, bu optimizasyon oldukça faydasızdır çünkü dizeleri uzunluklarının toplamıyla orantılı olarak zaman içinde doğrudan birleştirebiliriz. Tek başına benzer bir sorun var bağlantılı listeler.

Diğer bir genelleme, paralel işlemciler mevcut olduğunda sorunu çözmektir. Bu durumda, bir matris ürününün her bir faktörünü hesaplamanın maliyetini eklemek yerine, maksimum değeri alırız çünkü bunları aynı anda yapabiliriz. Bu, hem minimum maliyeti hem de nihai optimum gruplamayı büyük ölçüde etkileyebilir; tüm işlemcileri meşgul tutan daha "dengeli" gruplar tercih edilir. Daha da karmaşık yaklaşımlar var.[6]

Ayrıca bakınız

Referanslar

  1. ^ Cormen, Thomas H; Leiserson, Charles E; Rivest, Ronald L; Stein, Clifford (2001). "15.2: Matris zinciri çarpımı". Algoritmalara Giriş. İkinci baskı. MIT Press ve McGraw-Hill. s. 331–338. ISBN  978-0-262-03293-3.
  2. ^ Hu, TC; Shing, MT (1982). "Matris Zinciri Ürünlerinin Hesaplanması, Bölüm I" (PDF). Bilgi İşlem Üzerine SIAM Dergisi. 11 (2): 362–373. CiteSeerX  10.1.1.695.2923. doi:10.1137/0211028. ISSN  0097-5397.
  3. ^ Hu, TC; Shing, MT (1984). "Matris Zinciri Ürünlerinin Hesaplanması, Bölüm II" (PDF). Bilgi İşlem Üzerine SIAM Dergisi. 13 (2): 228–251. CiteSeerX  10.1.1.695.4875. doi:10.1137/0213017. ISSN  0097-5397.
  4. ^ a b Artur, Czumaj (1996). "Matris Zinciri Ürün Problemine Çok Hızlı Yaklaşım" (PDF). Algoritmalar Dergisi. 21: 71–79. CiteSeerX  10.1.1.218.8168. doi:10.1006 / jagm.1996.0037.
  5. ^ G. Baumgartner, D. Bernholdt, D. Cociorva, R. Harrison, M. Nooijen, J. Ramanujam ve P. Sadayappan. Tensör Daralma İfadelerinin Paralel Programlarda Derlenmesi için Performans Optimizasyon Çerçevesi. 7th International Workshop on High-Level Parallel Programming Models and Supportive Environment (HIPS '02). Fort Lauderdale, Florida. 2002 şu adresten temin edilebilir: http://citeseer.ist.psu.edu/610463.html ve http://www.csc.lsu.edu/~gb/TCE/Publications/OptFramework-HIPS02.pdf
  6. ^ Heejo Lee, Jong Kim, Sungje Hong ve Sunggu Lee. Paralel Sistemlerde Matris Zinciri Ürünlerinin İşlemci Tahsisi ve Görev Planlaması Arşivlendi 2011-07-22 de Wayback Makinesi. IEEE Trans. Paralel ve Dağıtık Sistemlerde, Cilt 14, No. 4, s. 394–407, Nisan 2003