Một ví dụ về một vấn đề kinh doanh không thể tính toán là gì?


17

Tôi có đồng nghiệp từ chối chấp nhận thực tế rằng máy Turing (và máy Von Neuman bằng cách mở rộng) không thể giải quyết vấn đề tạm dừng của chính họ nêu rõ:

Bạn có thể làm bất cứ điều gì với đủ thời gian và tiền bạc.

Ông cũng không thích các vấn đề lý thuyết cho rằng:

Trong lĩnh vực của chúng tôi, chúng tôi sẽ không bao giờ gặp phải những câu hỏi đó. Chúng tôi là nhà phát triển ứng dụng, không phải nhà khoa học lý thuyết.

Có một ví dụ hay về một vấn đề kinh doanh không thể tính toán mà tôi có thể sử dụng để giúp thuyết phục anh ấy về điều này?


11
Bạn không thể chứng minh bằng ví dụ rằng một cái gì đó là không thể. Đồng nghiệp của bạn sẽ chỉ nói "Nó không hoạt động vì chúng tôi chưa tìm ra cách tiếp cận chính xác". Điều tốt nhất bạn có thể làm là cho anh ấy thấy một bằng chứng. Nếu anh ta không mua nó, anh ta thực sự ngu ngốc hoặc ngu ngốc hoặc cả hai. Đây là danh sách các vấn đề không thể giải quyết được: en.wikipedia.org/wiki/List_of_undecidable_probols
Thomas Eding

18
Một nhà lý thuyết và kỹ sư được cho biết họ có thể hôn một cô gái bằng cách liên tục di chuyển khoảng cách giữa họ và cô ấy một nửa. Nhà lý thuyết ngay lập tức từ bỏ nói "không thể, tôi sẽ không bao giờ đến đó". Kỹ sư đã làm điều đó, nói rằng "Tôi sẽ đến gần đủ cho các mục đích thực tế". Bạn, thưa ngài, cần phải cố gắng cho nụ hôn đó.
gbjbaanb

2
@gbjbaanb: Đó là một mô tả tốt về nhiều giải pháp không tối ưu cho các vấn đề NP-hard và biết rằng những vấn đề đó (thực tế) không thể giải quyết một cách kinh điển là lý do tại sao bạn đi theo phương pháp thay thế. Nếu bạn không chấp nhận rằng một số vấn đề thực tế hoặc theo nghĩa đen là không thể giải quyết thì bạn sẽ không tìm kiếm giải pháp không hoàn hảo có thể đưa ra câu trả lời "đủ tốt" sau một khoảng thời gian không xác định.
Phoshi

3
@Phoshi không, vấn đề là các giải pháp kỹ thuật trong thế giới thực chỉ yêu cầu một giải pháp đủ tốt để giải quyết vấn đề đủ để chấp nhận. Giải quyết nó một cách hoàn hảo không đáng là thời gian và chi phí. ví dụ. Vấn đề nhân viên bán hàng du lịch là không thể đưa ra nhiều hơn một vài nút, nhưng một giải pháp ít tối ưu hơn vẫn được yêu cầu (và giao) bởi nhiều doanh nghiệp. Nếu chúng ta chỉ tạo ra sự hoàn hảo, không ai sẽ có những thứ này.
gbjbaanb

10
@gbjbaanb: Đúng, nhưng lý do duy nhất họ giải quyết những vấn đề đó là trước tiên chấp nhận rằng bạn không thể "làm bất cứ điều gì với đủ thời gian và tiền bạc" và ngừng theo đuổi giải pháp tối ưu. Kiến thức về những gì bạn không thể làm thường rất quan trọng để tìm ra giải pháp cũng như kiến ​​thức về những gì bạn có thể làm.
Phoshi

Câu trả lời:


11

Không phải kỹ thuật là không thể, nhưng ...

Lập kế hoạch tài nguyên , với mục tiêu tìm ra lịch trình lý tưởng tối đa hóa việc sử dụng các khe thời gian. Tôi đã từng tham gia một dự án, trong những ngày đầu tính toán, có yêu cầu này. Tôi đã làm việc với nó một lúc trước khi tôi nhận ra rằng đó là NP-hard.

