Ich möchte vorwegnehmen, dass diese Frage ähnlich ist, aber meine Frage beinhaltet keine Zufälligkeit, sondern nur einen heiklen Determinismus, sodass die Antwort "Verwenden Sie einen bekannten Samen" nicht wirklich zutrifft. Ebenso ist diese Frage ähnlich, aber ich erwarte auch hier nicht, dass der Algorithmus jemals fehlschlägt - ich weiß nur nicht, wie er richtig sein wird.
Diese Frage stellte sich beim Testen von Graph-Algorithmen. ist aber keineswegs auf sie beschränkt. Einige Algorithmen wie A * können mehrere richtige Antworten haben. Abhängig von Ihrer genauen Implementierung erhalten Sie möglicherweise eine von mehreren Antworten, von denen jede gleichermaßen korrekt ist. Dies kann es jedoch schwierig machen, sie zu testen, da Sie nicht wissen, welche sie im Voraus ausspucken werden, und es sehr zeitaufwändig ist, die Antworten von Hand zu berechnen.
In meinem speziellen Fall habe ich Floyd-Warshall so modifiziert, dass er jeden möglichen kürzesten Weg ausspuckt , und die Zeit damit verbracht, dies von Hand zu testen. Es hatte den Vorteil, ein gutes Feature für sich zu sein. Dann könnte ich andere Funktionen in Bezug auf die bekannten korrekten Pfade von FW testen (wenn der zurückgegebene Pfad einer der von FW für dieses Start / End-Paar zurückgegebenen Pfade ist, ist er korrekt). Natürlich funktioniert dies aufgrund der Funktionsweise von FW nur für dichte Grafiken, aber es ist immer noch schön.
Dies ist jedoch möglicherweise nicht immer für alle Algorithmen mit dieser Eigenschaft möglich. Bisher ist die beste Antwort, die ich gefunden habe, die Eigenschaften einer richtigen Antwort zu testen und nicht die richtige Antwort selbst. Um zu den Algorithmen für kürzeste Pfade zurückzukehren, können Sie die Kosten des zurückgegebenen Pfads mit den bekannten richtigen Kosten vergleichen und sicherstellen, dass der Pfad gültig ist.
Dies funktioniert, aber es besteht die Gefahr, dass nicht alles korrekt überprüft wird, je mehr Kriterien für die Richtigkeit vorhanden sind, insbesondere wenn die Überprüfung selbst komplex ist (z. B. wenn korrekte Algorithmen vorhanden sind , ist die Überprüfung eines minimalen Spannbaums ein bekanntes schwieriges Problem, wahrscheinlich schwieriger als MST selbst erstellen). In diesem Fall müssen Sie Ihren Testcode jetzt ausführlich testen. Schlimmer noch: Vermutlich müssen Sie ein MST erstellen, um einen MST-Überprüfungsalgorithmus zu testen, sodass Sie jetzt ein großartiges Szenario haben, in dem Ihr MST-Test davon abhängt, dass Ihr MST-Überprüfungsalgorithmus funktioniert, und Ihr MST-Überprüfungsalgorithmus-Test von Ihrem MST-Generierungscode abhängt.
Schließlich gibt es den "billigen Weg", bei dem die Ausgabe beobachtet, von Hand überprüft und dann der Test hart codiert wird, um die gerade überprüfte Ausgabe zu testen. Dies ist jedoch keine gute Idee, da Sie den Test möglicherweise jedes Mal überarbeiten müssen Ändern Sie die Implementierung ein wenig (was durch automatisierte Tests vermieden werden soll).
Natürlich hängt die Antwort von dem genauen Algorithmus ab, den Sie bis zu einem gewissen Grad testen, aber ich habe mich gefragt, ob es "Best Practices" für die Überprüfung von Algorithmen gibt, die mehrere eindeutige, deterministische "korrekte" Ausgaben haben, aber diese genauen korrekten Ausgaben sind schwierig zu erreichen im Voraus wissen und möglicherweise schwer nachträglich zu überprüfen.