Kiểm tra thuật toán (xác định) với nhiều hoặc khó để chứng minh câu trả lời đúng


11

Tôi muốn mở đầu này này câu hỏi tương tự, nhưng câu hỏi của tôi không liên quan đến tính ngẫu nhiên, chỉ định mệnh khó tính, vì vậy câu trả lời của "sử dụng một hạt giống nổi tiếng" không thực sự áp dụng. Tương tự như vậy, này câu hỏi tương tự, nhưng một lần nữa, tôi không hy vọng các thuật toán để bao giờ thất bại - Tôi chỉ không biết cách nào nó sẽ được chính xác.

Câu hỏi này xuất hiện trong khi thử nghiệm các thuật toán đồ thị. nhưng không có nghĩa là giới hạn đối với họ. Một số thuật toán như A * có thể có nhiều câu trả lời đúng. Tùy thuộc vào việc thực hiện chính xác của bạn, bạn có thể nhận được bất kỳ một trong số các câu trả lời, mỗi câu trả lời đều đúng như nhau. Tuy nhiên, điều này có thể khiến chúng khó kiểm tra vì bạn không biết cái nào sẽ nhổ ra trước thời hạn và sẽ rất tốn thời gian để tính toán các câu trả lời bằng tay.

Trong trường hợp cụ thể của tôi, tôi đã khắc phục nó bằng cách sửa đổi Floyd-Warshall để nhổ ra mọi con đường ngắn nhất có thể , và dành thời gian thử nghiệm điều đó. Nó có lợi ích là một tính năng tốt theo đúng nghĩa của nó. Sau đó, tôi có thể kiểm tra các hàm khác theo các đường dẫn chính xác đã biết từ FW (nếu đường dẫn được trả về là một trong những đường dẫn được FW trả về cho cặp bắt đầu / kết thúc đó, thì đó là chính xác). Tất nhiên, điều này chỉ hoạt động đối với các biểu đồ dày đặc do cách FW hoạt động, nhưng nó vẫn tốt.

Tuy nhiên, điều đó có thể không phải lúc nào cũng khả thi đối với tất cả các thuật toán có đặc tính này. Cho đến nay, câu trả lời tốt nhất mà tôi đã đưa ra là kiểm tra các đặc điểm của một câu trả lời đúng hơn là câu trả lời đúng. Để quay lại các thuật toán đường dẫn ngắn nhất, bạn có thể kiểm tra chi phí của đường dẫn được trả về so với chi phí đúng đã biết và đảm bảo đường dẫn hợp lệ.

Điều này hoạt động, nhưng nó có thể có nguy cơ không xác minh chính xác mọi thứ, càng có nhiều tiêu chí cho tính chính xác, đặc biệt là nếu việc xác minh là phức tạp (ví dụ trong khi thuật toán chính xác tồn tại , xác minh cây bao trùm tối thiểu là một vấn đề khó khăn đã biết; tự xây dựng MST), trong trường hợp đó bạn phải kiểm tra rộng rãi mã kiểm tra của mình. Tồi tệ hơn: có lẽ bạn phải xây dựng MST để kiểm tra thuật toán xác minh MST để bây giờ bạn có một kịch bản tuyệt vời khi kiểm tra MST của bạn phụ thuộc vào thuật toán xác minh MST của bạn hoạt động và kiểm tra thuật toán xác minh MST của bạn phụ thuộc vào mã tạo MST của bạn hoạt động.

Cuối cùng, có "cách rẻ tiền", bao gồm quan sát đầu ra, xác minh bằng tay, sau đó mã hóa bài kiểm tra để kiểm tra đầu ra mà bạn vừa xác minh, nhưng đó không phải là ý tưởng hay vì bạn có thể phải xem lại bài kiểm tra mỗi khi bạn thay đổi việc thực hiện một chút (đó là những gì kiểm tra tự động được cho là nên tránh).

