Escribí un algoritmo para encontrar una solución al problema de la suma de subconjuntos en Haskell. La firma esControlar cómo se generan los datos de prueba en QuickCheck
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheck parece ser una buena opción para probar eso. Por ejemplo, aquí I es una de las propiedades que pude comprobar:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
El problema es que el algoritmo es muy computacionalmente intensivas y en funcionamiento 100 pruebas con grandes listas de entrada lleva años para correr.
Intenté con QuickCheck 1 y se ejecutó rápidamente, pero los conjuntos de datos utilizados para las pruebas fueron muy pequeños. Después de pasar a QuickCheck 2, parece ser el problema opuesto. Hay un a manual para QC, pero parece ser antiguo (no hay información de fecha) y no sé cuánto se aplica todavía a QC2. A Tutorial está disponible en Haskell Wiki pero no hay muchos detalles, solo unas pocas palabras sobre la instanciación de Arbitrary
.
así que tengo dos preguntas:
- ¿Qué cambios en QuickCheck 2 que sea convertido en mucho más lento que QuickCheck?
- ¿Cuál es la mejor manera de controlar la creación de conjuntos de datos para que sean útiles para una prueba determinada?
Editar: Para ser más específicos, me gustaría probar mi solución con un tamaño de la lista de 0 a 100, que contiene números enteros entre -10000 y 10000.
Sus preguntas parece un poco vago para el contexto de QuickCheck; quizás sería mejor que hicieras una pregunta de prueba general en su lugar. Sin embargo, hay algunos problemas con su enfoque actual: no verificará que la solución sea en realidad un subconjunto, o que si la función devuelve Nada, entonces, de hecho, no hay solución. – gatoatigrado
@gatoatigrado La propiedad fue solo un ejemplo. Creo que verificar que la solución sea un subconjunto pertenece a otra propiedad. ¿Me equivoco? No veo una manera fácil de verificar que cuando se devuelve Nothing, de hecho no haya solución, excepto al resolver el problema nuevamente con otro algoritmo. Esto parece un poco redundante. – Antoine
http://stackoverflow.com/questions/10712373/cookbook-for-converting-from-quickcheck1-to-quickcheck2 – gliptak