Có lý thuyết nào để trả lời chương trình đơn giản nhất để giải quyết vấn đề không?


10

Để trả lời "những vấn đề nào có thể được giải quyết bằng điện toán", chúng tôi đã phát triển lý thuyết về khả năng tính toán. Đối với các vấn đề có thể tính toán được, có lý thuyết nào để trả lời câu hỏi "chương trình tôi có đơn giản nhất không"?

Tôi không nghĩ rằng sự phức tạp tính toán trả lời câu hỏi. Tôi nghĩ rằng nó xem xét chúng ta cần bao lâu (mặc dù được đo lường một cách trừu tượng).

Tôi không chắc liệu lý thuyết thông tin thuật toán trả lời câu hỏi. Dường như lý thuyết nói về kích thước, trong đó sự tương đương của kích thước tối thiểu và đơn giản nhất là không rõ ràng đối với tôi (tốt, ít nhất là họ cảm thấy khác với tôi).

Tôi nghĩ rằng lý thuyết ít nhất nên định nghĩa mối quan hệ "đơn giản" hoặc "đơn giản hơn".


Bây giờ tôi tin chắc rằng tôi nên nhìn vào Độ phức tạp Kolmogorov. Tuy nhiên, tôi muốn giải thích những gì trong tâm trí của tôi khi tôi đặt câu hỏi.

Khi tôi cải thiện một chương trình, tôi cố gắng giảm các kết nối không cần thiết giữa các phần khác nhau của chương trình (có thể chia lại các phần để có thể có các kết nối ít hơn hoặc yếu hơn). Vì các kết nối bị giảm, chương trình cảm thấy "đơn giản" hơn. Do đó, việc lựa chọn từ "đơn giản" khi tôi đặt câu hỏi. Rất có khả năng kích thước của chương trình cũng giảm, nhưng đó là một tác dụng phụ tốt, không phải là mục tiêu chính. Rõ ràng, quá trình cải thiện không thể đi mãi mãi. Có một điểm mà tôi nên dừng lại. Nếu, chỉ bằng cách xem xét "cấu trúc" (xin lỗi cho một khái niệm không xác định khác) hoặc "quan hệ", tôi có thể thuyết phục bản thân mình rằng không còn gì có thể làm được nữa không?

Ở đây có mô tả tốt hơn về khái niệm của tôi về sự phức tạp.

Độ phức tạp của Olaf Sporns (2007) . Học giả , 2 (10): 1623



4
Bạn có thể quan tâm đến khái niệm về độ sâu logic của Bennett. Li và Vitanyi đã dành chương 7.7 trong cuốn sách về Kolmogorov Complexity cho nó.
Martin Schwarz

2
@YuNing: Ý của bạn là "đơn giản nhất", nếu không phải là kích thước?
Cướp

1
@Yu Ning: Thế còn, thay vì đơn giản nhất là chương trình nhỏ nhất để tạo đầu ra, thì đó là máy Turing có Độ dài Mô tả Tối thiểu tốt nhất - sao cho có sự cân bằng giữa 'độ nhỏ' và 'cấu trúc'?
Ross Snider

3
Tôi nghĩ rằng câu hỏi là một chút không xác định. Cũng lưu ý rằng có những thuật toán rất đơn giản, nhưng rất khó để chứng minh rằng chúng là chính xác. Và có những thuật toán đơn giản và chính xác rõ ràng, nhưng rất khó để chứng minh rằng chúng nhanh.
Jukka Suomela

Câu trả lời:


16

Vấn đề này được nghiên cứu trong Lý thuyết thông tin thuật toán. Những gì bạn đang xác định được gọi là độ phức tạp Kolmogorov-Chaitin.

http://en.wikipedia.org/wiki/Kolmogorov_complexity

Và dường như khái niệm đơn giản mà bạn yêu cầu có thể được chính thức hóa thông qua khái niệm về độ phức tạp, được chính thức hóa bởi các tiên đề của Blum.

http://en.wikipedia.org/wiki/Blum_axioms

