Chciałbym uprzedzić, że to pytanie jest podobne, ale moje pytanie nie dotyczy przypadkowości, tylko wybredny determinizm, więc odpowiedź „użyj znanego nasienia” tak naprawdę nie ma zastosowania. Podobnie, to pytanie jest podobne, ale znowu nie oczekuję, że algorytm kiedykolwiek zawiedzie - po prostu nie wiem, w którą stronę będzie poprawny.
To pytanie pojawiło się podczas testowania algorytmów grafowych. ale nie ogranicza się do nich. Niektóre algorytmy, takie jak A *, mogą mieć wiele poprawnych odpowiedzi. W zależności od dokładnej implementacji możesz uzyskać jedną z kilku odpowiedzi, z których każda jest jednakowo poprawna. Może to jednak utrudnić ich przetestowanie, ponieważ nie wiadomo, który z nich wypluje z wyprzedzeniem, a ręczne obliczenie odpowiedzi zajmuje dużo czasu.
W moim konkretnym przypadku udało mi się to obejść, modyfikując Floyd-Warshall, aby wypluł każdą możliwą najkrótszą ścieżkę, i spędziłem czas na testowaniu tego. Miał tę zaletę, że sam w sobie był dobrą cechą. Następnie mógłbym przetestować inne funkcje pod kątem znanych poprawnych ścieżek z FW (jeśli zwrócona ścieżka jest jedną ze ścieżek zwróconych przez FW dla tej pary początkowej / końcowej, jest poprawna). Oczywiście działa to tylko w przypadku gęstych wykresów ze względu na działanie FW, ale nadal jest przyjemne.
Jednak nie zawsze może to być wykonalne dla wszystkich algorytmów o tej charakterystyce. Jak dotąd najlepszą odpowiedzią, jaką wymyśliłem, jest sprawdzenie właściwości poprawnej odpowiedzi, a nie samej odpowiedzi. Aby wrócić do algorytmów najkrótszej ścieżki, możesz sprawdzić koszt zwróconej ścieżki w stosunku do znanego właściwego kosztu i upewnić się, że ścieżka jest poprawna.
Działa to, ale może wiązać się z ryzykiem niepoprawnej weryfikacji wszystkiego, tym więcej kryteriów poprawności istnieje, szczególnie jeśli sama weryfikacja jest złożona (np. Gdy istnieją prawidłowe algorytmy , weryfikacja minimalnego drzewa opinającego jest znanym trudnym problemem; prawdopodobnie trudniejszym niż konstruowanie samego MST), w takim przypadku musisz teraz dokładnie przetestować kod testowy. Gorzej: prawdopodobnie musisz zbudować MST, aby przetestować algorytm weryfikacji MST, więc masz teraz świetny scenariusz, w którym test MST opiera się na działającym algorytmie weryfikacji MST, a test algorytmu weryfikacji MST opiera się na działającym kodzie generowania MST.
Wreszcie istnieje „tani sposób”, który polega na obserwowaniu wyników, ręcznej weryfikacji, a następnie na twardym kodowaniu testu w celu przetestowania właśnie zweryfikowanego wyniku, ale nie jest to świetny pomysł, ponieważ może za każdym razem trzeba będzie zmieniać test zmień nieco implementację (czego powinno unikać automatyczne testowanie).
Oczywiście odpowiedź zależy od dokładnego algorytmu, który testujesz w pewnym stopniu, ale zastanawiałem się, czy istnieją jakieś „najlepsze praktyki” w zakresie weryfikacji algorytmów, które mają kilka określonych, deterministycznych „poprawnych” wyników, ale te dokładne poprawne wyniki są trudne wiedzieć z wyprzedzeniem i być może nawet trudny do zweryfikowania po fakcie.