Các ví dụ khác về các vấn đề không thể về mặt kỹ thuật, nhưng khó về mặt kỹ thuật, có thể tìm thấy ở đây .

Hầu hết các vấn đề tính toán cứng trong điện toán doanh nghiệp không phải là không thể, chỉ là không thực tế. Bạn của bạn nói đúng; bạn có thể giải quyết hầu hết trong số họ nếu bạn ném đủ tiền vào họ. Nhưng tranh luận là đặc biệt; toàn bộ quan điểm của việc điều hành một doanh nghiệp là kiếm tiền chứ không phải mất nó.

Trong thực tiễn hàng ngày, chúng ta nói về Turing hoàn chỉnh một cách mơ hồ, không phải để thể hiện một số nguyên tắc toán học, mà để minh họa (ví dụ) sự không đầy đủ của HTML và CSS như một phương tiện hoàn chỉnh để sản xuất các chương trình hoàn chỉnh tính năng.

Tương tự, Vấn đề dừng là quan trọng đối với các nhà lý thuyết, nhưng nó không liên quan nhiều đến hầu hết các doanh nghiệp.


14
Vấn đề tạm dừng xuất hiện trong phân tích tĩnh của mã. Từ điều này, bạn có thể nhận được các vấn đề trần tục như "đây là một số mã, làm cho nó trông đẹp" thành "đây là một số mã, là phần mềm độc hại" - đầu tiên là kinh doanh quan trọng đối với các công ty tạo IDE (tô sáng cú pháp, tái cấu trúc), thứ hai để các công ty chống vi-rút và các chuyên gia bảo mật.

12
"Tương tự, Vấn đề dừng là quan trọng đối với các nhà lý thuyết, nhưng nó không liên quan nhiều đến hầu hết các doanh nghiệp.": Chà, nếu vấn đề tạm dừng có thể tính toán được, chúng tôi có thể tự động kiểm tra xem một phần mềm có bị chấm dứt / treo không một đầu vào nhất định hay không. Chúng tôi có lẽ sẽ không còn BSOD nữa. Vì điều này là không thể, chúng tôi phải sử dụng các kỹ thuật khác để đảm bảo chất lượng phần mềm (như kiểm tra) và không ai đầu tư thời gian và tiền bạc để phát triển chương trình "kiểm tra chấm dứt" chung. Vì vậy, tôi nghĩ rằng kết quả lý thuyết này có liên quan thực tế rất lớn.
Giorgio

4

Những người khác đã bình luận về điều này, nhưng tôi sẽ cố gắng viết ra một câu trả lời đưa ra quan điểm của tôi.

Tôi thích câu trả lời của Robert Harvey, và những bình luận cho câu trả lời của anh ấy, và tôi muốn mở rộng về những điều đó.

Tôi nghĩ rằng bạn phải trình bày những vấn đề không thể giải quyết này (như chấm dứt) theo cách trần tục: ví dụ: một công cụ IDE "kiểm tra xem hàm này có luôn trả về giá trị không".

Khi giảng dạy, ví dụ yêu thích của tôi là tái cấu trúc ( tương đương chức năng, một vấn đề không thể giải quyết khác ). Tôi hỏi:

Làm thế nào để bạn kiểm tra nếu một chức năng / chương trình làm tương tự sau khi tái cấu trúc tốt đẹp của bạn? Chắc chắn, chúng tôi có các bài kiểm tra đơn vị cho điều đó, nhưng chúng không bao gồm tất cả các trường hợp. Và họ thật nhàm chán khi viết ... Nhưng chúng tôi là những lập trình viên! Chúng ta nên viết một chương trình kiểm tra xem hai hàm này có tạo ra kết quả như nhau không! Tại sao bạn không thử viết nó?

hoặc, như một biến thể có thể gần với trường hợp của bạn hơn:

