Disons que nous avons notre algorithme de recherche d'itinéraire:
def myHeuristicTSP(graph):
/*implementation*/
return route
Maintenant, nous voulons tester ceci de manière unitaire:
class TestMyHeuristicTSP:
def testNullGraphRaiseValueError(self):
self.assertRaises(ValueError, myHueristicTSP(None))
def testSimpleTwoNodeGraphReturnsRoute:
self.assertEquals(expectedResult, myHeuristicTSP(input))
La question est, pour un algorithme TSP non heuristique, nous pouvons donner une variété de graphiques et vérifier qu'ils retournent toujours absolument la route la plus courte.
Mais parce qu'un algorithme heurtistique, bien qu'il soit encore déterministe, est moins prévisible, sont-ils simplement destinés à comprendre comment l'algorithme est censé fonctionner et à trouver ces cas limites?
unit-testing
heuristics
dwjohnston
la source
la source
Réponses:
Pour un algorithme heuristique censé ne pas renvoyer l'idéal mais une solution "assez bonne", vous auriez différents cas de test et vérifieriez
la source
La plupart des algorithmes d'optimisation (y compris l'heuristique) fonctionnent sur certaines configurations (dans votre exemple, un itinéraire) en leur appliquant des opérations. Les opérations pour elles-mêmes devraient garantir qu'elles ne fournissent que des configurations valides, donc il devrait d'abord y avoir des tests unitaires pour chacune d'entre elles. Lorsque vous savez avec certitude que l'algorithme d'optimisation utilise uniquement ces opérations, il ne devrait généralement pas être nécessaire de tester la validité du résultat de l'algorithme.
Pour créer de bons tests unitaires pour tout type d'algorithme plus complexe, il faut en fait connaître l'algorithme lui-même en détail . Pour les heuristiques simples comme «l'escalade», vous pouvez généralement prédire le résultat pour de petites entrées. Par exemple, pour les itinéraires initiaux de 3 à 5 points, lorsqu'ils sont donnés dans un certain ordre, vous pouvez prédire ce qui se passera. Cela restera vrai pour la plupart des algorithmes heuristiques déterministes que je connais, c'est donc probablement un bon point de départ.
Pour des algorithmes plus complexes et une taille d'entrée plus grande, lorsque vous introduisez simplement l'entrée dans l'algorithme et essayez de vérifier la sortie, vous ne faites plus de test unitaire, vous faites un test d'acceptation ou d'intégration. La raison pour laquelle vous rencontrez des problèmes pour "tester à l'unité" un tel algo est qu'il se compose généralement d'une poignée de petites pièces (unités individuelles). Donc, pour vraiment tester un tel algorithme, vous devrez identifier ces parties et les tester individuellement. De plus, vous pouvez utiliser des techniques de couverture de code ou de couverture de branche pour vous assurer que vous disposez de suffisamment de cas de test.
Si vous ne recherchez pas des tests unitaires, mais des tests d'acceptation ou d'intégration automatisés, vous pouvez essayer ce que @Phillip a suggéré sous (2) ou (3) .
la source