2010-08-19 43 views
10

Tôi đang tìm một thuật toán có thể tính toán độ phức tạp Kolmogorov gần đúng của chuỗi đầu vào đã cho. Vì vậy, nếu K là độ phức tạp Kolmogorov của một chuỗi S, và t đại diện cho thời gian, thì hàm sẽ hành xử như thế này .. giới hạn (t-> inf) [K_approx (t, S)] = K.Thuật toán xấp xỉ phức tạp Kolmogorov Thuật toán

+2

Đối với những người không quen thuộc với chủ đề, sự phức tạp Kolmogorov của một chuỗi, về bản chất là "độ dài của chương trình ngắn nhất tạo chuỗi". Ví dụ, một bảng nhân 9x9 có thể được tạo ra trong 8 ký tự ('*/~ 1 + i.9') với ngôn ngữ lập trình J ([xem tại đây] (http://stackoverflow.com/questions/3412730/code- sân-đầu-nhân-bảng-to-the-giao diện điều khiển)). Từ đây, bạn có thể nói rằng một bảng nhân 9x9 có độ phức tạp Kolmogorov 8 hoặc ít hơn đối với ngôn ngữ lập trình J. –

+0

Nếu bạn đang cố gắng để chứng minh một cái gì đó chính thức, bạn sẽ phải viết bằng chứng của bạn độc lập (hoàn toàn bỏ qua) phương pháp được sử dụng để ước tính nó. Nếu bạn đang tìm kiếm niềm vui, hãy thử một thuật toán nén dữ liệu như thế nào? – rwong

+0

Không, tôi không tìm kiếm bằng chứng. Tôi đang tìm một thuật toán đáp ứng các thuộc tính nêu trên. Tôi đã không thể tìm thấy một, và tôi muốn biết nếu có ai đã làm điều đó rồi. Tôi không biết bất kỳ thuật toán nén dữ liệu nào có thể tìm thấy chính xác độ phức tạp Kolmogorov đã đủ thời gian. Tôi cho rằng ngay từ cái nhìn đầu tiên vì bạn luôn làm việc với các chuỗi hữu hạn, việc tìm kiếm liệt kê tất cả các máy Turing có thể có thể hoạt động ... Nhưng vấn đề có thể là không thể giải quyết được. Tôi đang tìm một thuật toán như thế này cho các ứng dụng học máy. – Tony

Trả lời

13

In lý thuyết, một chương trình có thể hội tụ vào độ phức tạp Kolmogorov của chuỗi đầu vào của nó khi thời gian chạy tiến tới vô cùng. Nó có thể hoạt động bằng cách chạy mọi chương trình có thể song song đó là độ dài của chuỗi đầu vào hoặc ngắn hơn. Khi tìm thấy một chương trình có độ dài đã cho, độ dài đó được xác định là độ dài tối thiểu được biết đến hiện tại, được in và không còn chương trình nào khác> = độ dài đó được thử. Thuật toán này sẽ (rất có thể) chạy mãi mãi, in độ dài ngắn hơn và ngắn hơn, hội tụ vào độ phức tạp Kolmogorov chính xác cho thời gian vô hạn.

Tất nhiên, việc chạy số lượng chương trình theo cấp số nhân rất khó hiểu. Một thuật toán hiệu quả hơn là đăng một code golf on StackOverflow. Một vài nhược điểm:

  • Có thể mất vài ngày trước khi có kết quả tốt.
  • Nó sử dụng một lượng lớn tài nguyên máy tính có giá trị nhất của chúng tôi, tốn hàng ngàn đô la trong việc mất năng suất.
  • Kết quả được tạo ra với tần suất ít hơn theo thời gian khi tài nguyên được chuyển hướng đến othercomputations.
  • Thuật toán terminatesprematurely cho nhiều đầu vào, có nghĩa là nó không hoạt động nói chung.
+0

Hoặc bạn sẽ sớm đạt được một chương trình duy nhất chạy mãi mãi, và bạn không thể quyết định có dừng hay để nó chạy thêm vài giây nữa (thập kỷ). – rwong

+2

@ rwong: Phải, đó là lý do tại sao bạn chạy chúng song song. Đối với nhiều chương trình dường như chạy mãi mãi, chúng được phép tiếp tục chạy cho đến khi tìm thấy giải pháp ngắn hơn (nếu có). –

+0

Tôi cho rằng nó có thể cộng hưởng để thêm một tham số khác vào hàm xác định chiều dài tối đa của máy Turing .. để chúng ta có thể có một hàm có thuộc tính như thế này ??? giới hạn (t-> inf) [giới hạn (T_max-> inf) [K_approx (t, S, T_max)]] = K – Tony

1

Tôi nghĩ điều này có thể hiệu quả? Nếu ai đó thấy lỗi, vui lòng chỉ ra lỗi.

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

Tôi nghĩ rằng lỗ hổng gây tử vong là 'TM [i] .output()' có thể không bao giờ trở lại. – Gabe

+0

@Gabe .. tốt điểm .. Sẽ cần phải resovle đó. – Tony

+0

Tôi nghĩ rằng điều này sẽ khắc phục sự cố tạm dừng. – Tony

1

Các wikipedia page cho Kolmogorov phức tạp có một tiểu mục mang tên "Incomputability của Kolmogorov phức tạp", dưới sự "kết quả cơ bản". Đây không phải là một biện pháp cơ bản mà bạn có thể tính toán, hoặc thậm chí gần đúng một cách hiệu quả.

Có những cách tốt hơn để đạt được những gì bạn muốn, không nghi ngờ gì. Nếu một phép đo ngẫu nhiên là những gì bạn muốn, bạn có thể thử hàm entropy nhị phân. Độ nén của một trong các thuật toán chuẩn cũng có thể phù hợp với hóa đơn.

+0

Bài viết trên Wiki thậm chí không đề cập đến cụm từ "gần đúng hiệu quả" ở bất cứ đâu. Câu hỏi về tính toán KC của một chuỗi không được hỏi. Đó là không thể giải quyết .. kết thúc của câu chuyện. Tất cả những gì tôi đang tìm kiếm là một hàm sẽ dẫn đến sự xấp xỉ tốt hơn và tốt hơn bằng cách cho nó nhiều thời gian và tài nguyên không gian hơn. – Tony

+0

@Tony: Thuật toán của bạn chưa được chỉ định đầy đủ. Tôi không chắc làm thế nào bạn có kế hoạch để kiểm tra tất cả các máy Turing có thể lên đến một số kích thước với mỗi chuỗi đầu vào có thể, nhưng ngay cả khi bạn có thể làm điều này một cách có ý nghĩa, chi phí thời gian sẽ là mũ trên đầu vào. Tuy nhiên tốt đẹp lý thuyết có thể có vẻ, nó chỉ là không phải cái gì đó sẽ làm việc cho bạn trong thực tế. –

+0

@Rob, hàm này chỉ nhận 1 chuỗi là đầu vào "S: String" và sẽ chỉ kiểm tra các máy turing có kích thước TMax. vì vậy chúng tôi không thử nghiệm tất cả các máy turing, và do đó không thể có được KC chính xác của chuỗi đầu vào. – Tony

0

Vấn đề đầu tiên mà tôi nhận thấy là "các Kolmogorov phức tạp" không được xác định rõ. Nó phụ thuộc vào mức độ nào đó về việc lựa chọn cách biểu diễn các chương trình. Vì vậy, điều đầu tiên bạn cần làm là sửa một số mã hóa các chương trình (ví dụ, đặc tả của Joey Adams là các chương trình được viết bằng J).

Khi bạn đã mã hóa, thuật toán bạn đang tìm kiếm khá đơn giản. Xem câu trả lời của Joey cho điều đó.

Nhưng tình hình còn tồi tệ hơn việc phải chạy nhiều chương trình theo cấp số nhân. Mỗi chương trình có thể chạy miễn là bạn có thể tưởng tượng (về mặt kỹ thuật: thời gian chạy khi kích thước đầu vào chức năng có thể tăng nhanh hơn bất kỳ hàm đệ quy nào).Hơn nữa, nó có thể là trường hợp một số chương trình ngắn nhất là những chương trình chạy dài nhất. Vì vậy, trong khi cách tiếp cận song song sẽ tiếp cận giá trị đúng như thời gian đi đến vô cùng, nó sẽ làm như vậy một cách không tưởng tượng được từ từ.

Bạn có thể dừng chương trình sớm, cho rằng xấp xỉ tại thời điểm đó là đủ tốt. Tuy nhiên, bạn không có ý tưởng nói chung là tốt như thế nào xấp xỉ. Trong thực tế, có những định lý cho thấy bạn không bao giờ có thể biết.

Vì vậy, câu trả lời ngắn gọn là "dễ dàng, chỉ cần sử dụng thuật toán của Joey", nhưng theo bất kỳ biện pháp thực tiễn nào, câu trả lời là "bạn không có cơ hội". Như đã được khuyến cáo bởi rwong, bạn nên sử dụng thuật toán nén hạng nặng.

Các vấn đề liên quan