Chúng tôi có mã kế thừa này được viết bằng một phương ngữ COBOL tối nghĩa cổ xưa, mà không có thông số kỹ thuật và / hoặc trình biên dịch tồn tại. Chúng tôi chỉ có chương trình. Toàn bộ hoạt động kinh doanh của chúng tôi dựa vào nó, vì vậy chúng tôi phải chắc chắn 100% mã Java mới thực hiện giống hệt nhau trong mọi tình huống. Ban quản lý muốn một chương trình thực hiện điều đó, kiểm tra tất cả các trường hợp có thể và ước tính nó có thể được thực hiện trong 6 đến 8 tuần. Tại sao bạn không thử viết nó?

Vấn đề là không viết một chương trình như vậy. Hoặc một xấp xỉ đủ tốt của các yêu cầu. Vấn đề là nhận ra rằng nó KHÔNG thể được thực hiện theo cách trực tiếp, KHÔNG lãng phí vô số chúng ta đang cố gắng tìm ra cách để làm điều đó (chỉ để nhận ra rằng điều đó là không thể), nhưng nhận ra nó. "Ah! Điều này là không thể giải quyết được! Không thể làm điều đó trực tiếp. Tôi cần tìm ra một cách khác, thông minh hơn để làm điều đó, với một xấp xỉ đủ tốt".

Bạn phải tìm ra một cách để trình bày vấn đề theo cách dễ nhận biết và có vẻ đơn giản. Bạn sẽ không tin có bao nhiêu sinh viên CS sẽ cố gắng viết một chương trình như vậy ngay lập tức ... trước khi tham gia một lớp học tính toán :)


Trích dẫn thứ hai của bạn cố gắng gọi vấn đề tạm dừng không chính xác; tuy nhiên nếu chúng ta biết chương trình COBOL hoạt động và có thể thực thi nó trong môi trường thử nghiệm (vm-clone all SẢN PHẨM nếu cần) thì vấn đề tạm dừng được loại trừ và chúng tôi có thể thử. Có lẽ bằng tay chứ không phải bằng chương trình nhưng tất cả đều giống nhau chúng ta có thể làm điều đó. Chúng tôi có thể chia đôi tất cả các hình thức đầu vào có thể nếu cần. Bởi vì chương trình đích dừng lại, cây cũng sẽ chẻ đôi.
Joshua

2

Giả sử chúng ta có thể đặt sang một bên các câu hỏi đạo đức sang một bên:

Doanh nghiệp A đã ký hợp đồng với bạn về cách liên lạc giữa các văn phòng vệ tinh A1 và A2 mà không có ai ngoài những người được ủy quyền trong A1 và A2 có thể hiểu được giao tiếp.

Doanh nghiệp B đã ký hợp đồng với bạn để có cách nghe lén thông minh trên tất cả các liên lạc giữa A1 và A2.

Rõ ràng bạn không thể làm cả hai.

Do cách thức hoạt động của toán học (toán học chính xác đã được nghiên cứu liên tục trong 100 năm), một trong những yêu cầu sau đây không thể được thỏa mãn:

(1): Cung cấp một thuật toán mã hóa không thể bị phá vỡ bởi kẻ tấn công với số tiền tùy ý có sẵn.

(2): Cung cấp thuật toán phá mã hóa cho thuật toán mã hóa tùy ý chạy trong thời gian hợp lý.


1
(3): Thất bại trong việc kiếm một công việc khác sau khi thị trường phát hiện ra bạn thậm chí đã cố gắng cả hai
TruthOf42

1

Gần đây tôi đã tham gia một lớp về Mô hình quy trình kinh doanh và ký hiệu ( BPMN ). Ở đó có thể dễ dàng nhận thấy rằng các quy trình công việc có quá nhiều phân tách, tham gia và các vòng lặp trở nên không thực tế (mặc dù không nhất thiết là không thể , AFAIK) để hiểu và kiểm soát, (khi bạn sử dụng quá nhiều phân tách OR thay vì chia tách XOR).

Đối với ngành công nghiệp phần mềm, tôi nghĩ điều tương tự cũng xảy ra đối với các vấn đề tương tự về "phạm vi bảo hiểm nhiều điều kiện" trong phân tích bảo hiểm mã .

Đối với một doanh nghiệp, cách để đi là thu hẹp không gian vấn đề, và không ném thêm tài nguyên vào vấn đề phức tạp. Trong ví dụ của tôi, thêm các ràng buộc cho quy trình công việc, (hoặc trong phân tích độ bao phủ mã, đơn giản hóa mã), thay vì làm việc chăm chỉ để tìm tất cả, giả sử, N có thể có dấu vết và kết quả trong đó N là một số lượng lớn không thể tưởng tượng được.

