Podczas testowania n elementów, jak pokryć wszystkie podzbiory t przez jak najmniejszą liczbę podzbiorów s?

10

Ten problem powstał w wyniku testowania oprogramowania. Problem jest trochę trudny do wyjaśnienia. Najpierw podam przykład, a następnie spróbuję uogólnić problem.

Do przetestowania jest 10 elementów, od A do J, oraz narzędzie testujące, które może testować 3 elementy jednocześnie. Kolejność elementów w narzędziu testowym nie ma znaczenia. Oczywiście do wyczerpujących testów potrzebujemy 10 kombinacji przedmiotów w C 3 .10C3

Problem jest bardziej złożony. Istnieje dodatkowy warunek, że gdy para elementów zostanie przetestowana razem, ta sama para nie musi być ponownie testowana.

Na przykład po wykonaniu następujących trzech testów:

ABC

ADE

BDF

nie musimy wykonywać:

ABD

ponieważ para A, B była objęta pierwszym przypadkiem testowym, A, D była objęta drugim, a B, D była objęta trzecim.

Problem w tym, jaka jest minimalna liczba przypadków testowych, których potrzebujemy, aby zapewnić przetestowanie wszystkich par?

Aby uogólnić, jeśli mamy n elementów, s można przetestować w tym samym czasie i musimy upewnić się, że wszystkie możliwe t krotki są testowane (takie, że s> t), jaka jest minimalna liczba przypadków testowych, których potrzebujemy w warunki n, s i t?

I wreszcie, jaki byłby dobry algorytm do generowania wymaganych przypadków testowych?

wookie919
źródło
1
Przypadki były testem jest „optymalna” (co -tuple testuje dokładnie raz) są objęte pojęciem konstrukcja bloku . Istnieje stosunkowo niewiele z tych doskonałych możliwości testowych, więc chyba potrzebuję dodatkowej heurystyki. t
Hendrik,
Twój paradygmat testowy jest wadliwy; testowanie tylko par może być niewystarczające. Niektóre błędy mogą wystąpić tylko wtedy, gdy trzy (lub więcej) składniki działają razem w określonej kombinacji.
Raphael
4
@Raphael, dziękuję za znacznie lepszy tytuł, ale zupełnie nie rozumiem, jak możesz twierdzić, że „Twój testowy paradygmat jest wadliwy”, ponieważ nie rozumiem rzeczywistego problemu ani kontekstu.
wookie919,
@ wookie919 To dlatego, że nie dają żadnego kontekstu, ale stwarzają żadnego problemu. Zauważyłem jedynie, że generalnie może być konieczne przetestowanie wszystkich kombinacji, które mogą wystąpić (w działaniu).
Raphael

Odpowiedzi:

11

Projekty bloków, które chcesz (do testowania 3 rzeczy na raz i obejmujące wszystkie pary) są nazywane potrójnymi systemami Steiner . Istnieje potrójny system Steiner z trzykrotnie, gdyn1OR3mod6i algorytmy znane skonstruować nich. Zobacz na przykład topytanie MathOverflow(z linkiem do działającego kodu Sage!). Do innychN, można zaokrąglenie w górę do najbliższegon'1OR3mod6i użyć modyfikację tego potrójnego układu don"do pokrycia wszystkich parachn.13(n2)n1 or 36nn1 or 36nn

Jeśli chcesz uzyskać najlepszą konstrukcję dla innych , wymagana liczba trójek jest liczbą obejmującą C ( n , 3 , 2 ) i jest podana w tym wpisie w internetowej encyklopedii ciągów całkowitych. Ten link prowadzi do La Jolla Covering Repository, które ma repozytorium dobrych pokryć. Internetowa encyklopedia sekwencji całkowitych podaje domniemaną formułę dla C ( n , 3 , 2 )n C(n,3,2)C(n,3,2); jeśli ta formuła obowiązuje, intuicyjnie oznacza to, że prawdopodobnie powinny istnieć dobre algorytmiczne sposoby konstruowania tych osłon, ale skoro formuła jest domniemana, jasne jest, że nikt ich obecnie nie zna.

W przypadku wysokich liczb pokrycia trudniej jest znaleźć dobre pokrycia niż dla , a repozytorium da lepsze rozwiązania niż jakikolwiek znany skuteczny algorytm.C(n,3,2)

Peter Shor
źródło
5

Utwórz niekierowany wykres którym każdy wierzchołek jest parą elementów, a między dwoma wierzchołkami znajduje się krawędź, jeśli mają one wspólny element. Innymi słowy, G = ( V , E ) gdzie V = { { a , b } : a , b Pozycje a b } i E = { ( s , t ) : s , t V | sGG=(V,E)V={{a,b}:a,bItemsab} . Wykres ma ( nE={(s,t):s,tV|st|=1} wierzchołki, a każdy wierzchołek ma na sobie2n-4krawędzie.(n2)2n4

Potem jedno podejście byłoby znaleźć pasujący Maksimum w . Algorytmu Edmondsa można użyć do znalezienia takiego maksymalnego dopasowania w czasie wielomianowym. Jeśli masz szczęście, da ci to idealne dopasowanie, a potem będziesz dobry. Każda krawędź ( { , B } , { B , C } ) E na odpowiada dopasowujący się do testu B C . Ponieważ każdy wierzchołek pada z jedną krawędzią w idealnym dopasowaniu, pokryłeś wszystkie pary, używając ( nG({A,B},{B,C})EABCprzypadków testowych, co mieści się w zakresie1,5optymalnego. Jeśli nie uzyskasz idealnego dopasowania, dodaj kilka kolejnych przypadków testowych, aby uzyskać pełne pokrycie.(n2)/21.5

DW
źródło
4

W przypadku i t = 2 trzeba przeprowadzić co najmniej ( Ns=3t=2testy, ponieważ istnieją ( n(n2)/3 pary, a każdy test obejmuje 3 pary. Oznacza to, że możesz zrobić trywialną rzecz i wykonać ( n(n2) testy i być tylko 3 razy gorsze niż optymalne.(n2)

Jeśli faktycznie to programujesz, to sposobem na zoptymalizowanie tego może być wybranie losowo kilku testów liczbowych, a następnie użycie brutalnej siły na parach nieobjętych dotychczas testem.


Dla ogólnych i t istnieje dolna granica ( nst testy. Twierdzę, że dla górnej granicy wystarczy, abyC ( n(nt)/(st)testy.C(nt)(st)log((nt))O(t(ntst)tlog(n))

Zobaczmy, co się stanie, wybieramy testy równomiernie losowo. Jeśli losowo wybierzesz -pleple S [ n ] , to dla stałej t -pleple X [ n ] mamy Pr [ X S ] = ( n - tsS[n]tX[n] . Dlatego jeśli wybierzemyC(nPr[XS]=(ntst)(ns)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).

Therefore, by the union bound, after O(t(ntst)tlog(n)) random tests all t-tuples will be covered.

Igor Shinkar
źródło
Thank you very much for the very insightful answer, but I was looking for an exact algorithm that would generate exactly the (nt)/s lower bound number of test cases (if that is even possible), or something very close to the lower bound.
wookie919