Estoy trabajando en una biblioteca de algoritmos de aproximación de código abierto para gráficos y redes que usan algunos paquetes python populares como base. El objetivo principal es abarcar algoritmos de aproximación actualizados para problemas NP-Complete sobre gráficos y redes. La razón de esto es 1) No he visto un buen paquete consolidado (moderno) que cubra esto y 2) sería una buena herramienta pedagógica para aprender acerca de los algoritmos de aproximación en problemas de optimización NP-Hard.unidad de prueba de aproximación Algoritmos
En la construcción de esta biblioteca que estoy usando unidad de pruebas a prueba de cordura (como lo haría cualquier desarrollador adecuada). Soy un poco cauteloso con respecto a las pruebas unitarias porque, por su propia naturaleza, los algoritmos de aproximación pueden no dar la solución correcta. Actualmente resuelvo algunas instancias pequeñas a mano y luego me aseguro de que el resultado devuelto coincida con eso, pero esto no es deseable ni escalable en un sentido de implementación.
¿Cuál sería la mejor manera de probar los algoritmos de aproximación de prueba? ¿Genera instancias aleatorias y garantiza que los resultados devueltos sean inferiores al límite garantizado por el algoritmo? Eso parece tener falsos positivos (la prueba acaba de tener suerte ese momento, no se garantiza que todas las instancias estén por debajo del límite).
Si genera "instancias aleatorias" para problemas NP-completos, ¿cómo sabría la respuesta real para probar los límites? En mi humilde opinión todavía debe elegir cuidadosamente sus casos de prueba. Elija casos que pueda, como ser humano, detectar la respuesta real, pero que pueden o no ser difíciles para, o al menos ejercer, el algoritmo de aproximación. Dichos casos aún se pueden generar programáticamente para que sean lo suficientemente grandes como para ser realistas. Simplemente no deberían ser _aleatorias_. –
Ampliando el comentario de @Ray Toal, hay algunos tipos de problemas difíciles que son fáciles si generó el problema; Por ejemplo, el factoring * pq * es difícil, a menos que ya conozca * p * y * q * porque los generó. ¿Se puede aplicar un principio similar a sus problemas de gráfico/red? –
+1 Tom es exactamente lo que quiero decir generando casos conocidos mediante programación. Estoy un poco indeciso para agregar una respuesta en este momento porque no soy una autoridad en esta área; quizás alguien puede venir y tener experiencia aquí. Solo estaba tratando de poner una bandera roja alrededor de la palabra "aleatorio". –