Ngoài ra, tôi nghĩ rằng có nhiều vấn đề trong phân tích mạng / đồ thị không thể giải quyết (cố gắng xác định cấu trúc liên kết mạng bằng cách lặp đi lặp lại tất cả các đường dẫn, v.v.).


0

Ví dụ kinh điển là cố gắng phân tích HTML bằng các biểu thức thông thường . Điều này có thể hoạt động với các bộ HTML giới hạn nhưng một giải pháp chung là không thể, do thực tế là chúng có các ngữ pháp Chomsky khác nhau (vì liên kết làm cho rõ ràng (ish)).

Nói chung, một số người không thích suy nghĩ một cách triết lý (như đồng nghiệp của bạn) và tôi không chắc bạn có thể tranh luận theo cách của bạn ra khỏi một tâm trí. Điểm đầu tiên của anh ấy chắc chắn là sai nhưng lần thứ hai của anh ấy có thể chỉ là một cách để nói rằng tôi không cần phải lo lắng về điều này để mã hóa các biểu mẫu web để nhận hàng. Tôi đã có một số thiện cảm với điều này nhưng đôi khi biết lý thuyết có nghĩa là bạn không cam kết tìm kiếm Chén Thánh trong thời gian làm việc.


-6

Có lẽ câu trả lời là đồng nghiệp của bạn là chính xác. Có lẽ bạn đã hiểu nhầm Turing, hoặc nó áp dụng ở đây như thế nào?

Tất cả các máy đều hữu hạn, do đó không có máy Turing 'thật' và không có chương trình nào sẽ không bao giờ dừng lại. Một chương trình tầm thường thực hiện một vòng lặp vô hạn đơn giản có thể chạy 5 phút hoặc 50 năm nhưng trên một máy hữu hạn, nó sẽ dừng lại. Một vấn đề không dừng không tầm thường như 'tính toán chính xác pi' cũng sẽ dừng lại, bởi vì cuối cùng phép tính sẽ vượt quá khả năng lưu trữ các chữ số tiếp theo.

Kết quả Turing không đảm bảo bất cứ điều gì đặc biệt hữu ích trên các máy hữu hạn, vì vậy nhiệm vụ của bạn cuối cùng không có kết quả. Tốt hơn để tập trung vào bao nhiêu thời gian và bao nhiêu tiền và để lại vô hạn cho các nhà toán học.

Bạn có thể nghĩ rằng một chương trình như { while true: print "running"; print "halted"; }là một ví dụ ngược lại nhưng thực tế không phải vậy. Chương trình này có tác dụng phụ, có thể hoặc không thể khiến nó dừng lại. Bỏ qua các tác dụng phụ, có thể đưa ra một bằng chứng chính thức rằng chương trình này sẽ không dừng lại. Trong câu hỏi này, chúng tôi chỉ quan tâm đến các chương trình trốn tránh bằng chứng chính thức về việc không tạm dừng, trong đó câu hỏi tạm dừng là không thể giải quyết được. Đây không phải là một chương trình như vậy.

Nó có thể giúp phân biệt Turing 'mạnh' với Turing 'yếu'. Máy Turing mạnh thực sự là vô hạn và nếu chúng không dừng lại, sẽ chạy trong thời gian vô hạn. Chúng ta không thể xây dựng chúng.

Máy yếu Turing có giới hạn hữu hạn về thời gian và không gian, và chúng là loại duy nhất chúng ta có thể xây dựng. Chúng tôi quan tâm đến các chương trình không thể được chứng minh là dừng lại trong những giới hạn đó. Turing nói với chúng tôi rằng có những chương trình như vậy nhưng chúng tôi không thể xác định chúng. Nếu các giới hạn đủ thấp, chúng ta có thể xác định chúng bằng cách viết chương trình và chạy nó đến giới hạn của nó.

