Lors du test de n éléments, comment couvrir tous les sous-ensembles t avec le moins de sous-ensembles s possible?

10

Ce problème est né des tests de logiciels. Le problème est un peu difficile à expliquer. Je vais d'abord donner un exemple, puis essayer de généraliser le problème.

Il y a 10 éléments à tester, disons de A à J, et un outil de test qui peut tester 3 éléments en même temps. L'ordre des éléments dans l'outil de test n'a pas d'importance. Bien sûr, pour des tests exhaustifs, nous avons besoin de combinaisons d'éléments.10C3

Le problème est plus complexe. Il y a une condition supplémentaire qu'une fois qu'une paire d'articles a été testée ensemble, la même paire n'a pas besoin d'être testée à nouveau.

Par exemple, une fois que nous avons exécuté les trois tests suivants:

abc

ADE

BDF

nous n'avons pas à exécuter:

ABD

parce que la paire A, B était couverte par le premier cas de test, A, D était couverte par le second, et B, D était couverte par le troisième.

Donc, le problème est, quel est le nombre minimum de cas de test dont nous avons besoin pour nous assurer que toutes les paires sont testées?

Pour généraliser, si nous avons n éléments, s peut être testé en même temps, et nous devons nous assurer que tous les tuples possibles sont testés (tels que s> t), quel est le nombre minimum de cas de test dont nous avons besoin dans termes de n, s et t?

Et enfin, quel serait un bon algorithme pour générer les cas de test requis?

wookie919
la source
1
Les cas où le test est "optimal" (chaque tuple est testé exactement une fois) sont couverts par la notion de Block Design . Il y a relativement peu de ces possibilités de test parfaites, donc on a besoin d'heuristiques supplémentaires, je suppose. t
Hendrik Jan
Votre paradigme de test est défectueux; il peut ne pas être suffisant de tester uniquement des paires. Certaines erreurs ne peuvent se produire que si trois composants (ou plus) agissent ensemble dans une combinaison spécifique.
Raphael
4
@Raphael, merci pour un titre bien meilleur, mais je n'arrive pas à comprendre comment vous pouvez affirmer que "votre paradigme de test est défectueux" avec une compréhension zéro du problème réel ou du contexte.
wookie919
@ wookie919 C'est parce que vous ne donnez aucun contexte mais posez un problème général . J'ai simplement observé qu'en général, vous pourriez avoir besoin de tester toutes les combinaisons qui peuvent se produire (en action).
Raphael

Réponses:

11

Les conceptions de blocs que vous souhaitez (pour tester 3 choses à la fois et couvrir toutes les paires) sont appelées systèmes triples Steiner . Il existe un triple système de Steiner avec triples chaque fois que mod , et des algorithmes sont connus pour les construire. Voir, par exemple, cette question MathOverflow (avec un lien vers le code Sage fonctionnel!). Pour les autres , vous pouvez arrondir au mod , et utiliser une modification de ce triple système pour pour couvrir toutes les paires pour . n1or36nn'1or36n'n13(n2)n1 or 36nn1 or 36nn

Si vous voulez la meilleure construction pour les autres , le nombre de triplets requis est le nombre de couverture , et est donné par cette entrée dans l'encyclopédie en ligne des séquences entières. Ce lien vers le référentiel de couverture de La Jolla qui a un référentiel de bonnes couvertures. L'encyclopédie en ligne des séquences entières donne une formule conjecturée pour ; si cette formule tient, intuitivement, cela signifie qu'il devrait probablement y avoir de bonnes façons algorithmiques de construire ces revêtements, mais puisque la formule est conjecturée, il est clair que personne ne les connaît actuellement.C ( n , 3 , 2 ) C ( n , 3 , 2 )n C(n,3,2)C(n,3,2)

Pour des nombres de couverture élevés, de bonnes couvertures sont plus difficiles à trouver que pour , et le référentiel donnera de meilleures solutions que tout algorithme efficace connu.C(n,3,2)

Peter Shor
la source
5

Formez le graphe non orienté où chaque sommet est une paire d'éléments et où il y a un bord entre deux sommets s'ils partagent un élément en commun. En d'autres termes, où et . Le graphe a sommets, et chaque sommet a arêtes incidentes.G = ( V , E ) V = { { a , b } : a , b Articles a b }GG=(V,E)V={{a,b}:a,bItemsab}( nE={(s,t):s,tV|st|=1} 2n-4(n2)2n4

Ensuite , une approche serait de trouver une correspondance maximum dans . L'algorithme d'Edmonds peut être utilisé pour trouver une telle correspondance maximale en temps polynomial. Si vous êtes chanceux, cela vous donnera une correspondance parfaite, et alors vous êtes bon. Chaque arête dans la correspondance correspond à un cas de test . Étant donné que chaque sommet est incident avec une arête dans la correspondance parfaite, vous avez couvert toutes les paires, en utilisant cas de test, ce qui est dans un facteur optimal. Si vous n'obtenez pas une correspondance parfaite, ajoutez quelques cas de test supplémentaires au besoin pour obtenir une couverture complète.( { A , B } , { B , C } ) E A B C ( nG({A,B},{B,C})EABC1,5(n2)/21.5

DW
la source
4

Dans le cas de et vous devez effectuer au moins tests, car il y a paires et chaque test couvre 3 paires. Cela signifie que vous pouvez faire la chose triviale et effectuer des tests , et n'être qu'un facteur de 3 pire que l'optimum.t = 2 ( ns=3t=2 ( n(n2)/3( n(n2)(n2)

Si vous programmez réellement cela, alors un moyen d'optimiser cela pourrait être de choisir d'abord quelques tests numériques au hasard, puis de faire la force brute sur les paires non couvertes par le test jusqu'à présent.


Pour et , il existe une borne inférieure des tests . Pour une limite supérieure, je prétends que cela suffit pour faire tests.t ( nst C ( n(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

Voyons ce qui se passe, nous choisissons les tests uniformément au hasard. Si vous choisissez un -tuple au hasard, puis pour un -uple fixe , nous avons . Par conséquent, si nous choisissons tests au hasard, alorsS [ n ] t X [ n ] Pr [sS[n]tX[n]Pr[XS]=(ntst)(ns)Pr[X n'appartient à aucun d'eux]=C(nt)log((nt))

Pr[X does not belong to any of them]=(1(ntst)(ns))C(nt)log((nt))exp(C(ntst)(nt)(ns)(st)log((nt)))=exp(Clog(nt))1/(nt).

Par conséquent, par l'union liée, après tests aléatoires, tous les -uplets seront couverts.tO(t(ntst)tlog(n))t

Igor Shinkar
la source
Merci beaucoup pour la réponse très perspicace, mais je cherchais un algorithme exact qui générerait exactement le nombre de cas de test (si c'est même possible), ou quelque chose de très proche de la borne inférieure. (nt)/s
wookie919