Tôi nghĩ đây là một câu hỏi rất hay và không có viên đạn bạc. Tôi sẽ chỉ cho bạn biết về kinh nghiệm của tôi.
Tôi đã viết một thuật toán để tìm tập hợp điểm gần nhất giữa hai trụ trong không gian 3D. Đây là một vấn đề rất phức tạp và không gian đầu vào là rất lớn.
Để kiểm tra mã của mình, lúc đầu tôi vừa tạo một số trường hợp chuẩn, được căn chỉnh theo trục, sao cho kết quả "đúng" là hiển nhiên. Nhưng điều đó quá yếu.
Sau đó, tôi đã có thể "tăng cường" các trường hợp kinh điển bằng cách áp dụng các phép biến đổi ngẫu nhiên. Điều này đã giúp một chút. Sau đó tôi đã nghĩ về việc viết một thuật toán trùng lặp khác và triển khai thực hiện, nhưng điều đó rất khó, và không có cách nào để biết cả hai thuật toán có thể hiển thị cùng một lỗi hay không. Tuy nhiên, đối với một vấn đề khác, điều này có thể khả thi, chẳng hạn như với brute-force: không hiệu quả, nhưng rất đơn giản để hiểu và xác minh.
Sau đó, tôi nghĩ về các thuộc tính của bộ giải pháp. Ví dụ vector tách biệt phải là một minima cục bộ, vì vậy tôi sẽ có thể "nhìn xung quanh" từng điểm cuối của giải pháp (đối với một epsilon nhỏ) và xác định xem giải pháp có phải là một minima cục bộ hay không.
Sau đó, tôi bắt đầu nghĩ về các thuộc tính tô pô của hàm ánh xạ đầu vào đến đầu ra. Trong trường hợp này tôi biết rằng khoảng cách tách biệt sẽ thay đổi một cách trơn tru. Vì vậy, tôi đã chọn một đầu vào ngẫu nhiên và đồng bằng nhỏ, và sau đó so sánh đầu ra có và không có đồng bằng được áp dụng. Nếu thuật toán là chính xác, thì sự khác biệt về đầu ra phải nhỏ.
Bằng cách kết hợp tất cả các kỹ thuật này, tôi đã có thể nhận được sự tự tin cao trong mã.
Nguồn
2013-05-20 17:53:37
Đây là điểm khởi đầu tốt, nhưng thường dẫn đến lỗi hàng rào và các loại tương tự. Nó chắc chắn là không đủ. –
Nhưng bạn sẽ làm gì nếu có một loạt các câu trả lời đúng và thuật toán của bạn chỉ nhổ ra câu trả lời đầu tiên mà nó tìm thấy? Làm thế nào bạn có thể tin tưởng rằng giải pháp mà nó tìm thấy nằm trong bộ giải pháp của bạn (mà bạn biết là không hoàn thành)? – Sergio
Sergio, bạn cần có một bộ giải pháp khá toàn diện. Hoặc ít nhất là một cách để xây dựng một giải pháp thiết lập từ mẫu cơ sở có lẽ. (Hãy xem các cuộc thi thuật toán như topcoder hoặc codejam thực hiện thử nghiệm của họ như thế nào, chúng chỉ theo cách tiếp cận này). Viết một thuật toán khác để xác minh thuật toán sẽ dễ bị lỗi đệ quy. –