Vấn đề gì không thể được giải quyết bằng một chương trình ngắn?


7

LÝ LỊCH:

Gần đây tôi đã cố gắng giải quyết một vấn đề khó khăn nhất định là nhập vào một mảng gồm số. Với , giải pháp duy nhất tôi có thể tìm thấy là có cách xử lý khác nhau cho mỗi thứ tự của 3 số. Tức là, có một giải pháp cho trường hợp , một giải pháp khác cho , v.v. (trường hợp có thể được giải quyết bằng bất kỳ một trong hai giải pháp này).nn=3n!=6A>B>CA>C>BA>C=B

Nghĩ về trường hợp , dường như cách duy nhất là, một lần nữa, xem xét tất cả thứ tự khác nhau và phát triển một giải pháp khác nhau cho mỗi trường hợp. Mặc dù giải pháp trong từng trường hợp cụ thể là nhanh, nhưng bản thân chương trình sẽ rất lớn. Vì vậy, độ phức tạp thời gian chạy của vấn đề là nhỏ, nhưng độ phức tạp "thời gian phát triển" hoặc độ phức tạp "kích thước chương trình" là rất lớn.n=4n!=24

Điều này thôi thúc tôi thử và chứng minh rằng vấn đề của tôi không thể được giải quyết bằng một chương trình ngắn. Vì vậy, tôi tìm kiếm tài liệu tham khảo cho bằng chứng tương tự.

Khái niệm đầu tiên mà tôi tìm thấy là sự phức tạp Kolmogorov ; tuy nhiên, thông tin tôi tìm thấy về chủ đề này rất chung chung và bao gồm hầu hết các kết quả tồn tại.

CÂU HỎI:

Bạn có thể mô tả một vấn đề cụ thể, trong đời thực , sao cho bất kỳ chương trình nào giải trên mảng đầu vào có kích thước phải có kích thước tối thiểu , trong đó là một hàm tăng của ?PPnΩ(f(n))f(n)n

Vì câu trả lời rõ ràng phụ thuộc vào việc lựa chọn ngôn ngữ lập trình, giả sử rằng chúng tôi lập trình bằng Java hoặc trong máy Turing - bất cứ điều gì thoải mái hơn cho bạn.

Mọi vấn đề không thể giải quyết được đều thỏa mãn yêu cầu này bởi vì nó không có giải pháp nào cả. Vì vậy, tôi đang tìm kiếm một ngôn ngữ có thể quyết định.


"thuật toán cụ thể" "trình tự thuật toán cụ thể"?

Bạn có thể rõ ràng hơn về câu cuối cùng của bạn về câu trả lời tầm thường với bất kỳ vấn đề không thể giải quyết được. Tôi có một cách giải thích về nó, nhưng tôi không thấy nó thuyết phục.
babou

Bạn có phải bắt đầu lại tìm kiếm một giải pháp cho mỗi giá trị của n, lý do từ đầu không? Hoặc có một phương pháp để đến đúng chương trình, khi n được biết đến? Tôi không hiểu ý của bạn về độ phức tạp của thời gian phát triển ... nó có phụ thuộc vào sự khéo léo của bạn không?
babou

@babou: Nếu một vấn đề là undecidable, sau đó là không có chương trình giải quyết . Do đó, bất cứ điều gì bạn nói về "bất kỳ chương trình nào giải " đều đúng vì không có gì mâu thuẫn với nó. Tất cả những gì bạn nói về các yếu tố của một tập hợp trống, đều đúng sự thật. PPP
Erel Segal-Halevi

@babou: Ý tôi là với mỗi giá trị của bạn phải nghĩ về một giải pháp từ đầu. n
Erel Segal-Halevi

Câu trả lời:


2

Tôi giả định rằng những gì bạn thực sự muốn là một bảng liệt kê các vấn đề sao cho các chương trình tương ứng tạo thành một chuỗi tăng kích thước. Đây là một ví dụ về một bảng liệt kê như vậy. Tuy nhiên, tôi chỉ chứng minh rằng kích thước tăng vượt quá mọi ràng buộc, do đó nó không nằm trong , dường như là điểm chính của bạn. Tôi có thể cố gắng tốt hơn, nhưng tôi tự hỏi điều gì trong câu trả lời này có thể không được chấp nhận trong quan điểm của bạn về câu hỏi.O(1)

Nếu tôi hiểu chính xác, bạn muốn liệt kê các vấn đề hoàn toàn có thể quyết định với thuật toán , do đó không có quy trình quyết định thống nhất cho sự kết hợp của các vấn đề này, bởi vì nếu có một vấn đề, thì đó sẽ là một chương trình ngắn khi trở nên lớn, tức là nó sẽ là .PnAnnO(1(n))

