Este problema surgió de las pruebas de software. El problema es un poco difícil de explicar. Primero daré un ejemplo, luego trataré de generalizar el problema.
Hay 10 elementos para probar, digamos A a J, y una herramienta de prueba que puede probar 3 elementos al mismo tiempo. El orden de los elementos en la herramienta de prueba no importa. Por supuesto, para pruebas exhaustivas, necesitamos 10 combinaciones de elementos C 3 .
El problema es más complejo. Existe una condición adicional de que una vez que se ha probado un par de elementos juntos, no es necesario volver a probar el mismo par.
Por ejemplo, una vez que ejecutamos las siguientes tres pruebas:
A B C
ADE
BDF
no tenemos que ejecutar:
ABD
porque el par A, B estaba cubierto por el primer caso de prueba, A, D estaba cubierto por el segundo, y B, D estaba cubierto por el tercero.
Entonces, el problema es, ¿cuál es el número mínimo de casos de prueba que necesitamos para garantizar que se prueben todos los pares?
Para generalizar, si tenemos n ítems, s pueden ser probados al mismo tiempo, y debemos asegurarnos de que se prueben todas las tuplas posibles (tal que s> t), ¿cuál es el número mínimo de casos de prueba que necesitamos en términos de n, syt?
Y finalmente, ¿cuál sería un buen algoritmo para generar los casos de prueba requeridos?
fuente
Respuestas:
Los diseños de bloques que desea (para probar 3 cosas a la vez y cubrir todos los pares) se denominan sistemas triples Steiner . Existe un sistema triple Steiner con triplica siempre quen≡1or3mod6, y se sabe que los algoritmos construyen estos. Consulte, por ejemplo, estapregunta de MathOverflow(con un enlace al código de Sage que funciona). Para otrosn, podría redondear al siguienten′≡1or3mod6, y utilizar una modificación de este sistema triple paran′para cubrir todos los pares paran.13( n2) n ≡ 1 o r 3 6 6 norte norte′≡ 1 o r 3 6 6 norte′ norte
Si desea la mejor construcción para otro , el número de triples requerido es el número de cobertura C ( n , 3 , 2 ) , y viene dado por esta entrada en la enciclopedia en línea de secuencias enteras. Esto enlaza con el repositorio de cobertura de La Jolla, que tiene un repositorio de buenas coberturas. La enciclopedia en línea de secuencias enteras proporciona una fórmula conjeturada para C ( n , 3 , 2 )norte C( n , 3 , 2 ) C( n , 3 , 2 ) ; Si esta fórmula es válida, intuitivamente eso significa que probablemente debería haber buenas formas algorítmicas de construir estos revestimientos, pero dado que la fórmula es conjeturada, está claro que nadie los conoce actualmente.
Para números de cobertura altos, es difícil encontrar buenas cubiertas que para , y el repositorio dará mejores soluciones que cualquier algoritmo eficiente conocido.C( n , 3 , 2 )
fuente
fuente
Si realmente está programando esto, entonces una forma de optimizar esto podría ser seleccionando primero algunas pruebas de números al azar, y luego haciendo la fuerza bruta en los pares no cubiertos por la prueba hasta ahora.
fuente