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.
quelle
Antworten:
Ich bin nicht sicher, ob Sie versuchen, die richtige Eigenschaft zu testen, und dies führt zu Ihrer Mehrdeutigkeit.
Graph-Algorithmen zielen nicht darauf ab, einen kürzesten Weg zu finden (dies ist ein Nebeneffekt), sondern darauf , eine Kostenfunktion zu minimieren oder zu maximieren, die für die Menge der Kanten und Eckpunkte definiert ist. Auf diese Weise können Sie die Richtigkeit einer Lösung überprüfen, indem Sie den Endwert dieser Funktion testen und feststellen, dass der erste und der letzte Knoten tatsächlich erforderlich sind.
Wenn Sie den endgültigen Kostenfunktionswert für jeden möglichen Pfad vorberechnen können (normalerweise unrealistisch), müssen Sie nur überprüfen, ob die Kosten der von der zu testenden Implementierung bereitgestellten Lösung den Mindestkosten in diesem Satz entsprechen (absoluter Vergleich) ). Wenn Sie "nur" einen Goldstandardalgorithmus und / oder eine Goldstandardimplementierung haben, sollten Sie die Kosten seiner Ausgabe mit denen des zu testenden Algorithmus vergleichen (relativer Vergleich).
Ein naiver Testaufbau wäre beispielsweise:
Wenn Sie mehr über die graphbasierte Optimierung erfahren möchten, können Sie sich hier die Veröffentlichungen von Yuri Boykov ansehen , allerdings in einem anderen Kontext (Computer Vision-Probleme).
quelle
Ich denke, die direkte Antwort auf Ihre Frage ist, bessere Testfälle auszuwählen. Ich frage mich über die Testfälle, die Sie verwenden. Die von Ihnen verwendeten Diagramme können CANNED-Diagramme sein, bei denen es für einen Menschen relativ einfach ist, die erwartete Reaktion zu bestimmen. Versuchen Sie, die "Rand" -Fälle herauszufinden, die Ihr Algorithmus verarbeiten soll, und erstellen Sie für jeden der bestimmten Randfälle ein vordefiniertes Diagramm, das für einen Menschen leicht zu berechnen ist. Im Fall des Djikstra-Algorithmus können Sie beispielsweise wahrscheinlich einige 5x5- oder 7x7-Diagramme erstellen, die alle Ihre Randfälle abdecken, obwohl Ihr reales System möglicherweise 500x500 ist.
Als letzte Überprüfung der Gesundheit können Sie dann ein oder zwei realistischere Graphentestfälle erstellen. Aber auf jeden Fall denke ich, dass Sansuiso genau dort ist, wo darauf hingewiesen wird, dass Sie sicher sein müssen, dass Sie auf die richtige Eigenschaft testen.
quelle