Bản chất của Turing là không có phím tắt. Cách duy nhất để chắc chắn liệu một vấn đề có khả thi về mặt tính toán hay không là viết chương trình, chạy nó và tìm hiểu. Với đủ thời gian và tiền bạc, bạn có thể viết tất cả các chương trình, chạy chúng mãi mãi và theo thời gian, và tìm ra những chương trình tạo ra kết quả (bộ chia). Những người khác vẫn sẽ chạy. Bạn đồng nghiệp có đủ thời gian và tiền bạc để làm việc đó không?

Nghiêm túc mà nói, tranh chấp là về giới hạn. Turing và NP hoàn thành cho chúng tôi biết rằng các loại vấn đề nhất định không thể được giải quyết bằng máy tính trong bất kỳ ngân sách nhất định hoặc theo bất kỳ lịch trình cụ thể nào, bất kể ngân sách đó lớn hay lịch trình đó có thể hào phóng đến mức nào. Ví dụ về loại vấn đề đó rất nhiều: phá khóa mật mã; tối ưu hóa các tuyến đường để thực hiện giao hàng đến hàng trăm địa chỉ; hộp đóng gói trong xe tải; tìm lỗi trong các chương trình lớn!

Vì vậy, hãy hỏi đồng nghiệp của bạn về ngân sách và lịch trình, và đưa ra một lời hứa rằng bạn có thể tạo ra một vấn đề không thể giải quyết trong ngân sách hoặc lịch trình đó. Lời hứa đó sẽ rất dễ giữ.


2
Bản chất của vấn đề tạm dừng là có những loại vấn đề không thể tính được, bao giờ - ngay cả với thời gian và tiền bạc vô hạn. Đó là những gì đồng nghiệp của tôi từ chối chấp nhận.
Jesan Fafon

Sau đó chúng tôi không đồng ý. Tôi đã chỉnh sửa câu trả lời của mình, nhưng về cơ bản thì tin nhắn cũng vậy. Câu hỏi của bạn như được đặt ra không có câu trả lời (hoặc không phải câu hỏi bạn muốn), nhưng cơ bản nó là một vấn đề thực sự và một điểm thực sự cần được thực hiện. Nếu bạn muốn giành chiến thắng trong cuộc tranh luận này, bạn sẽ phải thay đổi phần nào và tôi đã cố gắng cung cấp một số trợ giúp để thực hiện điều đó. [Nhắc tôi đừng cố trả lời những câu hỏi như thế này một lần nữa - những phiếu bầu tiêu cực không được chào đón.]
david.pfx

2
@simon: Có nguy cơ lặp lại bản thân mình, không có chương trình nào mất một lượng thời gian vô hạn để hoàn thành vì không có máy tính hoàn chỉnh Turing, chỉ là xấp xỉ hữu hạn đối với chúng. Bạn không thể chứng minh rằng một chương trình tùy ý sẽ hoàn thành trong bất kỳ khoảng thời gian cụ thể nào bằng bất kỳ phương pháp nào nhanh hơn thực tế chạy chương trình. Trong thực tế, bất kỳ câu nào có từ 'vô hạn' trong đó đều có nguy cơ vô nghĩa.
david.pfx

3
while True: print "doing stuff"; print "Finished"; Đó là một ví dụ về một chương trình cần một lượng thời gian vô hạn để hoàn thành. Có một lượng vô hạn các chương trình khác cũng mất một lượng thời gian vô hạn để hoàn thành. Chúng tôi thường xuyên tạo ra các chương trình mất một lượng thời gian vô hạn để hoàn thành mục đích. Chúng được gọi là "các quá trình chạy dài". Hầu hết các trang web năng động là ví dụ về một.
Singletoned

2
Vấn đề chắc chắn là có những bộ chương trình máy tính có hiệu quả vô hạn, chúng sẽ không bao giờ dừng lại dưới hơi nước của chúng (cuối cùng chúng ta sẽ nhấn ngắt, rút ​​điện, v.v.), nếu chúng ta lập trình chúng vào máy Turing thì nó sẽ chạy mà không dừng lại. Bản chất của vấn đề tạm dừng là không có cách nào thực tế hay lý thuyết để xác định các chương trình không tạm dừng ở tất cả các thuật toán.
Alistair Mackenzie
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.