Saya ingin Pendahuluan ini bahwa ini pertanyaan serupa, tapi pertanyaan saya tidak melibatkan keacakan, hanya rewel determinisme, sehingga jawaban dari "menggunakan benih yang dikenal" tidak benar-benar berlaku. Demikian juga, ini pertanyaan serupa, tapi sekali lagi, saya tidak mengharapkan algoritma yang pernah gagal - Saya tidak tahu jalan mana yang akan benar.
Pertanyaan ini muncul saat menguji algoritma grafik. tetapi tidak terbatas pada mereka. Beberapa algoritma seperti A * dapat memiliki beberapa jawaban yang benar. Bergantung pada implementasi tepat Anda, Anda mungkin mendapatkan salah satu dari beberapa jawaban, yang masing-masing sama-sama benar. Ini bisa membuat mereka sulit untuk diuji, karena Anda tidak tahu yang mana yang akan dimuntahkan sebelumnya, dan itu sangat memakan waktu untuk menghitung jawaban dengan tangan.
Dalam kasus spesifik saya, saya mengatasinya dengan memodifikasi Floyd-Warshall untuk memuntahkan setiap jalur terpendek yang mungkin , dan menghabiskan waktu untuk menguji itu. Itu memiliki manfaat menjadi fitur yang baik dengan sendirinya. Kemudian saya bisa menguji fungsi-fungsi lain dalam hal jalur yang benar yang diketahui dari FW (jika jalur yang dikembalikan adalah salah satu jalur yang dikembalikan oleh FW untuk pasangan awal / akhir, itu benar). Tentu saja, ini hanya berfungsi untuk grafik padat karena cara kerja FW, tapi tetap bagus.
Namun, itu mungkin tidak selalu layak untuk semua algoritma dengan karakteristik ini. Sejauh ini, jawaban terbaik yang saya dapatkan adalah menguji karakteristik jawaban yang benar, bukan jawaban yang benar itu sendiri. Untuk kembali ke algoritme jalur terpendek, Anda dapat memeriksa biaya jalur yang dikembalikan terhadap biaya yang diketahui dan memastikan jalur tersebut valid.
Ini berfungsi, tetapi dapat menjalankan risiko tidak memverifikasi semuanya dengan benar, semakin banyak kriteria untuk kebenaran ada, terutama jika verifikasi itu sendiri kompleks (misalnya saat ada algoritma yang benar , memverifikasi pohon rentang minimum adalah masalah yang sulit diketahui; mungkin lebih sulit daripada membangun MST itu sendiri), dalam hal ini Anda sekarang harus menguji secara luas kode pengujian Anda. Lebih buruk: mungkin Anda harus membangun MST untuk menguji algoritma verifikasi MST sehingga Anda sekarang memiliki skenario yang hebat di mana tes MST Anda bergantung pada algoritma verifikasi MST Anda bekerja, dan tes algoritma verifikasi MST Anda bergantung pada kerja kode generasi MST Anda.
Akhirnya, ada "cara murah", yang melibatkan mengamati output, memverifikasinya dengan tangan, lalu menyandikan tes untuk menguji output yang baru saja Anda verifikasi, tapi itu bukan ide bagus karena Anda mungkin harus merevisi tes setiap kali Anda ubah implementasi sedikit (yang seharusnya dihindari pengujian otomatis).
Jelas jawabannya tergantung pada algoritma yang tepat yang Anda uji sampai taraf tertentu, tetapi saya bertanya-tanya apakah ada "praktik terbaik" untuk memverifikasi algoritma yang memiliki beberapa keluaran pasti, deterministik "benar", tetapi keluaran tepat yang benar itu sulit untuk dilakukan. tahu sebelumnya, dan mungkin sulit untuk memverifikasi setelah fakta.