Je voudrais faire précéder ceci que cette question est similaire, mais ma question n'implique pas le hasard, juste un déterminisme capricieux, donc la réponse de "utiliser une graine connue" ne s'applique pas vraiment. De même, cette question est similaire, mais encore une fois, je ne m'attends pas à ce que l'algorithme échoue jamais - je ne sais tout simplement pas de quelle manière il sera correct.
Cette question est survenue lors du test des algorithmes de graphes. mais n'y est nullement limité. Certains algorithmes tels que A * peuvent avoir plusieurs réponses correctes. En fonction de votre implémentation exacte, vous pouvez obtenir l'une des réponses, chacune étant également correcte. Cependant, cela peut les rendre difficiles à tester, car vous ne savez pas lequel il va cracher à l'avance, et il faut beaucoup de temps pour calculer les réponses à la main.
Dans mon cas spécifique, je l'ai contourné en modifiant Floyd-Warshall pour cracher tous les chemins les plus courts possibles , et j'ai passé le temps à tester cela. Elle avait l'avantage d'être une bonne caractéristique à part entière. Ensuite, je pourrais tester d'autres fonctions en termes de chemins corrects connus de FW (si le chemin retourné est l'un des chemins retournés par FW pour cette paire de début / fin, c'est correct). Bien sûr, cela ne fonctionne que pour les graphiques denses en raison du fonctionnement de FW, mais c'est toujours agréable.
Cependant, cela peut ne pas toujours être viable pour tous les algorithmes avec cette caractéristique. Jusqu'à présent, la meilleure réponse que j'ai trouvée est de tester les caractéristiques d'une bonne réponse, plutôt que la bonne réponse elle-même. Pour revenir aux algorithmes de chemin le plus court, vous pouvez vérifier le coût du chemin renvoyé par rapport au bon coût connu et vous assurer que le chemin est valide.
Cela fonctionne, mais cela peut courir le risque de ne pas tout vérifier correctement plus il y a de critères de correction, surtout si la vérification est elle-même complexe (par exemple, alors qu'il existe des algorithmes corrects , la vérification d'un arbre couvrant minimum est un problème difficile connu; probablement plus difficile que construction du MST lui-même), auquel cas vous devez maintenant tester en profondeur votre code de test. Pire: vous devez probablement construire un MST pour tester un algorithme de vérification MST, vous avez donc maintenant un excellent scénario dans lequel votre test MST repose sur le fonctionnement de votre algorithme de vérification MST, et votre test d'algorithme de vérification MST repose sur le fonctionnement de votre code de génération MST.
Enfin, il y a la "méthode bon marché", qui consiste à observer la sortie, à la vérifier à la main, puis à coder en dur le test pour tester la sortie que vous venez de vérifier, mais ce n'est pas une bonne idée car vous devrez peut-être réviser le test à chaque fois que vous changer un peu l'implémentation (ce que les tests automatisés sont censés éviter).
Évidemment, la réponse dépend de l'algorithme exact que vous testez dans une certaine mesure, mais je me demandais s'il y avait des "meilleures pratiques" pour vérifier les algorithmes qui ont plusieurs sorties "correctes" déterminées et déterministes, mais ces sorties correctes précises sont difficiles à savoir à l'avance, et peut-être même difficile à vérifier après coup.