Rõ ràng câu trả lời phụ thuộc vào thuật toán chính xác mà bạn đang kiểm tra ở một mức độ nào đó, nhưng tôi đã tự hỏi liệu có "thực tiễn tốt nhất" nào để xác minh các thuật toán có một số đầu ra "chính xác" xác định, xác định hay không, nhưng những đầu ra chính xác đó rất khó biết trước thời hạn và có thể khó xác minh sau khi thực tế.


3
Nếu ngôn ngữ cho phép, bạn có thể chứng minh tính đúng đắn thay vì kiểm tra ngôn ngữ đó
miniBill

Có rất nhiều văn bản, nhưng không có câu hỏi. Vì vậy, chính xác những gì bạn đang hỏi?
BЈовић

@ BЈовић "Làm cách nào để kiểm tra việc triển khai thuật toán với nhiều và / hoặc khó xác minh đầu ra chính xác?" Tôi không chắc làm thế nào để làm cho rõ ràng hơn nhiều, xin lỗi. Tôi sẽ cho rằng nó có thể được coi là hơi rộng tùy theo góc nhìn của bạn, nhưng tôi không nghĩ nó không được xác định.
Tuyến tínhZoetrope

Tôi vẫn không hiểu. Thuật toán của bạn không phụ thuộc vào tính ngẫu nhiên, nhưng nó vẫn có thể tạo ra các đầu ra khác nhau. Điều đó không có ý nghĩa gì cả. Mọi thuật toán, đối với đầu vào được đặt, phải có cùng đầu ra. Và đó là những gì được thực hiện và thử nghiệm trong các bài kiểm tra đơn vị. Ngay cả các thuật toán trong bài báo bạn liên kết.
BЈовић

@ BЈовић Tất nhiên là nó mang tính quyết định, nhưng nó cũng rất nhạy cảm, ví dụ như thứ tự biểu đồ trả về các nút kế của nút. Nó có thể gây ra một chút hiệu ứng cánh bướm. Cho dù bạn đẩy đỉnh A trên một ngăn xếp trước đỉnh B sẽ dẫn đến một đầu ra khác nếu cả hai đều dẫn đến một con đường ngắn nhất. Sử dụng các hàm thư viện như các loại không ổn định hoặc các đống nhỏ chỉ làm trầm trọng thêm vấn đề.
Tuyến tínhZoetrope

Câu trả lời:


5

Tôi không chắc chắn bạn đang cố kiểm tra tài sản chính xác và điều này gây ra sự mơ hồ của bạn.

Các thuật toán đồ thị không nhằm mục đích tìm một số đường đi ngắn nhất (đây là hiệu ứng phụ), nhưng để giảm thiểu hoặc tối đa hóa một số hàm chi phí được xác định trên tập hợp các cạnh và đỉnh. Do đó, bạn có thể kiểm tra tính chính xác của giải pháp bằng cách kiểm tra giá trị cuối cùng của chức năng này và khẳng định rằng các nút đầu tiên và cuối cùng là những nút thực sự cần thiết.

Nếu bạn có thể tính toán trước giá trị hàm chi phí cuối cùng cho từng đường dẫn có thể (thường là không thực tế), thì bạn chỉ cần kiểm tra xem chi phí của giải pháp do việc triển khai được thử nghiệm có bằng chi phí tối thiểu trong tập hợp này không (so sánh tuyệt đối ). Nếu bạn "chỉ" có một thuật toán và / hoặc triển khai tiêu chuẩn vàng, thì bạn nên so sánh chi phí đầu ra của nó với một trong các thuật toán được thử nghiệm (so sánh tương đối)

Ví dụ: thiết lập thử nghiệm ngây thơ sẽ là:

  1. Tính toán tất cả các đường dẫn có thể giữa Va và Vb trong biểu đồ thử nghiệm với thuật toán tham lam.
  2. Tính toán hàm chi phí (ví dụ: độ dài nếu tất cả các trọng số cạnh của bạn bằng 1) cho mỗi đường dẫn này và tìm giá trị tối thiểu.
  3. Áp dụng thuật toán đang thử nghiệm.
  4. Thực hiện một xác nhận trong bài kiểm tra đơn vị của bạn rằng giá trị chi phí thuật toán được kiểm tra bằng với mức tối thiểu của các giải pháp tham lam.