Dường như cũng có thể khái quát hóa sự phức tạp của Kolmogorov để xem xét các biện pháp phức tạp khác. Xem tài liệu tham khảo dưới đây. (Bài viết của Wikipedia về độ phức tạp Kolmogorov giải quyết vấn đề này.)

Burgin1990- Độ phức tạp kolmogorov tổng quát và các biện pháp phức tạp kép khác Phân tích hệ thống và điện tử học Tập 26, Số 4, 481-490


Như @Jukka Suomela nói, câu hỏi hơi khó hiểu. Vì vậy, tôi tự hỏi tôi khó có thể có được một câu trả lời đầy đủ cho câu hỏi. Tuy nhiên, vì câu trả lời này khá nhiều thông tin và không đạt được một phần quan trọng của câu hỏi, tôi vẫn gắn thẻ nó làm câu trả lời.
Yuning

Nhân tiện, bạn có thể chỉ cho tôi thêm về ứng dụng của chủ đề, cụ thể là nếu một người có một đặc tả chính thức của một chương trình, cô ấy có thể tìm thấy kích thước nhỏ nhất từ ​​đặc tả không?
Yuning

1

Câu trả lời cho câu hỏi đầu tiên là Có, có một lý thuyết, đó là lý thuyết thông tin Thuật toán và những lý thuyết được gọi là Chương trình Thanh lịch (của Gregory Chaitin).

Đối với câu hỏi thứ hai về "chương trình tôi có đơn giản nhất" không?

Không có câu trả lời , bởi vì đó là một câu hỏi không thể giải đáp được, không thể chứng minh rằng chương trình là một chương trình Thanh lịch.

Tôi đã đặt câu trả lời để thêm đề cập về các chương trình thanh lịch .


-1

Có nhiều cách tiếp cận khác nhau để quyết định đâu là mã đơn giản và mã nào không.

Nhưng thật đáng buồn, không có cách nào tự động để xác định nó, ví dụ, Kolmogorov Complexity thất bại với các hàm đệ quy, một số hàm đệ quy (logic sâu) rất đơn giản nhưng cách hiểu về nó không đơn giản như vậy.

Theo kinh nghiệm của tôi, nhóm của chúng tôi đã làm việc trong một hệ thống và chúng tôi đã tìm thấy một quy trình "đơn giản" trong Oracle (không quá 50 dòng) ... và chúng tôi đã cố gắng để hiểu nó, phải mất 2 tháng (và một vài cuộc họp) để hiểu đầy đủ nó, không phải bởi sự phức tạp của mã mà trong logic đằng sau mỗi biến.

Tôi nghĩ cách để xác định mã đơn giản như thế nào: "đọc mã và xem xét thời gian sử dụng để hiểu mã".

Vậy "Chương trình đơn giản nhất để giải quyết vấn đề?" có thể được chia thành:

a) tính đơn giản của mã (mã rõ ràng) nhưng nó quá chủ quan.

b) tính không tương thích của hàm, nếu tôi gặp vấn đề X thì tôi phải giải quyết nhiệm vụ DX (Delta X) để giải quyết nó, trong đó DX phải chuyển sang X.

Ví dụ: nếu vấn đề của tôi là (một) "bóc một quả táo" và tôi phải làm điều đó bằng PHP (và ngôn ngữ) thì

Nếu tôi cực kỳ may mắn và PHP có hàm function_peel_apple () thì đó là mã đơn giản nhất từng có X = 1 DX = 1, chỉ cần gọi hàm và đó là nó!.

Ngược lại, nếu tôi không may mắn như vậy nhưng tồn tại hàm function_peel () và function_get_apple () thì X = 1 (một vấn đề) và DX = 2 (hai nhiệm vụ).

Nếu trong trường hợp xấu nhất, không tồn tại bất kỳ chức năng nào, thì tôi phải tự tạo một (hoặc nhiều hơn một) và nó thêm một số nhiệm vụ trước khi giải quyết vấn đề, bây giờ đó là một chương trình phức tạp.

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.