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.
sumber
Jawaban:
Saya tidak yakin Anda mencoba menguji properti yang benar, dan ini menyebabkan ambiguitas Anda.
Algoritma grafik tidak bertujuan untuk menemukan beberapa jalur terpendek (ini adalah efek samping), tetapi untuk meminimalkan atau memaksimalkan beberapa fungsi biaya yang didefinisikan pada himpunan tepi dan simpul. Dengan demikian, Anda dapat memeriksa kebenaran solusi dengan menguji nilai akhir dari fungsional ini dan menyatakan bahwa node pertama dan terakhir adalah yang benar-benar diperlukan.
Jika Anda dapat melakukan pra-perhitungan nilai fungsi biaya akhir untuk setiap jalur yang mungkin (biasanya tidak realistis), maka Anda hanya perlu memeriksa bahwa biaya solusi yang disediakan oleh implementasi yang diuji adalah sama dengan biaya minimum di antara rangkaian ini (perbandingan mutlak ). Jika Anda "baru" memiliki algoritma dan / atau implementasi standar emas, maka Anda harus membandingkan biaya outputnya dengan salah satu algoritma yang sedang diuji (perbandingan relatif)
Misalnya, pengaturan tes naif adalah:
Jika Anda ingin tahu lebih banyak tentang pengoptimalan berbasis grafik, Anda dapat melihat publikasi Yuri Boykov di sini , meskipun dalam konteks lain (masalah Penglihatan Komputer).
sumber
Saya pikir jawaban langsung untuk pertanyaan Anda adalah memilih test case yang lebih baik. Saya ingin tahu tentang kasus uji yang Anda gunakan. Grafik yang Anda gunakan dapat berupa grafik DAPAT di mana relatif mudah bagi manusia untuk menentukan respons yang diharapkan. Cobalah untuk mencari tahu "tepi" kasus yang Anda ingin memastikan algoritma Anda menangani dan membuat grafik kalengan untuk masing-masing kasus tepi tertentu yang mudah bagi manusia untuk menghitung. Misalnya, dalam kasus algoritme Djikstra, Anda mungkin dapat membuat beberapa grafik 5x5 atau 7x7 yang mencakup semua kasing tepi Anda, meskipun sistem Anda yang sebenarnya mungkin 500x500.
Kemudian sebagai pemeriksaan kewarasan terakhir Anda dapat membuat satu atau dua test case grafik yang lebih realistis. Tetapi bagaimanapun juga, saya pikir sansuiso telah menemukannya di mana ditunjukkan bahwa Anda perlu memastikan Anda menguji properti yang benar.
sumber