Nếu bạn muốn biết thêm về tối ưu hóa dựa trên biểu đồ, bạn có thể xem qua các ấn phẩm của Yuri Boykov tại đây , mặc dù trong một bối cảnh khác (vấn đề về Tầm nhìn Máy tính).


Tôi ủng hộ, nhưng tôi sẽ đợi một chút để chấp nhận. Đây là "bài kiểm tra cho các đặc điểm của một câu trả lời đúng" tôi đã đề cập trong câu hỏi. Vấn đề luôn xảy ra trong việc đảm bảo bạn đang xác minh điều đúng. Chẳng hạn, tại một thời điểm tôi đã kiểm tra chi phí trả lại và đảm bảo đường dẫn hợp lệ. Tất nhiên đường dẫn là hợp lệ! Đó chỉ là nút bắt đầu! Vì vậy, tôi đã phải thay đổi các bài kiểm tra để đảm bảo rằng đường dẫn thực sự có chi phí chính xác. Sai lầm ngớ ngẩn, chắc chắn, nhưng càng nhiều tương tác như thế này thì đầu ra của bạn càng có nhiều khả năng.
linearZoetrope

Theo quan điểm của tôi, đó là lợi ích cải tiến liên tục của thử nghiệm: ban đầu bạn không thể tìm ra tất cả các thuộc tính chính xác của giải pháp, sau đó một ngày nào đó sẽ thất bại, cải thiện thử nghiệm của mình, v.v.
sansuiso

Câu trả lời này khuyến cáo thử nghiệm cho đặc điểm của câu trả lời đúng, nhưng điều quan trọng là phải chọn đặc điểm làm cho một thử nghiệm tốt. Trong ví dụ này, xác minh rằng câu trả lời là đường dẫn từ A đến B và hàm chi phí bằng giá trị tối thiểu cung cấp cho bạn hai tiêu chí mà tất cả các câu trả lời đúng sẽ thỏa mãn, trong khi không có câu trả lời sai nào đáp ứng cả hai tiêu chí. Nếu câu trả lời này chưa được đưa ra, tôi sẽ đề nghị một cái gì đó tương tự. Phải thừa nhận rằng thường không dễ để biết nên kiểm tra những đặc điểm nào.
David K

0

Tôi nghĩ rằng câu trả lời trực tiếp cho câu hỏi của bạn là chọn trường hợp kiểm tra tốt hơn. Tôi tự hỏi về các trường hợp thử nghiệm bạn đang sử dụng. Các biểu đồ bạn sử dụng có thể là biểu đồ CANNED nơi con người tương đối dễ dàng xác định phản hồi dự kiến. Cố gắng tìm ra các trường hợp "cạnh" mà bạn muốn chắc chắn rằng thuật toán của bạn xử lý và tạo một biểu đồ đóng hộp cho từng trường hợp cạnh cụ thể mà con người dễ dàng tính toán. Ví dụ: trong trường hợp thuật toán Djikstra, bạn có thể tạo một số đồ thị 5x5 hoặc 7x7 bao gồm tất cả các trường hợp cạnh của bạn, mặc dù hệ thống thực của bạn có thể là 500x500.

Sau đó, như một kiểm tra độ tỉnh táo cuối cùng, bạn có thể tạo một hoặc hai trường hợp kiểm tra đồ thị thực tế hơn. Nhưng trong bất kỳ sự kiện nào, tôi nghĩ rằng sansuiso đã phát hiện ra nơi nó được chỉ ra rằng bạn cần chắc chắn rằng bạn đang kiểm tra tài sản chính xác.

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.