Điều đó ngụ ý rằng phép liệt kê không thể tính toán được. Nếu nó có thể tính toán được, người ta sẽ có thể tính toán thuật toán từ kiến ​​thức của , do đó có một quy trình thống nhất cho sự kết hợp của tất cả các vấn đề trong bảng liệt kê.AnAnn

Do đó, chúng ta chỉ có thể tìm các ví dụ sao cho không có phép tính của các thuật toán sao cho giải được .AnAnPn

Trước khi đi vào đó, chúng ta cần xác định kích thước của một

Đặt là một bảng liệt kê theo số của Turing Machines. Một bảng liệt kê như vậy là có thể tính toán được. Sau đó, chúng ta hãy thể là vấn đề sau đây: nếu tạm dừng trên tất cả các đầu vào, sau đó bao gồm trong việc nhận ra các thiết lập đệ quy được công nhận bởi , khác bao gồm trong việc nhận ra các tập rỗng .TnnPnTnPnTnPn

Vì chúng tôi đang tìm kiếm giới hạn thấp hơn về kích thước của thuật toán để giải quyết , chúng tôi phải xác định kích thước của TM. Đối với một TM, số Gôdel của nó có thể được lấy là kích thước của máy, tức là thuật toán tương ứng. Thật vậy, số lượng trạng thái và chuyển tiếp tăng lên một cách cần thiết với , nếu chỉ vì nguyên tắc lỗ chim bồ câu, mặc dù nó không nhất thiết phải đồng nhất (và dù sao nó cũng phụ thuộc vào một định nghĩa tùy ý về kích thước).AnPnn

Sau đó, đối với bất kỳ TM nào luôn dừng, chúng tôi lưu ý số Gôdel nhỏ nhất của TM sao cho nó luôn dừng và nhận ra cùng một bộ đệ quy là . Do đó là TM nhỏ nhất thực sự là một thuật toán để giải , tức là . Nếu có thể không dừng lại, thì đối với chúng ta chỉ cần sử dụng luôn một thuật toán tương ứng với TM , nhận ra set , luôn luôn là cùng một thuật toán.Tnμ(n)Tμ(n)TnTμ(n)PnAnTnAnT

Mỗi vấn đề là có thể quyết định và là một thủ tục quyết định. Tuy nhiên, phép liệt kê không thể tính toán được, nhưng chúng tôi đã chỉ ra rằng điều đó là không thể tránh khỏi.PnAnAn

Thật dễ dàng để chỉ ra rằng, với bất kỳ hằng số , có một sao cho kích thướccủa lớn hơn . Lý do đơn giản là số lượng máy nhỏ hơn là hữu hạn, trong khi số lượng bộ đệ quy được công nhận bởi các TM là vô hạn.Cn|An|AnCC

Vì vậy, đó là một ví dụ về một vấn đề (chính xác hơn là liệt kê vấn đề) không thể giải quyết bằng một chương trình ngắn, nghĩa là không có ràng buộc nào về độ dài của các giải pháp cho mỗi .Pn

Chúng ta luôn có thể thêm vào mỗi vấn đề rằng nó yêu cầu bất kỳ giải pháp nào trước tiên là đọc một mảng có kích thước , để đáp ứng các ràng buộc trong câu hỏi. Nhưng có rất ít điểm cho nó.Pnn


Cảm ơn. Điều này thực sự trả lời câu hỏi. Điều tôi thực sự tìm kiếm (nhưng không biết cách hỏi chính xác) là một vấn đề tự nhiên , một vấn đề xảy ra trong cuộc sống thực, khi kích thước của chương trình tăng theo kích thước của đầu vào.
Erel Segal-Halevi

@ErelSegalHale Tôi đã nhận thức được khía cạnh đời thực này, nhưng tôi không chắc điều gì sẽ phân biệt nó với câu trả lời TM, do các tính chất đặc biệt của vấn đề, chẳng hạn như vô số các giải pháp không thể tính toán được. Nếu liệt kê vấn đề của bạn là tự nhiên, tôi thực sự tự hỏi làm thế nào bạn có thể chứng minh rằng tất cả chúng đều có thể quyết định, trừ khi chúng được xây dựng để được như vậy. Tính không ổn định thường được chứng minh (cuối cùng) bằng mâu thuẫn, nhưng tính quyết định thường được chứng minh một cách xây dựng, điều này có nghĩa là đưa ra thủ tục quyết định cho tất cả, điều mà bạn không thể làm được vì chúng không thể tính toán được.
babou

