Prefiero decir que esta pregunta es similar, pero mi pregunta no implica aleatoriedad, solo determinismo quisquilloso, por lo que la respuesta de "usar una semilla conocida" no se aplica realmente. Del mismo modo, esta pregunta es similar, pero de nuevo, no espero que el algoritmo falle nunca, simplemente no sé de qué manera será correcto.
Esta pregunta surgió al probar algoritmos gráficos. pero de ninguna manera se limita a ellos. Algunos algoritmos como A * pueden tener múltiples respuestas correctas. Dependiendo de su implementación exacta, puede obtener cualquiera de varias respuestas, cada una de las cuales es igualmente correcta. Sin embargo, esto puede hacer que sean difíciles de probar, porque no sabes cuál va a escupir con anticipación, y es muy lento calcular las respuestas a mano.
En mi caso específico, lo solucioné modificando Floyd-Warshall para escupir cada camino más corto posible , y pasé el tiempo probando eso. Tenía el beneficio de ser una buena característica por derecho propio. Entonces podría probar otras funciones en términos de las rutas correctas conocidas de FW (si la ruta devuelta es cualquiera de las rutas devueltas por FW para ese par de inicio / final, es correcta). Por supuesto, esto solo funciona para gráficos densos debido a cómo funciona FW, pero sigue siendo agradable.
Sin embargo, eso no siempre es viable para todos los algoritmos con esta característica. Hasta ahora, la mejor respuesta que he encontrado es probar las características de una respuesta correcta, en lugar de la respuesta correcta en sí. Para volver a los algoritmos de ruta más corta, puede verificar el costo de la ruta devuelta contra el costo correcto conocido y asegurarse de que la ruta sea válida.
Esto funciona, pero puede correr el riesgo de no verificar todo correctamente mientras haya más criterios de corrección, especialmente si la verificación en sí misma es compleja (por ejemplo, mientras existan algoritmos correctos , verificar un árbol de expansión mínimo es un problema difícil conocido; probablemente más difícil que construir el propio MST), en cuyo caso ahora debe probar exhaustivamente su código de prueba. Peor aún: presumiblemente tiene que construir un MST para probar un algoritmo de verificación MST, por lo que ahora tiene un gran escenario en el que su prueba MST se basa en el funcionamiento de su algoritmo de verificación MST, y su prueba del algoritmo de verificación MST se basa en su código de generación MST funcionando.
Finalmente, está la "forma barata", que consiste en observar la salida, verificarla a mano, luego codificar la prueba para probar la salida que acaba de verificar, pero esa no es una gran idea ya que es posible que tenga que revisar la prueba cada vez que cambiar un poco la implementación (que es lo que se supone que deben evitar las pruebas automatizadas).
Obviamente, la respuesta depende del algoritmo exacto que esté probando hasta cierto punto, pero me preguntaba si había alguna "mejor práctica" para verificar los algoritmos que tienen varias salidas definidas y deterministas "correctas", pero esas salidas correctas precisas son difíciles de saber de antemano, y posiblemente difícil de verificar incluso después del hecho.