2010-08-19 11 views
10

मैं एक एल्गोरिदम की तलाश में हूं जो दिए गए इनपुट स्ट्रिंग की कोल्मोगोरोव जटिलता के अनुमान को गणना कर सकता है। तो अगर के स्ट्रिंग एस की कोल्मोगोरोव जटिलता है, और टी समय का प्रतिनिधित्व करता है, तो फ़ंक्शन इस तरह कुछ व्यवहार करेगा .. सीमा (टी-> inf) [K_approx (टी, एस)] = के।कोल्मोगोरोव जटिलता अनुमान एल्गोरिदम

+2

विषय से अपरिचित लोगों के लिए, एक स्ट्रिंग की कोल्मोगोरोव जटिलता, संक्षेप में, "स्ट्रिंग उत्पन्न करने वाले सबसे छोटे कार्यक्रम की लंबाई" है। उदाहरण के लिए, जे प्रोग्रामिंग भाषा के साथ 8 अक्षरों ('*/~ 1 + i.9') में 9 x 9 गुणा तालिका का उत्पादन किया जा सकता है ([यहां देखें] (http://stackoverflow.com/questions/3412730/code- गोल्फ-आउटपुट-गुणा-टेबल-टू-द-कंसोल))। इससे, आप कह सकते हैं कि 9 x 9 गुणा तालिका में जे प्रोग्रामिंग भाषा के संबंध में 8 या उससे कम की कोल्मोगोरोव जटिलता है। –

+0

यदि आप औपचारिक रूप से कुछ प्रमाणित करने का प्रयास कर रहे हैं, तो आपको अनुमान लगाने के लिए उपयोग की जाने वाली विधि (स्वतंत्र रूप से अनदेखा) के अपने प्रमाण को स्वतंत्र रूप से लिखना होगा। यदि आप बस मजाक की तलाश में हैं, तो डेटा संपीड़न एल्गोरिदम का प्रयास कैसे करें? – rwong

+0

नहीं, मैं एक सबूत की तलाश नहीं कर रहा हूं। मैं एक एल्गोरिदम की तलाश में हूं जो उपर्युक्त गुणों को पूरा करता है। मैं एक खोजने में सक्षम नहीं हूं, और मैं जानना चाहता था कि किसी ने इसे पहले से ही किया है या नहीं। मुझे किसी भी डेटा संपीड़न एल्गोरिदम की जानकारी नहीं है जो प्रिंसिपल में सटीक कोल्मोगोरोव कॉम्प्लेक्सिटी को पर्याप्त समय दे सकता है। मुझे लगता है कि आप पहली नज़र में हमेशा परिमित तारों के साथ काम कर रहे हैं, सभी संभव ट्यूरिंग मशीनों की एक गणना खोज काम कर सकती है ... लेकिन समस्या अपरिहार्य हो सकती है। मैं मशीन सीखने के अनुप्रयोगों के लिए इस तरह एक एल्गोरिदम की तलाश में हूं। – Tony

उत्तर

13

इन सिद्धांत, एक प्रोग्राम अपनी इनपुट स्ट्रिंग की कोल्मोगोरोव जटिलता पर अभिसरण कर सकता है क्योंकि चलने का समय अनंतता तक पहुंचता है। यह समानांतर में हर संभव प्रोग्राम को चलाकर काम कर सकता है जो इनपुट स्ट्रिंग या कम की लंबाई है। जब किसी दिए गए लंबाई का कोई प्रोग्राम पाया जाता है, तो उस लंबाई को अब के लिए ज्ञात न्यूनतम लंबाई के रूप में पहचाना जाता है, मुद्रित किया जाता है, और कोई और प्रोग्राम> = लंबाई की कोशिश नहीं की जाती है। यह एल्गोरिदम (सबसे अधिक संभावना) हमेशा के लिए दौड़ता है, छोटे और छोटे लंबाई को प्रिंट करता है, सटीक कोल्मोगोरोव जटिलता को अनंत समय पर परिवर्तित करता है।

बेशक, कार्यक्रमों की घातीय संख्या चलाना बेहद अचूक है। एक अधिक कुशल एल्गोरिदम code golf on StackOverflow पोस्ट करना है। कुछ कमियां:

  • अच्छे परिणाम मिलने से कुछ दिन पहले लग सकते हैं।
  • यह उत्पादकता हानि में हजारों डॉलर की लागत वाले हमारे सबसे मूल्यवान कंप्यूटिंग संसाधनों की विशाल मात्रा का उपयोग करता है।
  • परिणाम समय के साथ कम आवृत्ति के साथ उत्पादित होते हैं क्योंकि संसाधन othercomputations पर जाते हैं।
  • कई इनपुट के लिए एल्गोरिदम terminatesprematurely, जिसका अर्थ है कि यह सामान्य रूप से काम नहीं करता है।
+0

या आप जल्द ही एक ही प्रोग्राम चलाएंगे जो हमेशा के लिए चलता है, और आप यह तय नहीं कर सकते कि इसे रोकना है या इसे कुछ और सेकंड (दशकों) चलाएं। – rwong

+2

@rwong: ठीक है, यही कारण है कि आप उन्हें समानांतर में चलाते हैं। कई कार्यक्रमों के लिए जो हमेशा के लिए दौड़ते प्रतीत होते हैं, उन्हें तब तक चलने की अनुमति है जब तक कि एक छोटा समाधान नहीं मिलता है (यदि कभी)। –

+0

मुझे लगता है कि यह फ़ंक्शन में एक और पैरामीटर जोड़ने के लिए resonable होगा जो ट्यूरिंग मशीन की अधिकतम लंबाई निर्दिष्ट करता है .. तो हमारे पास ऐसा फ़ंक्शन हो सकता है जिसमें इस तरह की संपत्ति हो ??? सीमा (टी-> inf) [सीमा (टी_मैक्स-> inf) [K_approx (टी, एस, टी_मैक्स)]] = के – Tony

1

मुझे लगता है कि यह काम कर सकता है? अगर किसी को कोई त्रुटि दिखाई देती है, तो कृपया इसे इंगित करें।

function KApprox(S:string,t:integer,TapeSizeMax:integer) : Turing Machine of size k 
    begin 

    // An abstract data type that represents a turing machine of size k 
    var TM(k:integer) : Turing Machine of size k; 
    var TMSmallest(k:integer) : Turing Machine of size k; 

    var j : integer; 
    var i : integer; 

    for (j = t to 0 step -1) // reduce the time counter by 1 
     begin 
     for (i = TMax to 1 step -1) // go to the next smaller size of TM 
     begin 
      foreach (TM(i)) // enumerate each TM of size i 
      begin 
       if (TM(i).halt(TapeSizeMax) == true) and (TM(i).output() == S) then 
       begin 
        if (sizeof(TM(i)) < sizeof(TMSmallest(i))) then 
         TMSmallest(i): = TM(i); 
       end; 
      end; 
     end; 
     end;  
    return TMSmallest; 
end; 
+0

मुझे लगता है कि घातक दोष यह है कि 'टीएम [i] .output() 'कभी वापस नहीं आ सकता है। – Gabe

+0

@Gabe .. अच्छा बिंदु .. उसे फिर से हल करने की आवश्यकता होगी। – Tony

+0

मुझे लगता है कि यह रोकथाम के मुद्दे को ठीक करेगा। – Tony

1

wikipedia page Kolmogorov जटिलता के लिए एक उपधारा जिसका शीर्षक था "Kolmogorov जटिलता के Incomputability", "बुनियादी परिणाम" अनुभाग के तहत है। यह एक बुनियादी उपाय नहीं है जिसका आप गणना कर सकते हैं, या यहां तक ​​कि उत्पादक अनुमान लगा सकते हैं।

संदेह के बिना, जो भी आप चाहते हैं उसे प्राप्त करने के बेहतर तरीके हैं। यदि आप जो चाहते हैं वह यादृच्छिकता का एक उपाय है, तो आप बाइनरी एंट्रॉपी फ़ंक्शन का प्रयास कर सकते हैं। मानक एल्गोरिदम में से एक द्वारा संपीड़न बिल को भी फिट कर सकता है।

+0

विकी आलेख में "अनुमानित उत्पादक" वाक्यांश का भी उल्लेख नहीं है। एक स्ट्रिंग के केसी की गणना करने का सवाल नहीं पूछा जा रहा है। यह अजीब है .. कहानी का अंत। मैं जो कुछ ढूंढ रहा हूं वह एक ऐसा कार्य है जो इसे अधिक समय और अंतरिक्ष संसाधन देकर बेहतर और बेहतर अनुमान लगाएगा। – Tony

+0

@ टोनी: आपका एल्गोरिदम पूरी तरह निर्दिष्ट नहीं है। मुझे यकीन नहीं है कि आप प्रत्येक संभव इनपुट स्ट्रिंग के साथ कुछ आकार तक प्रत्येक संभावित ट्यूरिंग मशीन का परीक्षण करने की योजना कैसे बनाते हैं, लेकिन अगर आप इसे कुछ सार्थक तरीके से कर सकते हैं, तो समय लागत इनपुट पर घातीय हो जाएगी। हालांकि सिद्धांत अच्छा लग सकता है, यह सिर्फ कुछ ऐसा नहीं है जो आपके लिए अभ्यास में काम करेगा। –

+0

@ रोब, फ़ंक्शन केवल इनपुट "एस: स्ट्रिंग" के रूप में 1 स्ट्रिंग लेता है, और केवल आकार टीएमएक्स की ट्यूरिंग मशीनों का परीक्षण करेगा। इसलिए हम सभी ट्यूरिंग मशीनों का परीक्षण नहीं कर रहे हैं, और इसलिए इनपुट स्ट्रिंग का सटीक केसी नहीं मिल सकता है। – Tony

0

पहला मुद्दा है कि मैं ध्यान दें कि "Kolmogorov जटिलता" अच्छी तरह से परिभाषित नहीं है। यह कार्यक्रमों का प्रतिनिधित्व करने के तरीके पर कुछ डिग्री पर निर्भर करता है। तो, सबसे पहले आपको जो करना होगा, वह कार्यक्रमों के कुछ एन्कोडिंग को ठीक करेगा (उदाहरण के लिए, जॉय एडम्स का विनिर्देश कि कार्यक्रम जे में लिखे गए हैं)।

एक बार जब आप एन्कोडिंग हो तो एल्गोरिथ्म आप देख रहे हैं काफी सरल है। इसके लिए जॉय का जवाब देखें।

लेकिन स्थिति तेजी से कई कार्यक्रमों को चलाने के लिए होने से भी बदतर है। उन कार्यक्रमों में से प्रत्येक के रूप में लंबे चलाने के रूप में आप संभवतः कल्पना कर सकता सकता है (तकनीकी रूप से: के रूप में एक समारोह इनपुट आकार किसी भी पुनरावर्ती क्रिया की तुलना में तेजी से बढ़ने सकता है समय से चल रहा है)।और भी, यह मामला हो सकता है कि कुछ सबसे छोटे कार्यक्रम सबसे लंबे समय तक चलने वाले हैं। इसलिए जब समानांतर दृष्टिकोण सही मूल्य तक पहुंच जाएगा, क्योंकि समय अनंतता तक जाता है, तो यह धीरे-धीरे धीरे-धीरे करेगा।

आप कार्यक्रम को समय-समय पर रोक सकते हैं, यह समझते हुए कि उस बिंदु पर अनुमान पर्याप्त है। हालांकि, आपको सामान्य रूप से कोई जानकारी नहीं है कि अनुमान कितना अच्छा है। वास्तव में, ऐसे प्रमेय हैं जो दिखाते हैं कि आप कभी नहीं जानते।

तो संक्षिप्त उत्तर "आसान है, बस जॉय के एल्गोरिदम का उपयोग करें", लेकिन व्यावहारिकता के किसी भी उपाय से, जवाब है, "आपके पास कोई मौका नहीं है"। जैसा कि र्वॉन्ग द्वारा अनुशंसित किया गया है, आप केवल एक भारी ड्यूटी संपीड़न एल्गोरिदम का उपयोग कर बेहतर हैं।

संबंधित मुद्दे