आव्यूह श्रृंखला गुणन: Difference between revisions

From Vigyanwiki
No edit summary
 
(21 intermediate revisions by 5 users not shown)
Line 2: Line 2:
आव्यूह श्रृंखला गुणन (या आव्यूह श्रृंखला क्रम समस्या<ref name=Schwartz/> [[Index.php?title=आव्यूह (गणित)|आव्यूह (गणित)]] के दिए गए अनुक्रम को आव्यूह गुणन करने के सबसे कुशल प्रकार से संबंधित एक [[अनुकूलन समस्या]] है। समस्या वास्तव में गुणन करने के लिए नहीं है, अपितु केवल निहित आव्यूह गुणन के अनुक्रम को सुनिश्चित करने के लिए है। [[गतिशील प्रोग्रामिंग]] का उपयोग करके समस्या का समाधान किया जा सकता है।
आव्यूह श्रृंखला गुणन (या आव्यूह श्रृंखला क्रम समस्या<ref name=Schwartz/> [[Index.php?title=आव्यूह (गणित)|आव्यूह (गणित)]] के दिए गए अनुक्रम को आव्यूह गुणन करने के सबसे कुशल प्रकार से संबंधित एक [[अनुकूलन समस्या]] है। समस्या वास्तव में गुणन करने के लिए नहीं है, अपितु केवल निहित आव्यूह गुणन के अनुक्रम को सुनिश्चित करने के लिए है। [[गतिशील प्रोग्रामिंग]] का उपयोग करके समस्या का समाधान किया जा सकता है।


इसके कई विकल्प हैं क्योंकि आव्यूह गुणन साहचर्य है। दूसरे शब्दों में, कोई प्रभाव नहीं पड़ता की गुणनफल किस प्रकार से कोष्ठक में प्रस्तुत किया गया है, प्राप्त परिणाम वही रहता है। उदाहरण के लिए, चार मैट्रिक्स a, b, c और d के लिए, पांच संभावित विकल्प हैं:
इसके कई विकल्प हैं क्योंकि आव्यूह गुणन साहचर्य है। दूसरे शब्दों में, कोई प्रभाव नहीं पड़ता की गुणनफल किस प्रकार से कोष्ठक में प्रस्तुत किया गया है, प्राप्त परिणाम वही रहता है। उदाहरण के लिए, चार मैट्रिक्स A,B, C और D के लिए, पांच संभावित विकल्प हैं:


: ((ab) c) d = (a (bc)) d = (ab) (cd) = a ((bc) d) = a (b (cd))।
: ((AB)C)D = (A(BC))= (AB) (CD) = A((BC)D) = A(B(CD))।


यद्यपि यह उत्पाद को प्रभावित नहीं करता है, जिस क्रम में शब्दों को कोष्ठक में रखा गया है, वह उत्पाद की गणना करने के लिए आवश्यक सरल अंकगणितीय क्रियाओं की संख्या अर्थात कम्प्यूटेशनल जटिलता को प्रभावित करता है। आव्यूह  {{math|''X'' × ''Y''}} का आव्यूह {{math|''Y'' × ''Z''}} द्वारा गुणन करने के लिए  {{math|''XYZ''}} साधारण गुणन और {{math|''X''(''Y'' − 1)''Z''}} साधारण जोड़ की आवश्यक्ता होती है। इस संदर्भ में, क्रियाशील जटिलता के माप के रूप में साधारण गुणन की संख्या का उपयोग करना विशिष्ट है।
यद्यपि यह उत्पाद को प्रभावित नहीं करता है, जिस क्रम में शब्दों को कोष्ठक में रखा गया है, वह उत्पाद की गणना करने के लिए आवश्यक सरल अंकगणितीय क्रियाओं की संख्या अर्थात कम्प्यूटेशनल जटिलता को प्रभावित करता है। आव्यूह  {{math|''X'' × ''Y''}} का आव्यूह {{math|''Y'' × ''Z''}} द्वारा गुणन करने के लिए  {{math|''XYZ''}} साधारण गुणन और {{math|''X''(''Y'' − 1)''Z''}} साधारण जोड़ की आवश्यक्ता होती है। इस संदर्भ में, क्रियाशील जटिलता के माप के रूप में साधारण गुणन की संख्या का उपयोग करना विशिष्ट है।
Line 10: Line 10:
यदि A एक 10 × 30 आव्यूह है, B एक 30 × 5 आव्यूह है, और C एक 5 × 60 आव्यूह है, तो
यदि A एक 10 × 30 आव्यूह है, B एक 30 × 5 आव्यूह है, और C एक 5 × 60 आव्यूह है, तो


:कंप्यूटिंग (ab)c की (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 संचालन की आवश्यक्ता है, यद्यपि की  
:कंप्यूटिंग (AB)C की (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 संचालन की आवश्यक्ता है, यद्यपि की
: कंप्यूटिंग a(bc) की (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 संचालन की आवश्यक्ता है ।
: कंप्यूटिंग A(BC) की (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 संचालन की आवश्यक्ता है ।


स्पष्ट रूप से पहली विधि अधिक कुशल है। इस सुचना के साथ, समस्या कथन को परिष्कृत किया जा सकता है कि n आव्यूहों के उत्पाद का इष्टतम कोष्ठक कैसे निर्धारित किया जाए? प्रत्येक संभावित कोष्ठक ([[Index.php?title=पाशविक बल|पाशविक बल]]) की जाँच करने के लिए क्रियाशील समय की जटिलता की आवश्यकता होगी | समस्या को संबंधित उप-समस्याओं के समूह में तोड़कर इस समस्या का त्वरित समाधान प्राप्त किया जा सकता है।
स्पष्ट रूप से पहली विधि अधिक कुशल है। इस सुचना के साथ, समस्या कथन को परिष्कृत किया जा सकता है कि n आव्यूहों के उत्पाद का इष्टतम कोष्ठक कैसे निर्धारित किया जाए? प्रत्येक संभावित कोष्ठक ([[Index.php?title=पाशविक बल|पाशविक बल]]) की जाँच करने के लिए क्रियाशील समय की जटिलता की आवश्यकता होगी | समस्या को संबंधित उप-समस्याओं के समूह में तोड़कर इस समस्या का त्वरित समाधान प्राप्त किया जा सकता है।


== एक गतिशील प्रोग्रामिंग एल्गोरिथ्म ==
== क्रियाशील अंकगणितीय प्रोग्रामिंग ==


शुरू करने के लिए, मान लें कि हम वास्तव में जानना चाहते हैं कि न्यूनतम लागत, या मैट्रिक्स को गुणा करने के लिए आवश्यक अंकगणितीय संचालन की न्यूनतम संख्या है। यदि हम केवल दो आव्यूहों का गुणा कर रहे हैं, तो उन्हें गुणा करने का केवल एक ही तरीका है, इसलिए न्यूनतम लागत ऐसा करने की लागत है। सामान्य तौर पर, हम निम्न पुनरावर्तन का उपयोग करके न्यूनतम लागत पा सकते हैं:
प्रारम्भ करने के लिए, मान लें कि हम वास्तव में जानना चाहते हैं कि न्यूनतम लागत, अथवा अंकगणितीय संचालन की न्यूनतम संख्या आव्यूहों की गुणा करने के लिए आवश्यक है। यदि हम केवल दो आव्यूहों का गुणा कर रहे हैं, तो न्यूनतम लगत ही इसे करने का एकमात्र प्रकार है । सामान्यतया, हम निम्न पुनरावर्तन का उपयोग करके न्यूनतम लागत प्राप्त कर सकते है:


* मेट्रिसेस का क्रम लें और इसे दो क्रमों में अलग करें।
* आव्यूहों का क्रम लें और इसे दो क्रमों में अलग करें।
* प्रत्येक अनुवर्ती को गुणा करने की न्यूनतम लागत ज्ञात कीजिए।
* प्रत्येक अनुवर्ती को गुणा करने की न्यूनतम लागत ज्ञात कीजिए।
* इन लागतों को एक साथ जोड़ें, और दो परिणाम मैट्रिक्स को गुणा करने की लागत में जोड़ें।
* इन लागतों को एक साथ जोड़ें, और दो परिणाम आव्यूह को गुणा करने की लागत में जोड़ें।
* यह प्रत्येक संभावित स्थिति के लिए करें जिस पर मैट्रिक्स के अनुक्रम को विभाजित किया जा सकता है, और उन सभी पर न्यूनतम ले लें।
* यह प्रत्येक संभावित स्थिति के लिए करें जिस पर आव्यूह के अनुक्रम को विभाजित किया जा सकता है, और उन सभी पर न्यूनतम मान प्रत्यारोपित करते है ।


उदाहरण के लिए, यदि हमारे पास चार मैट्रिक्स एबीसीडी हैं, तो हम () (बीसीडी), (एबी) (सीडी), और (एबीसी) (डी) में से प्रत्येक को खोजने के लिए आवश्यक लागत की गणना करते हैं, न्यूनतम लागत खोजने के लिए पुनरावर्ती कॉल करते हैं। एबीसी, एबी, सीडी और बीसीडी की गणना करें। फिर हम सबसे अच्छे को चुनते हैं। बेहतर अभी भी, यह न केवल न्यूनतम लागत पैदा करता है, बल्कि गुणा करने का सबसे अच्छा तरीका भी प्रदर्शित करता है: इसे उस तरीके से समूहित करें जो सबसे कम कुल लागत पैदा करता है, और प्रत्येक कारक के लिए ऐसा ही करें।
उदाहरण के लिए, यदि हमारे पास चार आव्यूह ABCD हैं, तो हम (A) (BCD), (AB) (CD), और (ABC) (D) में से प्रत्येक को प्राप्त के लिए आवश्यक लागत की गणना करते हैं, न्यूनतम लागत प्राप्त करने के लिए पुनरावर्ती करते हैं। ABC,AB, CD और BCD की गणना करते है। इसके पश्चात हम सबसे अच्छे वाले को चुनते है। अभी भी, यह न केवल न्यूनतम लागत प्रदान करता है, अपितु गुणा करने का सबसे अच्छा युक्ति भी प्रदर्शित करता है: इसे उस युक्ति से समूहित करते है जो सबसे कम कुल लागत प्रदान करता है, तथा प्रत्येक कारक के लिए ऐसा ही किया जाता है।


हालाँकि, इस एल्गोरिथ्म में घातीय रनटाइम जटिलता है जो इसे सभी क्रमपरिवर्तनों को आज़माने के भोले दृष्टिकोण के रूप में अक्षम बनाती है। कारण यह है कि एल्गोरिदम बहुत अधिक अनावश्यक कार्य करता है। उदाहरण के लिए, ऊपर हमने एबीसी और एबी दोनों की गणना के लिए सर्वोत्तम लागत खोजने के लिए एक पुनरावर्ती कॉल किया। लेकिन एबीसी की गणना के लिए सर्वोत्तम लागत खोजने के लिए भी एबी के लिए सर्वोत्तम लागत खोजने की आवश्यकता है। जैसे-जैसे पुनरावर्तन गहरा होता है, इस प्रकार की अनावश्यक पुनरावृत्ति अधिक से अधिक होती जाती है।
चुकी, इस एल्गोरिथ्म में घातीय क्रियाशील जटिलता है जो इसे सभी क्रमपरिवर्तनों को जांचने के दृष्टिकोण के रूप में अक्षम बनाती है। इसका कारण एल्गोरिदम का  बहुत अधिक अनावश्यक कार्य करना है। उदाहरण के लिए, ऊपर हमने ABC और AB दोनों की गणना के लिए सर्वोत्तम लागत खोजने के लिए एक पुनरावर्ती की थी। परन्तु ABC की गणना के लिए सर्वोत्तम लागत खोजने के लिए AB के लिए भीं सर्वोत्तम लागत खोजने की आवश्यकता है। जैसे-जैसे पुनरावर्तन बढ़ता जाता है, इस प्रकार की अनावश्यक पुनरावृत्ति अधिक से अधिक होती जाती है।


एक सरल समाधान को [[memoization]] कहा जाता है: हर बार जब हम एक विशिष्ट परिणाम को गुणा करने के लिए आवश्यक न्यूनतम लागत की गणना करते हैं, तो हम इसे बचा लेते हैं। यदि हमें कभी भी इसकी गणना करने के लिए कहा जाता है, तो हम केवल सहेजा गया उत्तर देते हैं, और इसकी पुनर्गणना नहीं करते हैं। चूंकि लगभग एन हैं<sup>2</sup>/2 अलग-अलग अनुवर्ती, जहां n आव्यूहों की संख्या है, ऐसा करने के लिए आवश्यक स्थान उचित है। यह दिखाया जा सकता है कि यह सरल ट्रिक रनटाइम को O(n<sup>3</sup>) O से (2<sup>n</sup>), जो वास्तविक अनुप्रयोगों के लिए पर्याप्त से अधिक कुशल है। यह [[टॉप-डाउन और बॉटम-अप डिज़ाइन]] | टॉप-डाउन डायनामिक प्रोग्रामिंग है।
एक सरल समाधान को [[memoization|मेमोराइज़ेशन]] कहा जाता है: प्रत्येक बार जब हम एक विशिष्ट परिणाम को गुणा करने के लिए आवश्यक न्यूनतम लागत की गणना करते हैं, तो हम इसे संगृहीत करते हैं। यदि हमें कभी भी इसकी गणना करने के लिए कहा जाता है, तो हम केवल संगृहीत किया गया उत्तर देते हैं, और इसकी पुनर्गणना नहीं करते हैं। चूंकि यहाँ पर ''n''<sup>2</sup>/2 अलग-अलग अनुवर्ती है, जहां n आव्यूहों की संख्या है, इसे पूर्ण करने के लिए उचित स्थान आवश्यक है। यह दर्शाया जा सकता है कि यह सरल युक्ति क्रियाशीलता को O(n<sup>3</sup>) O से (2<sup>n</sup>) कम कर देती है, जो वास्तविक अनुप्रयोगों के लिए पर्याप्त से अधिक उपयुक्त है। यह [[टॉप-डाउन और बॉटम-अप डिज़ाइन|टॉप-डाउन]] गतिकी प्रोग्रामिंग है।


निम्नलिखित नीचे-ऊपर दृष्टिकोण<ref name="Cormen">
निम्नलिखित बॉटम-अप दृष्टिकोण<ref name="Cormen">
{{cite book
{{cite book
   | last1 = Cormen
   | last1 = Cormen
Line 52: Line 52:
   | isbn = 978-0-262-03293-3
   | isbn = 978-0-262-03293-3
}}
}}
</ref> गणना करता है, प्रत्येक 2 ≤ k ≤ n के लिए, पहले से गणना की गई छोटी अनुगामी की लागत का उपयोग करके लंबाई k के सभी अनुवर्ती की न्यूनतम लागत।
</ref> , प्रत्येक 2 ≤ k ≤ n के लिए, पहले से गणना की गई छोटी अनुगामी की लागत का उपयोग करके लंबाई k के सभी अनुवर्ती की न्यूनतम लागत का गणना करता है।इसमें समान स्पर्शोन्मुख क्रियाशीलता है और इसके लिए किसी पुनरावर्तन की आवश्यकता नहीं है।
इसमें समान स्पर्शोन्मुख रनटाइम है और इसके लिए किसी पुनरावर्तन की आवश्यकता नहीं है।


स्यूडोकोड:
स्यूडोकोड:
Line 85: Line 84:
*ध्यान दें: dims के लिए पहला इंडेक्स 0 है और m और s के लिए पहला इंडेक्स 1 है।
*ध्यान दें: dims के लिए पहला इंडेक्स 0 है और m और s के लिए पहला इंडेक्स 1 है।


मानक पुस्तकालय से मेमोइज़ेशन डेकोरेटर का उपयोग करके एक [[पायथन (प्रोग्रामिंग भाषा)]] कार्यान्वयन:
मानक संग्रहालय से मेमोइज़ेशन डेकोरेटर का उपयोग करके एक [[पायथन (प्रोग्रामिंग भाषा)]] कार्यान्वयन:


<वाक्यविन्यास लैंग = पायथन 3>
functools import cache से
functools आयात कैश से


डीफ़ मैट्रिक्स चेनऑर्डर (मंद: सूची [int]) -> int:
def matrix chaimorder (dems: list [int]) -> int:
     @cache
     @cache
     डेफ ए (i, जे):
     def a (i,j):
         रिटर्न मिन (((आई, के) + मंद [i] * मंद [के] * मंद [जे] + (के, जे)
         return min ((a(i,k) + dims[i] * dims[k] * dims[j] + a(k,j)
                   के लिए सीमा में (i + 1, j)), डिफ़ॉल्ट = 0)
                   के लिए range में (i + 1, j)), default=0)


     रिटर्न ए (0, लेन (मंद) - 1)
     return a(0, len(dims) - 1)
</वाक्यविन्यास हाइलाइट>
संचालन के हल किए गए क्रम को प्रिंट करने के लिए एक सुविधा विधि के साथ-साथ शून्य-आधारित सरणी अनुक्रमणिका का उपयोग करते हुए एक [[जावा (प्रोग्रामिंग भाषा)]] का कार्यान्वयन करना:
    public class matrix MatrixOrderOptimization


संचालन के हल किए गए क्रम को प्रिंट करने के लिए एक सुविधा विधि के साथ-साथ शून्य-आधारित सरणी अनुक्रमणिका का उपयोग करते हुए एक [[जावा (प्रोग्रामिंग भाषा)]] कार्यान्वयन:
protected int[][]m;
protected int[][]s;


सिंटैक्सहाइलाइट लैंग = जावा>
     public void matrixchainorder (int [] dims) {
पब्लिक क्लास मैट्रिक्सऑर्डरऑप्टिमाइजेशन {
     संरक्षित int[][]m;
    संरक्षित int[][]s;
 
    सार्वजनिक शून्य मैट्रिक्स चेनऑर्डर (इंट [] मंद) {
         int n = dims.length - 1;
         int n = dims.length - 1;
         एम = नया इंट [एन] [एन];
         m = new int[n][n];
         एस = नया इंट [एन] [एन];
         s = new int[n][n];


         for (int lenMinusOne = 1; lenMinusOne <n; lenMinusOne++) {
         for (int lenMinusOne = 1; lenMinusOne <n; lenMinusOne++) {
Line 115: Line 110:
                 int j = i + lenMinusOne;
                 int j = i + lenMinusOne;
                 m[i][j] = Integer.MAX_VALUE;
                 m[i][j] = Integer.MAX_VALUE;
                 के लिए (int k = i; k <j; k++) {
                 for (int k = i; k <j; k++) {
                     int लागत = m[i][k] + m[k+1][j] + dims[i]*dims[k+1]*dims[j+1];
                     int cost = m[i][k] + m[k+1][j] + dims[i]*dims[k+1]*dims[j+1];
                     अगर (लागत <एम [i] [जे]) {
                     अगर (cost <m [i] [j]) {
                         एम [मैं] [जे] = लागत;
                         m[i][j] = cost;
                         एस [मैं] [जे] = के;
                         s[i][j] = k;
                     }
                     }
                 }
                 }
Line 126: Line 121:
     }
     }


     सार्वजनिक शून्य प्रिंटऑप्टिमल पेरेंटिसाइजेशन () {
     public void printOptimalParenthesizations () {
         बूलियन [] inAResult = नया बूलियन [s.length];
         boolean[] inAResult = new boolean[s.length];
         PrintOptimalParenthesizations(s, 0, s.length - 1, inAResult);
         PrintOptimalParenthesizations(s, 0, s.length - 1, inAResult);
     }
     }


     void printOptimalParenthesizations(int[][]s, int i, int j, /* सुंदर प्रिंटिंग के लिए: */ बूलियन[] inAResult) {
     void printOptimalParenthesizations(int[][]s, int i, int j, /* for pretty printing: */ boolean[] inAResult) {
        अगर (मैं! = जे) {
        if (i != j) {
             PrintOptimalParenthesizations(s, i, s[i][j], inAResult);
             PrintOptimalParenthesizations(s, i, s[i][j], inAResult);
             PrintOptimalParenthesizations(s, s[i][j] + 1, j, inAResult);
             PrintOptimalParenthesizations(s, s[i][j] + 1, j, inAResult);
             स्ट्रिंग istr = inAResult [i]? _परिणाम  :   ;
             String istr = inAResult [i]? "_result " : " ";
             स्ट्रिंग jstr = inAResult [जे]? _परिणाम  :   ;
             String jstr = inAResult [j]? "_result " : " ";
             System.out.println (ए_ + आई + आईएसटीआर + * ए_ + जे + जेएसटी);
             System.out.println (" A_" + i + istr + "* A_" + j + jstr);
             परिणाम में [i] = सत्य;
             inAResult[i] = true;
             परिणाम में [जे] = सच;
             inAResult[j] = true;
         }
         }
     }
     }
}
इस कार्यक्रम के अंत में, हमारे पास पूर्ण अनुक्रम के लिए न्यूनतम लागत प्राप्त हो जाता हैं।
</वाक्यविन्यास हाइलाइट>


इस कार्यक्रम के अंत में, हमारे पास पूर्ण अनुक्रम के लिए न्यूनतम लागत है।
== अधिक प्रभावशाली एल्गोरिदम ==
 
ये O(n<sup>3</sup>) डायनेमिक प्रोग्रामिंग एल्गोरिदम इसे अत्यधिक प्रभावशाली है, यद्यपि की वे अत्यधिक जटिल हैं।
== अधिक कुशल एल्गोरिदम ==
ऐसे एल्गोरिदम हैं जो O(n<sup>3</sup>) डायनेमिक प्रोग्रामिंग एल्गोरिदम, हालांकि वे अधिक जटिल हैं।


=== हू और शिंग ===
=== हू और शिंग ===
Line 201: Line 193:
   | citeseerx = 10.1.1.218.8168
   | citeseerx = 10.1.1.218.8168
   }}
   }}
</ref>
</ref> उन्होंने दिखाया कि कैसे आव्यूह श्रृंखला गुणन समस्या को एक [[नियमित बहुभुज]] के त्रिभुज की समस्या में परिवर्तित (या [[Index.php?title=कम|(कम)]]) किया जा सकता है। बहुभुज इस तरह उन्मुख होता है कि निचला भाग क्षैतीज होता है, जिसे आधार कहा जाता है, जो अंतिम परिणाम को दर्शाता है। बहुभुज की अन्य n भुजाएँ, दक्षिणावर्त दिशा में, आव्यूहों को दर्शाती है। एक पक्ष के प्रत्येक किनारे पर शीर्ष उस पक्ष द्वारा दर्शाए गए आव्यूह के आयाम हैं। गुणन श्रृंखला में n आव्यूहो के साथ n−1 [[Index.php?title=बाइनरी संचालन|बाइनरी संचालन]] और C<sub>''n''−1</sub> कोष्ठक लगाने की विधिया है, जहाँ C<sub>''n''−1</sub> (n−1)-वीं [[कैटलन संख्या]] है। एल्गोरिदम C<sub>''n''−1</sub> n+1 भुजाओं वाले बहुभुज के संभावित त्रिभुजों को भी दर्शाता है।
उन्होंने दिखाया कि कैसे मैट्रिक्स श्रृंखला गुणा समस्या को एक [[नियमित बहुभुज]] के बहुभुज त्रिभुज की समस्या में परिवर्तित (या [[कमी (जटिलता)]]) किया जा सकता है। बहुभुज इस तरह उन्मुख होता है कि एक क्षैतिज निचला भाग होता है, जिसे आधार कहा जाता है, जो अंतिम परिणाम का प्रतिनिधित्व करता है। बहुभुज की अन्य n भुजाएँ, दक्षिणावर्त दिशा में, आव्यूहों का प्रतिनिधित्व करती हैं। एक पक्ष के प्रत्येक छोर पर शीर्ष उस पक्ष द्वारा दर्शाए गए मैट्रिक्स के आयाम हैं। गुणन श्रृंखला में n मेट्रिसेस के साथ n−1 [[बाइनरी ऑपरेशन]] और C हैं<sub>''n''−1</sub> कोष्ठक लगाने के तरीके, जहाँ C<sub>''n''−1</sub> (n−1)-वीं [[कैटलन संख्या]] है। एल्गोरिदम शोषण करता है कि सी भी हैं<sub>''n''−1</sub> n+1 भुजाओं वाले बहुभुज के संभावित त्रिभुज।


यह छवि एक नियमित [[षट्भुज]] के संभावित त्रिभुजों को दर्शाती है। ये अलग-अलग तरीकों से मेल खाते हैं जो 5 मैट्रिसेस के उत्पाद के लिए गुणा करने के लिए कोष्ठकों को रखा जा सकता है।
यह चित्र एक नियमित [[षट्भुज]] के संभावित त्रिभुजों को दर्शाती है। ये अलग-अलग प्रकारो से मिलते हैं जो 5 आव्यूहों  के उत्पादों से गुणा करने के लिए कोष्ठकों को रखा जा सकता है।
[[Image:Catalan-Hexagons-example.svg|400px|center]]नीचे दिए गए उदाहरण के लिए, चार भुजाएँ हैं: A, B, C और अंतिम परिणाम ABC। A एक 10×30 मैट्रिक्स है, B एक 30×5 मैट्रिक्स है, C एक 5×60 मैट्रिक्स है, और अंतिम परिणाम 10×60 मैट्रिक्स है। इस उदाहरण के लिए नियमित बहुभुज एक 4-गॉन है, अर्थात एक वर्ग:
[[Image:Catalan-Hexagons-example.svg|400px|center]]नीचे दिए गए उदाहरण में, चार भुजाएँ A, B, C और अंतिम परिणाम ABC है। A एक 10×30 आव्यूह है, B एक 30×5 आव्यूह  है, C एक 5×60 आव्यूह है, और अंतिम परिणाम 10×60 आव्यूह है। इस उदाहरण के लिए नियमित बहुभुज एक 4-भुजीय संरचना है, अर्थात एक वर्ग:
[[File:Matrix chain multiplication polygon example.svg|125px|center]]मैट्रिक्स उत्पाद AB एक 10x5 मैट्रिक्स है और BC एक 30x60 मैट्रिक्स है। इस उदाहरण में दो संभावित त्रिभुज हैं:
[[File:Matrix chain multiplication polygon example.svg|125px|center]]आव्यूह उत्पाद AB एक 10x5 आव्यूह है और BC एक 30x60 आव्यूह है। इस उदाहरण में दो संभावित त्रिभुज हैं:
<gallery mode="packed">
<gallery mode="packed">
File:Matrix chain multiplication polygon example AB.svg|alt=(AB)C|(AB)C का बहुभुज प्रतिनिधित्व
File:Matrix chain multiplication polygon example AB.svg|alt=(AB)C|(AB)C का बहुभुज प्रतिनिधित्व
Line 213: Line 204:
आवश्यक गुणन की संख्या के संदर्भ में एकल त्रिभुज की लागत उसके शीर्षों का गुणनफल है। बहुभुज के एक विशेष त्रिभुज की कुल लागत उसके सभी त्रिभुजों की लागतों का योग है:
आवश्यक गुणन की संख्या के संदर्भ में एकल त्रिभुज की लागत उसके शीर्षों का गुणनफल है। बहुभुज के एक विशेष त्रिभुज की कुल लागत उसके सभी त्रिभुजों की लागतों का योग है:


:(AB)C: (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 गुणन
:(AB)C: (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 गुना
:A(BC): (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 गुणन
:A(BC): (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 गुना


हू एंड शिंग ने एक एल्गोरिद्म विकसित किया जो O(n log n) समय में न्यूनतम लागत विभाजन समस्या के लिए एक इष्टतम समाधान ढूंढता है। एल्गोरिथम की शुद्धता का उनका प्रमाण लेम्मा 1 पर निर्भर करता है जो 1981 की तकनीकी रिपोर्ट में साबित हुआ और प्रकाशित पेपर से हटा दिया गया।<ref>
हू तथा शिंग ने एक एल्गोरिद्म विकसित किया जो O(n log n) समय में न्यूनतम लागत विभाजन समस्या के लिए एक उच्तम समाधान निकालता है। एल्गोरिथम की शुद्धता का उनका प्रमाण लेम्मा 1 पर निर्भर करता है जो 1981 की तकनीकी विवरण में सिद्ध हुआ तथा प्रकाशित पत्र से हटा दिया गया था ।<ref>
{{cite techreport
{{cite techreport
   | last1 = Hu
   | last1 = Hu
Line 229: Line 220:
   | at=Part II, page 3
   | at=Part II, page 3
}}
}}
</ref><ref name=HuPartII/>लेम्मा की तकनीकी रिपोर्ट का प्रमाण गलत है, लेकिन शिंग ने एक सही प्रमाण प्रस्तुत किया है।<ref name=Schwartz>{{cite journal |last1=Schwartz |first1=Oded |last2=Weiss |first2=Elad |title=Revisiting “Computation of Matrix Chain Products'' |journal=SIAM Journal on Computing |date=January 2019 |volume=48 |issue=5 |pages=1481–1486 |doi=10.1137/18m1195401}}</ref>
</ref><ref name=HuPartII/>लेम्मा की तकनीकी विवरण का प्रमाण गलत है, लेकिन शिंग ने एक सही प्रमाण प्रस्तुत किया है।<ref name=Schwartz>{{cite journal |last1=Schwartz |first1=Oded |last2=Weiss |first2=Elad |title=Revisiting “Computation of Matrix Chain Products'' |journal=SIAM Journal on Computing |date=January 2019 |volume=48 |issue=5 |pages=1481–1486 |doi=10.1137/18m1195401}}</ref>
 
=== अन्य O(''n log n'') एल्गोरिदम ===
 
=== अन्य ओ (एन लॉग एन) एल्गोरिदम ===
 
वांग, झू और तियान ने एक सरलीकृत O(n log m) एल्गोरिथम प्रकाशित किया है, जहां n श्रृंखला में मैट्रिक्स की संख्या है और m दी गई मैट्रिक्स श्रृंखला के आयाम अनुक्रम में स्थानीय न्यूनतम की संख्या है।<ref>{{cite journal |last1=Wang |first1=Xiaodong |last2=Zhu |first2=Daxin |last3=Tian |first3=Jun |title=मैट्रिक्स श्रृंखला की कुशल गणना|journal=2013 8th International Conference on Computer Science Education |date=April 2013 |pages=703–707 |doi=10.1109/ICCSE.2013.6553999}}</ref>
निम्बार्क, गोहेल और दोशी ने एक लालची ओ(एन लॉग एन) एल्गोरिथम प्रकाशित किया है,<ref>{{cite journal |last1=Nimbark |first1=Hitesh |last2=Gohel |first2=Shobhen |last3=Doshi |first3=Nishant |title=पैकेट प्रसंस्करण के लिए लालची तकनीक का उपयोग करके मैट्रिक्स श्रृंखला गुणन के लिए एक उपन्यास दृष्टिकोण|journal=Computer Networks and Information Technologies |date=2011 |volume=142 |pages=318–321 |doi=10.1007/978-3-642-19542-6_58}}</ref> लेकिन उनकी इष्टतमता का प्रमाण गलत है और उनका एल्गोरिथ्म कुछ मैट्रिक्स श्रृंखलाओं के लिए सबसे कुशल कोष्ठक असाइनमेंट का उत्पादन करने में विफल रहता है।<ref name=Schwartz/>


वांग, झू और तियान ने एक सरलीकृत O(n log m) एल्गोरिथम प्रकाशित किया है, जहां n श्रृंखला में आव्यूह की संख्या है और m दी गई आव्यूह श्रृंखला के आयाम में स्थित न्यूनतम अनुक्रम की संख्या है।<ref>{{cite journal |last1=Wang |first1=Xiaodong |last2=Zhu |first2=Daxin |last3=Tian |first3=Jun |title=मैट्रिक्स श्रृंखला की कुशल गणना|journal=2013 8th International Conference on Computer Science Education |date=April 2013 |pages=703–707 |doi=10.1109/ICCSE.2013.6553999}}</ref>


निम्बार्क, गोहेल और डोशी ने एक ग्रीडी O(n log n) एल्गोरिथम प्रकाशित किया है,<ref>{{cite journal |last1=Nimbark |first1=Hitesh |last2=Gohel |first2=Shobhen |last3=Doshi |first3=Nishant |title=पैकेट प्रसंस्करण के लिए लालची तकनीक का उपयोग करके मैट्रिक्स श्रृंखला गुणन के लिए एक उपन्यास दृष्टिकोण|journal=Computer Networks and Information Technologies |date=2011 |volume=142 |pages=318–321 |doi=10.1007/978-3-642-19542-6_58}}</ref> परन्तु उनके आशावाद का प्रमाण गलत है और उनका एल्गोरिथ्म कुछ आव्यूह श्रृंखलाओं के लिए सबसे कुशल कोष्ठक के कार्यभार का उत्पादन करने में विफल रहा है।<ref name="Schwartz" />
=== चिन-हू-शिंग अनुमानित समाधान ===
=== चिन-हू-शिंग अनुमानित समाधान ===
चिन द्वारा स्वतंत्र रूप से बनाया गया एल्गोरिथम<ref>{{cite journal |last1=Chin |first1=Francis Y. |title=मैट्रिक्स श्रृंखला उत्पादों के निकट-इष्टतम संगणना क्रम के निर्धारण के लिए एक O(n) एल्गोरिद्म|journal=Communications of the ACM |date=July 1978 |volume=21 |issue=7 |pages=544–549 |doi=10.1145/359545.359556|doi-access=free}}</ref> और हू एंड शिंग<ref>{{cite journal |last1=Hu |first1=T.C |last2=Shing |first2=M.T |title=उत्तल बहुभुज के निकट-इष्टतम विभाजन को खोजने के लिए एक O(n) एल्गोरिद्म|journal=Journal of Algorithms |date=June 1981 |volume=2 |issue=2 |pages=122–138 |doi=10.1016/0196-6774(81)90014-6}}</ref> (एन) में चलता है और एक कोष्ठक उत्पन्न करता है जो इष्टतम विकल्प से अधिकतम 15.47% खराब है। ज्यादातर मामलों में एल्गोरिदम इष्टतम समाधान या समाधान उत्पन्न करता है जो इष्टतम से केवल 1-2 प्रतिशत खराब होता है।<ref name="Czumaj" />
चिन तथा हू और शिंग<ref>{{cite journal |last1=Hu |first1=T.C |last2=Shing |first2=M.T |title=उत्तल बहुभुज के निकट-इष्टतम विभाजन को खोजने के लिए एक O(n) एल्गोरिद्म|journal=Journal of Algorithms |date=June 1981 |volume=2 |issue=2 |pages=122–138 |doi=10.1016/0196-6774(81)90014-6}}</ref> द्वारा बनाया गया एल्गोरीदम O(n) में कार्य करता है और एक कोष्ठक उत्पन्न करता है जो श्रेष्ठतम विकल्प से अधिकतम 15.47% कम प्रभावी है। ज्यादातर स्थितियों में एल्गोरिदम ऐसा समाधान उत्पन्न करता है जो श्रेष्ठतम से केवल 1-2 प्रतिशत ही कम प्रभावी होता है।<ref name="Czumaj" />


एल्गोरिथ्म समस्या को बहुभुज विभाजन समस्या में अनुवाद करके शुरू होता है। बहुभुज के प्रत्येक शीर्ष V से एक भार w जुड़ा होता है। मान लीजिए कि हमारे पास लगातार तीन शीर्ष हैं <math>V_{i-1}, V_i, V_{i+1}</math>, ओर वो <math>V_{\min}</math> न्यूनतम वजन वाला शीर्ष है <math>w_{\min}</math>.
एल्गोरिथ्म समस्या, बहुभुज विभाजन समस्या में परिवर्तित करके शुरू होता है। बहुभुज के प्रत्येक शीर्ष V से एक भार w जुड़ा होता है। मान लीजिए कि हमारे पास क्रमसः तीन शीर्ष हैं <math>V_{i-1}, V_i, V_{i+1}</math>, और वो <math>V_{\min}</math> न्यूनतम भार <math>w_{\min}</math>वाला शीर्ष है। हम चतुर्भुज को <math>V_{\min}, V_{i-1}, V_i, V_{i+1}</math> (दक्षिणावर्त क्रम में) शीर्षो के साथ देखते है। हम इसे दो तरह से त्रिभुजाकार बना सकते है:
हम चतुर्भुज को शीर्षों के साथ देखते हैं <math>V_{\min}, V_{i-1}, V_i, V_{i+1}</math> (दक्षिणावर्त क्रम में)
हम इसे दो तरह से त्रिभुज कर सकते हैं:
*<math>(V_{\min}, V_{i-1}, V_i)</math> और <math>(V_{\min}, V_{i+1}, V_i)</math>, लागत के साथ <math>w_{\min}w_{i-1}w_i+w_{\min}w_{i+1}w_i</math>
*<math>(V_{\min}, V_{i-1}, V_i)</math> और <math>(V_{\min}, V_{i+1}, V_i)</math>, लागत के साथ <math>w_{\min}w_{i-1}w_i+w_{\min}w_{i+1}w_i</math>
*<math>(V_{\min}, V_{i-1}, V_{i+1})</math> और <math>(V_{i-1}, V_i, V_{i+1})</math> लागत के साथ <math>w_{\min}w_{i-1}w_{i+1}+w_{i-1}w_{i}w_{i+1}</math>.
*<math>(V_{\min}, V_{i-1}, V_{i+1})</math> और <math>(V_{i-1}, V_i, V_{i+1})</math> लागत के साथ <math>w_{\min}w_{i-1}w_{i+1}+w_{i-1}w_{i}w_{i+1}</math>.


इसलिए, अगर
इसलिए, यदि


: <math>w_{\min}w_{i-1}w_{i+1}+w_{i-1}w_{i}w_{i+1}<w_{\min}w_{i-1}w_i+w_{\min}w_{i+1}w_i </math>
: <math>w_{\min}w_{i-1}w_{i+1}+w_{i-1}w_{i}w_{i+1}<w_{\min}w_{i-1}w_i+w_{\min}w_{i+1}w_i </math>
Line 253: Line 239:


: <math>\frac{1}{w_i}+\frac{1}{w_{\min}}<\frac{1}{w_{i+1}}+\frac{1}{w_{i-1}} </math>
: <math>\frac{1}{w_i}+\frac{1}{w_{\min}}<\frac{1}{w_{i+1}}+\frac{1}{w_{i-1}} </math>
हम शीर्ष को हटा देते हैं <math>V_i</math> बहुभुज से और भुजा जोड़ें <math>(V_{i-1}, V_{i+1})</math> त्रिकोण को।
हम शीर्ष <math>V_i</math> को बहुभुज से हटा देते है और <math>(V_{i-1}, V_{i+1})</math>भुजाओं को त्रिकोण में जोड़ते हैं। हम इस प्रक्रिया को तब तक दोहराते हैं जब तक कि <math>V_i</math> पहले की स्थितियों को संतुष्ट नहीं कर देता है। शेष सभी शीर्षों के लिए <math>V_n</math>, हम <math>(V_{\min}, V_n)</math> भुजाओं को त्रिकोण में जोड़ देते है। यह हमें लगभग उच्चतम त्रिभुज देता है।
हम इस प्रक्रिया को तब तक दोहराते हैं जब तक कि नहीं <math>V_i</math> ऊपर की स्थिति को संतुष्ट करता है।
शेष सभी शीर्षों के लिए <math>V_n</math>, हम पक्ष जोड़ते हैं <math>(V_{\min}, V_n)</math> त्रिकोण को।
यह हमें लगभग इष्टतम त्रिभुज देता है।


== सामान्यीकरण ==
== सामान्यीकरण ==


मैट्रिक्स श्रृंखला गुणन समस्या एक अधिक सार समस्या को हल करने के लिए सामान्यीकृत करती है: वस्तुओं का एक रैखिक अनुक्रम दिया जाता है, उन वस्तुओं पर एक साहचर्य बाइनरी ऑपरेशन, और किसी भी दो वस्तुओं पर उस ऑपरेशन को करने की लागत की गणना करने का एक तरीका (साथ ही सभी आंशिक) परिणाम), अनुक्रम पर ऑपरेशन को लागू करने के लिए वस्तुओं को समूहित करने के लिए न्यूनतम लागत तरीके की गणना करें।<ref>G. Baumgartner, D. Bernholdt, D. Cociorva, R. Harrison, M. Nooijen, J. Ramanujam and P. Sadayappan. A Performance Optimization Framework for Compilation of Tensor Contraction Expressions into Parallel Programs. 7th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS '02). Fort Lauderdale, Florida. 2002 available at http://citeseer.ist.psu.edu/610463.html and at http://www.csc.lsu.edu/~gb/TCE/Publications/OptFramework-HIPS02.pdf</ref> इसका कुछ हद तक काल्पनिक विशेष मामला स्ट्रिंग्स की सूची का [[स्ट्रिंग संयोजन]] है। [[सी (प्रोग्रामिंग भाषा)]] में, उदाहरण के लिए, स्ट्रैट का उपयोग करके लंबाई एम और एन के दो तारों को जोड़ने की लागत (एम + एन) है, क्योंकि हमें पहली स्ट्रिंग के अंत को खोजने के लिए (एम) समय की आवश्यकता है और ओ ( एन) दूसरी स्ट्रिंग को इसके अंत में कॉपी करने का समय। इस लागत फ़ंक्शन का उपयोग करके, हम स्ट्रिंग्स के अनुक्रम को जोड़ने का सबसे तेज़ तरीका खोजने के लिए एक गतिशील प्रोग्रामिंग एल्गोरिदम लिख सकते हैं। हालाँकि, यह अनुकूलन बेकार है क्योंकि हम सीधे समय में स्ट्रिंग्स को उनकी लंबाई के योग के अनुपात में जोड़ सकते हैं। एकल लिंक्ड सूचियों के लिए एक समान समस्या मौजूद है।
आव्यूह श्रृंखला गुणन समस्या एक अधिक सार्थक समस्या को हल करने के लिए सामान्यीकृत करती है: वस्तुओं का एक रैखिक अनुक्रम दिया जाता है, उन वस्तुओं पर एक साहचर्य बाइनरी संचालन, और किसी भी दो वस्तुओं पर उस संचालन को करने की लागत की गणना करने की एक विधि (साथ ही सभी आंशिक परिणाम), अनुक्रम पर संचालन को प्रयोग करने के लिए वस्तुओं को समूहित करने के लिए न्यूनतम लागत प्रकारो की गणना किया जाता है।<ref>G. Baumgartner, D. Bernholdt, D. Cociorva, R. Harrison, M. Nooijen, J. Ramanujam and P. Sadayappan. A Performance Optimization Framework for Compilation of Tensor Contraction Expressions into Parallel Programs. 7th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS '02). Fort Lauderdale, Florida. 2002 available at http://citeseer.ist.psu.edu/610463.html and at http://www.csc.lsu.edu/~gb/TCE/Publications/OptFramework-HIPS02.pdf</ref> इसका कुछ हद तक काल्पनिक विशेष स्थितियां तंतु की सूची का [[Index.php?title=तंतु संयोजन|तंतु संयोजन]] है। उदहारण के लिए, [[सी (प्रोग्रामिंग भाषा)]] में, स्ट्रैट का उपयोग करके लंबाई m और n के दो तारों को जोड़ने की लागत O(m + n) है, क्योंकि हमें पहली तंतु के अंत को खोजने के लिए O(m) समय तथा O(n) दूसरी तंतु को इसके अंत में दोहराने के समय आवश्यक होता है। इस लागत फ़ंक्शन का उपयोग करके, हम तंतु के अनुक्रम को जोड़ने का सबसे तेज़ विधि प्राप्त करने के लिए एक गतिशील प्रोग्रामिंग एल्गोरिदम लिख सकते हैं। यद्यपि की, यह अनुकूलन अधिक प्रभावी नहीं है क्योंकि हम सीधे समय में तंतु को उनकी लंबाई के योग के अनुपात में जोड़ सकते हैं। एकल लिंक्ड सूचियों के लिए एक समान समस्या उपस्थित होती है।
 
समानांतर प्रोसेसर उपलब्ध होने पर समस्या को हल करने के लिए एक और सामान्यीकरण है। इस मामले में, मैट्रिक्स उत्पाद के प्रत्येक कारक की गणना करने की लागत जोड़ने के बजाय, हम अधिकतम लेते हैं क्योंकि हम उन्हें एक साथ कर सकते हैं। यह न्यूनतम लागत और अंतिम इष्टतम समूहीकरण दोनों को अत्यधिक प्रभावित कर सकता है; अधिक संतुलित समूह जो सभी प्रोसेसर को व्यस्त रखते हैं, के पक्षधर हैं। और भी परिष्कृत तरीके हैं।<ref>Heejo Lee, Jong Kim, Sungje Hong, and Sunggu Lee. [http://ccs.korea.ac.kr/pds/tpds03.pdf Processor Allocation and Task Scheduling of Matrix Chain Products on Parallel Systems] {{webarchive|url=https://web.archive.org/web/20110722132611/http://ccs.korea.ac.kr/pds/tpds03.pdf |date=2011-07-22 }}. ''IEEE Trans. on Parallel and Distributed Systems,'' Vol. 14, No. 4, pp.&nbsp;394–407, Apr. 2003</ref>
 


एक और सामान्यीकरण,समानांतर प्रोसेसर उपलब्ध होने पर समस्या को हल करना है। इस स्थिति में, आव्यूह उत्पाद के प्रत्येक कारक की गणना करने की लागत जोड़ने के बदले में, हम अधिकतम को ले लेते है क्योकि हम उन्हें एक ही साथ हल कर सकते है। यह न्यूनतम लागत और अंतिम उच्त्तम समूहीकरण दोनों को अत्यधिक प्रभावित कर सकता है; अधिक संतुलित समूह जो सभी प्रोसेसर के पक्षधर हैं उनको कार्यरत रखने की और भी परिष्कृत विधिया हैं।<ref>Heejo Lee, Jong Kim, Sungje Hong, and Sunggu Lee. [http://ccs.korea.ac.kr/pds/tpds03.pdf Processor Allocation and Task Scheduling of Matrix Chain Products on Parallel Systems] {{webarchive|url=https://web.archive.org/web/20110722132611/http://ccs.korea.ac.kr/pds/tpds03.pdf |date=2011-07-22 }}. ''IEEE Trans. on Parallel and Distributed Systems,'' Vol. 14, No. 4, pp.&nbsp;394–407, Apr. 2003</ref>
== यह भी देखें ==
== यह भी देखें ==


*[[असोसिएहेड्रोन]]
*[[असोसिएहेड्रोन]]
*[[तामरी जाली]]
*[[Index.php?title=तामरी लैटिस|तामरी लैटिस  ]]


== संदर्भ ==
== संदर्भ ==
Line 274: Line 255:
{{reflist}}
{{reflist}}


{{DEFAULTSORT:Matrix Chain Multiplication}}[[Category: अनुकूलन एल्गोरिदम और तरीके]] [[Category: मैट्रिसेस]] [[Category: गतिशील प्रोग्रामिंग]]
{{DEFAULTSORT:Matrix Chain Multiplication}}
 
 


[[Category: Machine Translated Page]]
[[Category:CS1]]
[[Category:Created On 17/03/2023]]
[[Category:Created On 17/03/2023|Matrix Chain Multiplication]]
[[Category:Lua-based templates|Matrix Chain Multiplication]]
[[Category:Machine Translated Page|Matrix Chain Multiplication]]
[[Category:Pages with script errors|Matrix Chain Multiplication]]
[[Category:Short description with empty Wikidata description|Matrix Chain Multiplication]]
[[Category:Templates Vigyan Ready|Matrix Chain Multiplication]]
[[Category:Templates that add a tracking category|Matrix Chain Multiplication]]
[[Category:Templates that generate short descriptions|Matrix Chain Multiplication]]
[[Category:Templates using TemplateData|Matrix Chain Multiplication]]
[[Category:Webarchive template wayback links]]
[[Category:अनुकूलन एल्गोरिदम और तरीके|Matrix Chain Multiplication]]
[[Category:गतिशील प्रोग्रामिंग|Matrix Chain Multiplication]]
[[Category:मैट्रिसेस|Matrix Chain Multiplication]]

Latest revision as of 12:02, 22 August 2023

आव्यूह श्रृंखला गुणन (या आव्यूह श्रृंखला क्रम समस्या[1] आव्यूह (गणित) के दिए गए अनुक्रम को आव्यूह गुणन करने के सबसे कुशल प्रकार से संबंधित एक अनुकूलन समस्या है। समस्या वास्तव में गुणन करने के लिए नहीं है, अपितु केवल निहित आव्यूह गुणन के अनुक्रम को सुनिश्चित करने के लिए है। गतिशील प्रोग्रामिंग का उपयोग करके समस्या का समाधान किया जा सकता है।

इसके कई विकल्प हैं क्योंकि आव्यूह गुणन साहचर्य है। दूसरे शब्दों में, कोई प्रभाव नहीं पड़ता की गुणनफल किस प्रकार से कोष्ठक में प्रस्तुत किया गया है, प्राप्त परिणाम वही रहता है। उदाहरण के लिए, चार मैट्रिक्स A,B, C और D के लिए, पांच संभावित विकल्प हैं:

((AB)C)D = (A(BC))D = (AB) (CD) = A((BC)D) = A(B(CD))।

यद्यपि यह उत्पाद को प्रभावित नहीं करता है, जिस क्रम में शब्दों को कोष्ठक में रखा गया है, वह उत्पाद की गणना करने के लिए आवश्यक सरल अंकगणितीय क्रियाओं की संख्या अर्थात कम्प्यूटेशनल जटिलता को प्रभावित करता है। आव्यूह X × Y का आव्यूह Y × Z द्वारा गुणन करने के लिए XYZ साधारण गुणन और X(Y − 1)Z साधारण जोड़ की आवश्यक्ता होती है। इस संदर्भ में, क्रियाशील जटिलता के माप के रूप में साधारण गुणन की संख्या का उपयोग करना विशिष्ट है।

यदि A एक 10 × 30 आव्यूह है, B एक 30 × 5 आव्यूह है, और C एक 5 × 60 आव्यूह है, तो

कंप्यूटिंग (AB)C की (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 संचालन की आवश्यक्ता है, यद्यपि की
कंप्यूटिंग A(BC) की (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 संचालन की आवश्यक्ता है ।

स्पष्ट रूप से पहली विधि अधिक कुशल है। इस सुचना के साथ, समस्या कथन को परिष्कृत किया जा सकता है कि n आव्यूहों के उत्पाद का इष्टतम कोष्ठक कैसे निर्धारित किया जाए? प्रत्येक संभावित कोष्ठक (पाशविक बल) की जाँच करने के लिए क्रियाशील समय की जटिलता की आवश्यकता होगी | समस्या को संबंधित उप-समस्याओं के समूह में तोड़कर इस समस्या का त्वरित समाधान प्राप्त किया जा सकता है।

क्रियाशील अंकगणितीय प्रोग्रामिंग

प्रारम्भ करने के लिए, मान लें कि हम वास्तव में जानना चाहते हैं कि न्यूनतम लागत, अथवा अंकगणितीय संचालन की न्यूनतम संख्या आव्यूहों की गुणा करने के लिए आवश्यक है। यदि हम केवल दो आव्यूहों का गुणा कर रहे हैं, तो न्यूनतम लगत ही इसे करने का एकमात्र प्रकार है । सामान्यतया, हम निम्न पुनरावर्तन का उपयोग करके न्यूनतम लागत प्राप्त कर सकते है:

  • आव्यूहों का क्रम लें और इसे दो क्रमों में अलग करें।
  • प्रत्येक अनुवर्ती को गुणा करने की न्यूनतम लागत ज्ञात कीजिए।
  • इन लागतों को एक साथ जोड़ें, और दो परिणाम आव्यूह को गुणा करने की लागत में जोड़ें।
  • यह प्रत्येक संभावित स्थिति के लिए करें जिस पर आव्यूह के अनुक्रम को विभाजित किया जा सकता है, और उन सभी पर न्यूनतम मान प्रत्यारोपित करते है ।

उदाहरण के लिए, यदि हमारे पास चार आव्यूह ABCD हैं, तो हम (A) (BCD), (AB) (CD), और (ABC) (D) में से प्रत्येक को प्राप्त के लिए आवश्यक लागत की गणना करते हैं, न्यूनतम लागत प्राप्त करने के लिए पुनरावर्ती करते हैं। ABC,AB, CD और BCD की गणना करते है। इसके पश्चात हम सबसे अच्छे वाले को चुनते है। अभी भी, यह न केवल न्यूनतम लागत प्रदान करता है, अपितु गुणा करने का सबसे अच्छा युक्ति भी प्रदर्शित करता है: इसे उस युक्ति से समूहित करते है जो सबसे कम कुल लागत प्रदान करता है, तथा प्रत्येक कारक के लिए ऐसा ही किया जाता है।

चुकी, इस एल्गोरिथ्म में घातीय क्रियाशील जटिलता है जो इसे सभी क्रमपरिवर्तनों को जांचने के दृष्टिकोण के रूप में अक्षम बनाती है। इसका कारण एल्गोरिदम का बहुत अधिक अनावश्यक कार्य करना है। उदाहरण के लिए, ऊपर हमने ABC और AB दोनों की गणना के लिए सर्वोत्तम लागत खोजने के लिए एक पुनरावर्ती की थी। परन्तु ABC की गणना के लिए सर्वोत्तम लागत खोजने के लिए AB के लिए भीं सर्वोत्तम लागत खोजने की आवश्यकता है। जैसे-जैसे पुनरावर्तन बढ़ता जाता है, इस प्रकार की अनावश्यक पुनरावृत्ति अधिक से अधिक होती जाती है।

एक सरल समाधान को मेमोराइज़ेशन कहा जाता है: प्रत्येक बार जब हम एक विशिष्ट परिणाम को गुणा करने के लिए आवश्यक न्यूनतम लागत की गणना करते हैं, तो हम इसे संगृहीत करते हैं। यदि हमें कभी भी इसकी गणना करने के लिए कहा जाता है, तो हम केवल संगृहीत किया गया उत्तर देते हैं, और इसकी पुनर्गणना नहीं करते हैं। चूंकि यहाँ पर n2/2 अलग-अलग अनुवर्ती है, जहां n आव्यूहों की संख्या है, इसे पूर्ण करने के लिए उचित स्थान आवश्यक है। यह दर्शाया जा सकता है कि यह सरल युक्ति क्रियाशीलता को O(n3) O से (2n) कम कर देती है, जो वास्तविक अनुप्रयोगों के लिए पर्याप्त से अधिक उपयुक्त है। यह टॉप-डाउन गतिकी प्रोग्रामिंग है।

निम्नलिखित बॉटम-अप दृष्टिकोण[2] , प्रत्येक 2 ≤ k ≤ n के लिए, पहले से गणना की गई छोटी अनुगामी की लागत का उपयोग करके लंबाई k के सभी अनुवर्ती की न्यूनतम लागत का गणना करता है।इसमें समान स्पर्शोन्मुख क्रियाशीलता है और इसके लिए किसी पुनरावर्तन की आवश्यकता नहीं है।

स्यूडोकोड:

// Matrix A[i] has dimension dims[i-1] x dims[i] for i = 1..n
MatrixChainOrder(int dims[])
{
    // length[dims] = n + 1
    n = dims.length - 1;
    // m[i,j] = Minimum number of scalar multiplications (i.e., cost)
    // needed to compute the matrix A[i]A[i+1]...A[j] = A[i..j]
    // The cost is zero when multiplying one matrix
    for (i = 1; i <= n; i++)
        m[i, i] = 0;

    for (len = 2; len <= n; len++) { // Subsequence lengths
        for (i = 1; i <= n - len + 1; i++) {
            j = i + len - 1;
            m[i, j] = MAXINT;
            for (k = i; k <= j - 1; k++) {
                cost = m[i, k] + m[k+1, j] + dims[i-1]*dims[k]*dims[j];
                if (cost < m[i, j]) {
                    m[i, j] = cost;
                    s[i, j] = k; // Index of the subsequence split that achieved minimal cost
                }
            }
        }
    }
}
  • ध्यान दें: dims के लिए पहला इंडेक्स 0 है और m और s के लिए पहला इंडेक्स 1 है।

मानक संग्रहालय से मेमोइज़ेशन डेकोरेटर का उपयोग करके एक पायथन (प्रोग्रामिंग भाषा) कार्यान्वयन:

functools import cache से

def matrix chaimorder (dems: list [int]) -> int:

   @cache
   def a (i,j):
       return min ((a(i,k) + dims[i] * dims[k] * dims[j] + a(k,j)
                  के लिए range में (i + 1, j)), default=0)
   return a(0, len(dims) - 1)

संचालन के हल किए गए क्रम को प्रिंट करने के लिए एक सुविधा विधि के साथ-साथ शून्य-आधारित सरणी अनुक्रमणिका का उपयोग करते हुए एक जावा (प्रोग्रामिंग भाषा) का कार्यान्वयन करना:

   public class matrix MatrixOrderOptimization 
protected int[][]m;
protected int[][]s;
   public void matrixchainorder (int [] dims) {
       int n = dims.length - 1;
       m = new int[n][n];
       s = new int[n][n];
       for (int lenMinusOne = 1; lenMinusOne <n; lenMinusOne++) {
           for (int i = 0; i <n - lenMinusOne; i++) {
               int j = i + lenMinusOne;
               m[i][j] = Integer.MAX_VALUE;
               for (int k = i; k <j; k++) {
                   int cost = m[i][k] + m[k+1][j] + dims[i]*dims[k+1]*dims[j+1];
                   अगर (cost <m [i] [j]) {
                       m[i][j] = cost;
                       s[i][j] = k;
                   }
               }
           }
       }
   }
   public void printOptimalParenthesizations () {
       boolean[] inAResult = new boolean[s.length];
       PrintOptimalParenthesizations(s, 0, s.length - 1, inAResult);
   }
   void printOptimalParenthesizations(int[][]s, int i, int j, /* for pretty printing: */ boolean[] inAResult) {
        if (i != j) {
           PrintOptimalParenthesizations(s, i, s[i][j], inAResult);
           PrintOptimalParenthesizations(s, s[i][j] + 1, j, inAResult);
           String istr = inAResult [i]? "_result " : " ";
           String jstr = inAResult [j]? "_result " : " ";
           System.out.println (" A_" + i + istr + "* A_" + j + jstr);
           inAResult[i] = true;
           inAResult[j] = true;
       }
   }

इस कार्यक्रम के अंत में, हमारे पास पूर्ण अनुक्रम के लिए न्यूनतम लागत प्राप्त हो जाता हैं।

अधिक प्रभावशाली एल्गोरिदम

ये O(n3) डायनेमिक प्रोग्रामिंग एल्गोरिदम इसे अत्यधिक प्रभावशाली है, यद्यपि की वे अत्यधिक जटिल हैं।

हू और शिंग

हू और शिंग द्वारा प्रकाशित एल्गोरिद्म O(n log n) कम्प्यूटेशनल जटिलता प्राप्त करता है।[3][4][5] उन्होंने दिखाया कि कैसे आव्यूह श्रृंखला गुणन समस्या को एक नियमित बहुभुज के त्रिभुज की समस्या में परिवर्तित (या (कम)) किया जा सकता है। बहुभुज इस तरह उन्मुख होता है कि निचला भाग क्षैतीज होता है, जिसे आधार कहा जाता है, जो अंतिम परिणाम को दर्शाता है। बहुभुज की अन्य n भुजाएँ, दक्षिणावर्त दिशा में, आव्यूहों को दर्शाती है। एक पक्ष के प्रत्येक किनारे पर शीर्ष उस पक्ष द्वारा दर्शाए गए आव्यूह के आयाम हैं। गुणन श्रृंखला में n आव्यूहो के साथ n−1 बाइनरी संचालन और Cn−1 कोष्ठक लगाने की विधिया है, जहाँ Cn−1 (n−1)-वीं कैटलन संख्या है। एल्गोरिदम Cn−1 n+1 भुजाओं वाले बहुभुज के संभावित त्रिभुजों को भी दर्शाता है।

यह चित्र एक नियमित षट्भुज के संभावित त्रिभुजों को दर्शाती है। ये अलग-अलग प्रकारो से मिलते हैं जो 5 आव्यूहों के उत्पादों से गुणा करने के लिए कोष्ठकों को रखा जा सकता है।

Catalan-Hexagons-example.svg

नीचे दिए गए उदाहरण में, चार भुजाएँ A, B, C और अंतिम परिणाम ABC है। A एक 10×30 आव्यूह है, B एक 30×5 आव्यूह है, C एक 5×60 आव्यूह है, और अंतिम परिणाम 10×60 आव्यूह है। इस उदाहरण के लिए नियमित बहुभुज एक 4-भुजीय संरचना है, अर्थात एक वर्ग:

Matrix chain multiplication polygon example.svg

आव्यूह उत्पाद AB एक 10x5 आव्यूह है और BC एक 30x60 आव्यूह है। इस उदाहरण में दो संभावित त्रिभुज हैं:

आवश्यक गुणन की संख्या के संदर्भ में एकल त्रिभुज की लागत उसके शीर्षों का गुणनफल है। बहुभुज के एक विशेष त्रिभुज की कुल लागत उसके सभी त्रिभुजों की लागतों का योग है:

(AB)C: (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 गुना
A(BC): (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 गुना

हू तथा शिंग ने एक एल्गोरिद्म विकसित किया जो O(n log n) समय में न्यूनतम लागत विभाजन समस्या के लिए एक उच्तम समाधान निकालता है। एल्गोरिथम की शुद्धता का उनका प्रमाण लेम्मा 1 पर निर्भर करता है जो 1981 की तकनीकी विवरण में सिद्ध हुआ तथा प्रकाशित पत्र से हटा दिया गया था ।[6][4]लेम्मा की तकनीकी विवरण का प्रमाण गलत है, लेकिन शिंग ने एक सही प्रमाण प्रस्तुत किया है।[1]

अन्य O(n log n) एल्गोरिदम

वांग, झू और तियान ने एक सरलीकृत O(n log m) एल्गोरिथम प्रकाशित किया है, जहां n श्रृंखला में आव्यूह की संख्या है और m दी गई आव्यूह श्रृंखला के आयाम में स्थित न्यूनतम अनुक्रम की संख्या है।[7]

निम्बार्क, गोहेल और डोशी ने एक ग्रीडी O(n log n) एल्गोरिथम प्रकाशित किया है,[8] परन्तु उनके आशावाद का प्रमाण गलत है और उनका एल्गोरिथ्म कुछ आव्यूह श्रृंखलाओं के लिए सबसे कुशल कोष्ठक के कार्यभार का उत्पादन करने में विफल रहा है।[1]

चिन-हू-शिंग अनुमानित समाधान

चिन तथा हू और शिंग[9] द्वारा बनाया गया एल्गोरीदम O(n) में कार्य करता है और एक कोष्ठक उत्पन्न करता है जो श्रेष्ठतम विकल्प से अधिकतम 15.47% कम प्रभावी है। ज्यादातर स्थितियों में एल्गोरिदम ऐसा समाधान उत्पन्न करता है जो श्रेष्ठतम से केवल 1-2 प्रतिशत ही कम प्रभावी होता है।[5]

एल्गोरिथ्म समस्या, बहुभुज विभाजन समस्या में परिवर्तित करके शुरू होता है। बहुभुज के प्रत्येक शीर्ष V से एक भार w जुड़ा होता है। मान लीजिए कि हमारे पास क्रमसः तीन शीर्ष हैं , और वो न्यूनतम भार वाला शीर्ष है। हम चतुर्भुज को (दक्षिणावर्त क्रम में) शीर्षो के साथ देखते है। हम इसे दो तरह से त्रिभुजाकार बना सकते है:

  • और , लागत के साथ
  • और लागत के साथ .

इसलिए, यदि

या समकक्ष

हम शीर्ष को बहुभुज से हटा देते है और भुजाओं को त्रिकोण में जोड़ते हैं। हम इस प्रक्रिया को तब तक दोहराते हैं जब तक कि पहले की स्थितियों को संतुष्ट नहीं कर देता है। शेष सभी शीर्षों के लिए , हम भुजाओं को त्रिकोण में जोड़ देते है। यह हमें लगभग उच्चतम त्रिभुज देता है।

सामान्यीकरण

आव्यूह श्रृंखला गुणन समस्या एक अधिक सार्थक समस्या को हल करने के लिए सामान्यीकृत करती है: वस्तुओं का एक रैखिक अनुक्रम दिया जाता है, उन वस्तुओं पर एक साहचर्य बाइनरी संचालन, और किसी भी दो वस्तुओं पर उस संचालन को करने की लागत की गणना करने की एक विधि (साथ ही सभी आंशिक परिणाम), अनुक्रम पर संचालन को प्रयोग करने के लिए वस्तुओं को समूहित करने के लिए न्यूनतम लागत प्रकारो की गणना किया जाता है।[10] इसका कुछ हद तक काल्पनिक विशेष स्थितियां तंतु की सूची का तंतु संयोजन है। उदहारण के लिए, सी (प्रोग्रामिंग भाषा) में, स्ट्रैट का उपयोग करके लंबाई m और n के दो तारों को जोड़ने की लागत O(m + n) है, क्योंकि हमें पहली तंतु के अंत को खोजने के लिए O(m) समय तथा O(n) दूसरी तंतु को इसके अंत में दोहराने के समय आवश्यक होता है। इस लागत फ़ंक्शन का उपयोग करके, हम तंतु के अनुक्रम को जोड़ने का सबसे तेज़ विधि प्राप्त करने के लिए एक गतिशील प्रोग्रामिंग एल्गोरिदम लिख सकते हैं। यद्यपि की, यह अनुकूलन अधिक प्रभावी नहीं है क्योंकि हम सीधे समय में तंतु को उनकी लंबाई के योग के अनुपात में जोड़ सकते हैं। एकल लिंक्ड सूचियों के लिए एक समान समस्या उपस्थित होती है।

एक और सामान्यीकरण,समानांतर प्रोसेसर उपलब्ध होने पर समस्या को हल करना है। इस स्थिति में, आव्यूह उत्पाद के प्रत्येक कारक की गणना करने की लागत जोड़ने के बदले में, हम अधिकतम को ले लेते है क्योकि हम उन्हें एक ही साथ हल कर सकते है। यह न्यूनतम लागत और अंतिम उच्त्तम समूहीकरण दोनों को अत्यधिक प्रभावित कर सकता है; अधिक संतुलित समूह जो सभी प्रोसेसर के पक्षधर हैं उनको कार्यरत रखने की और भी परिष्कृत विधिया हैं।[11]

यह भी देखें

संदर्भ

  1. 1.0 1.1 1.2 Schwartz, Oded; Weiss, Elad (January 2019). "Revisiting "Computation of Matrix Chain Products". SIAM Journal on Computing. 48 (5): 1481–1486. doi:10.1137/18m1195401.
  2. Cormen, Thomas H; Leiserson, Charles E; Rivest, Ronald L; Stein, Clifford (2001). "15.2: Matrix-chain multiplication". Introduction to Algorithms. Vol. Second Edition. MIT Press and McGraw-Hill. pp. 331–338. ISBN 978-0-262-03293-3.
  3. Hu, TC; Shing, MT (1982). "Computation of Matrix Chain Products, Part I" (PDF). SIAM Journal on Computing. 11 (2): 362–373. CiteSeerX 10.1.1.695.2923. doi:10.1137/0211028. ISSN 0097-5397.
  4. 4.0 4.1 Hu, TC; Shing, MT (1984). "Computation of Matrix Chain Products, Part II" (PDF). SIAM Journal on Computing. 13 (2): 228–251. CiteSeerX 10.1.1.695.4875. doi:10.1137/0213017. ISSN 0097-5397.
  5. 5.0 5.1 Artur, Czumaj (1996). "Very Fast Approximation of the Matrix Chain Product Problem" (PDF). Journal of Algorithms. 21: 71–79. CiteSeerX 10.1.1.218.8168. doi:10.1006/jagm.1996.0037. Archived from the original (PDF) on 2018-07-27.
  6. Hu, TC; Shing, MT (1981). Computation of Matrix Chain Products, Part I, Part II (PDF) (Technical report). Stanford University, Department of Computer Science. Part II, page 3. STAN-CS-TR-81-875.
  7. Wang, Xiaodong; Zhu, Daxin; Tian, Jun (April 2013). "मैट्रिक्स श्रृंखला की कुशल गणना". 2013 8th International Conference on Computer Science Education: 703–707. doi:10.1109/ICCSE.2013.6553999.
  8. Nimbark, Hitesh; Gohel, Shobhen; Doshi, Nishant (2011). "पैकेट प्रसंस्करण के लिए लालची तकनीक का उपयोग करके मैट्रिक्स श्रृंखला गुणन के लिए एक उपन्यास दृष्टिकोण". Computer Networks and Information Technologies. 142: 318–321. doi:10.1007/978-3-642-19542-6_58.
  9. Hu, T.C; Shing, M.T (June 1981). "उत्तल बहुभुज के निकट-इष्टतम विभाजन को खोजने के लिए एक O(n) एल्गोरिद्म". Journal of Algorithms. 2 (2): 122–138. doi:10.1016/0196-6774(81)90014-6.
  10. G. Baumgartner, D. Bernholdt, D. Cociorva, R. Harrison, M. Nooijen, J. Ramanujam and P. Sadayappan. A Performance Optimization Framework for Compilation of Tensor Contraction Expressions into Parallel Programs. 7th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS '02). Fort Lauderdale, Florida. 2002 available at http://citeseer.ist.psu.edu/610463.html and at http://www.csc.lsu.edu/~gb/TCE/Publications/OptFramework-HIPS02.pdf
  11. Heejo Lee, Jong Kim, Sungje Hong, and Sunggu Lee. Processor Allocation and Task Scheduling of Matrix Chain Products on Parallel Systems Archived 2011-07-22 at the Wayback Machine. IEEE Trans. on Parallel and Distributed Systems, Vol. 14, No. 4, pp. 394–407, Apr. 2003