"Tôi không chắc điều gì sẽ phân biệt nó với câu trả lời TM, với ... vô số giải pháp không thể tính toán được" - Đây là một điểm tốt, cảm ơn.
Erel Segal-Halevi

7

Đối với bất kỳ vấn đề nào, bạn có thể tạo một ngôn ngữ lập trình trong đó một chương trình mã hóa giải pháp cho vấn đề đó là một ký tự đơn. (xem HQ9 + ). Độ phức tạp Kolmogorov phụ thuộc vào ngôn ngữ. Câu trả lời cho câu hỏi của bạn về vấn đề nào gây ra vụ nổ sẽ phụ thuộc rất nhiều vào "ngôn ngữ chính thức tiêu chuẩn" nào bạn chọn.

Có một số kết quả thú vị, tuy nhiên. Mã hóa các chuỗi được tạo ngẫu nhiên sẽ luôn yêu cầu chi phí tỷ lệ thuận với kích thước của chuỗi. Nguyên tắc Pigeonhole cho chúng ta biết sẽ luôn có một số chức năng, trong bất kỳ ngôn ngữ cố định L nào, không thể được biểu thị trong một không gian nhỏ hơn một phép liệt kê đầy đủ tất cả các trường hợp. Và định lý kích thước của Blum cho chúng ta biết rằng, đối với toàn bộ ngôn ngữ, luôn có các hàm bạn có thể mã hóa lớn hơn hệ số thổi được chọn tùy ý so với mã hóa cùng chức năng trong ngôn ngữ hoàn chỉnh Turing.


"∃ các hàm, trong bất kỳ ngôn ngữ cố định L nào, không thể biểu thị trong một không gian nhỏ hơn một phép liệt kê đầy đủ của tất cả các trường hợp." Tất cả các trường hợp là gì? Bạn có một tài liệu tham khảo trên web?
babou

Tôi có nghĩa là một liệt kê đầy đủ của các cặp (tên miền, phạm vi). Bạn có thể xây dựng các hàm như vậy, ví dụ ánh xạ từ một chuỗi ngẫu nhiên cố định sang một chuỗi ngẫu nhiên cố định khác. Xin lỗi, tôi không có tài liệu tham khảo.
dmbarbour

Tôi đoán bạn có nghĩa là một liệt kê các vấn đề như vậy sao cho mỗi phải lớn bằng phép liệt kê của các cặp n (miền, phạm vi) (Điều đó có đúng không?). Quá tệ, bạn không có đầu mối để tìm thêm thông tin về điều này. PnPn
babou

6

Một kết quả của các trạng thái của Shannon rằng tồn tại một chuỗi các chức năng fn:{0,1}n{0,1}đó là do vấn đề của tính toán cho yêu cầu ít nhất các phép toán boolean (nghĩa là độ phức tạp mạch của điện toán ít nhất là ).P(n)fn(x)x{0,1}nΘ(2nn)fn(x)Θ(2nn)

Định lý này không phải là quá khó khăn để có được, vì có -ary chức năng boolean, trong khi số lượng các mạch có kích thước nhất định là đúng nhỏ hơn.2(2n) n


OK, điều này cho thấy sự tồn tại của một vấn đề đòi hỏi một chương trình lớn, nhưng tôi đang tìm kiếm một bằng chứng cụ thể rằng một vấn đề (đã biết) nào đó đòi hỏi một chương trình lớn.
Erel Segal-Halevi

1
Tôi biết rằng đây không phải là một câu trả lời thực sự thỏa đáng. Tôi nghĩ rằng độ phức tạp của mạch là thứ gần nhất với "độ dài chương trình", vì kích thước của mạch thay đổi theo kích thước của đầu vào, như trong bài viết của bạn. Giới hạn dưới trong lĩnh vực này nên được biết đến với một số vấn đề cụ thể, nhưng tôi không phải là một chuyên gia.
zarathustra

1
Tôi nghĩ rằng kích thước của một mạch giống như sự phức tạp của việc thực hiện chương trình hơn là kích thước của mã chương trình. Ý tưởng của tôi là mỗi cổng chỉ được sử dụng một lần. Nó là một loại logic tuyến tính. Nếu bạn làm tương tự trong phần mềm, nơi bạn có thể nhân tố bằng cách gọi chương trình con nhiều lần, bạn có kết quả tương tự về kích thước chương trình không? CC @ErelSegalHalevi
babou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.