Durante il test di n articoli, come coprire tutti i sottoinsiemi di T con il minor numero possibile di sottoinsiemi?


10

Questo problema è nato dai test del software. Il problema è un po 'difficile da spiegare. Prima farò un esempio, quindi proverò a generalizzare il problema.

Esistono 10 articoli da testare, ad esempio da A a J, e uno strumento di test in grado di testare 3 articoli contemporaneamente. L'ordine degli articoli nello strumento di test non ha importanza. Naturalmente, per test esaustivi, abbiamo bisogno di combinazioni di elementi.10C3

Il problema è più complesso Vi è una condizione aggiuntiva che una volta che una coppia di articoli sia stata testata insieme, che la stessa coppia non debba essere testata di nuovo.

Ad esempio, una volta eseguiti i seguenti tre test:

ABC

ADE

BDF

non dobbiamo eseguire:

ABD

poiché la coppia A, B era coperta dal primo caso di test, A, D era coperta dal secondo e B, D era coperta dal terzo.

Quindi il problema è: qual è il numero minimo di casi di test di cui abbiamo bisogno per garantire che tutte le coppie siano testate?

Per generalizzare, se abbiamo n articoli, s possono essere testati contemporaneamente e dobbiamo assicurarci che tutte le possibili tuple siano testate (tale che s> t), qual è il numero minimo di casi di test di cui abbiamo bisogno termini di n, s et?

E infine, quale sarebbe un buon algoritmo per generare i casi di test richiesti?


1
I casi in cui il test è "ottimale" (ogni -tuple viene testata esattamente una volta) sono coperti dalla nozione di Block Design . Ci sono relativamente poche di queste possibilità di test perfette, quindi credo che occorra un'euristica aggiuntiva. t
Hendrik Jan

Il tuo paradigma di test è difettoso; potrebbe non essere sufficiente testare solo coppie. Alcuni errori possono verificarsi solo se tre (o più) componenti agiscono insieme in una combinazione specifica.
Raffaello

4
@Raphael, grazie per un titolo molto migliore, ma non riesco completamente a capire come si possa affermare che "il paradigma del test è difettoso" con una comprensione zero del problema reale o del contesto.
wookie919,

@ wookie919 Questo perché non darete ogni contesto ma pongono un generale problema. Ho semplicemente osservato che, in generale, potrebbe essere necessario testare tutte le combinazioni che possono verificarsi (in azione).
Raffaello

Risposte:


11

I progetti di blocchi desiderati (per testare 3 cose alla volta e coprire tutte le coppie) sono chiamati sistemi tripli Steiner . Esiste un sistema triplo Steiner con triple ogni volta che mod , e sono noti algoritmi per costruirli. Vedi, ad esempio, questa domanda di MathOverflow (con un collegamento al codice Sage funzionante!). Per altri , è possibile arrotondare alla successiva mod e utilizzare una modifica di questo triplo sistema per per coprire tutte le coppie per .13(n2)6 n n 1 o r 3 6 n nn1 or 36nn1 or 36nn

Se si desidera la migliore costruzione per altre , il numero di triple necessario è il numero di copertura e viene fornito da questa voce nell'enciclopedia on-line di sequenze di numeri interi. Questo si collega al Repository Covering di La Jolla che ha un deposito di buoni coverings. L'enciclopedia online delle sequenze di numeri interi fornisce una formula congetturata per ; se questa formula vale, intuitivamente ciò significa che probabilmente ci dovrebbero essere buoni modi algoritmici per costruire questi rivestimenti, ma poiché la formula è congetturata, è chiaro che nessuno attualmente li conosce.C ( n , 3 , 2 ) C ( n , 3 , 2 )n C(n,3,2)C(n,3,2)

Per numeri di copertura elevati, è più difficile trovare buoni rivestimenti rispetto a e il repository fornirà soluzioni migliori di qualsiasi algoritmo efficiente noto.C(n,3,2)


5

Forma il grafico non orientato cui ogni vertice è una coppia di elementi e dove c'è un bordo tra due vertici se condividono un elemento in comune. In altre parole, dove ed . Il grafico ha vertici e ogni vertice ha bordi incidenti su di esso.G = ( V , E ) V = { { a , b } : a , b Articoli a b } E = { ( s , t ) : s , t V | s t | = 1 } ( nGG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1} 2n-4(n2)2n4

Poi un approccio sarebbe quello di trovare un massimo corrispondente in . L'algoritmo di Edmonds può essere utilizzato per trovare tale corrispondenza massima nel tempo polinomiale. Se sei fortunato, questo ti darà una corrispondenza perfetta, e allora sei bravo. Ogni fronte nella corrispondenza corrisponde a un test case . Poiché ogni vertice è incidente con un bordo nella corrispondenza perfetta, hai coperto tutte le coppie, usando casi di test, che è all'interno di un fattore di ottimale. Se non si ottiene una corrispondenza perfetta, aggiungere alcuni altri casi di test in base alle esigenze per ottenere la copertura completa.( { A , B } , { B , C } ) E A B C ( nG({A,B},{B,C})EABC1.5(n2)/21.5


4

Nel caso di et devi eseguire almeno test, poiché ci sono coppie e ogni test copre 3 coppie. Ciò significa che puoi fare la cosa banale ed eseguire test ed essere solo un fattore 3 peggiore dell'ottimale.t = 2 ( ns=3t=2 ( n(n2)/3( n(n2)(n2)

Se lo stai effettivamente programmando, allora un modo per ottimizzarlo potrebbe essere prima selezionando alcuni test numerici a caso, quindi esegui la forza bruta sulle coppie non coperte dal test finora.


Per generali e , v'è un limite inferiore di test. Per un limite superiore sto affermando che è sufficiente per rendere test.t ( nst C ( n(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

Vediamo cosa succede scegliamo i test in modo uniforme a caso. Se scegli una tupla a caso, quindi per una tupla fissa , abbiamo . Pertanto, se scegliamo casualmente i test , allorasS[n]tX[n]Pr[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).

Pertanto, dal sindacato legato, dopo i test casuali tutte le -tuples saranno coperti.tO(t(ntst)tlog(n))t


La ringrazio molto per la risposta molto perspicace, ma stavo cercando un algoritmo esatto che generasse esattamente il numero inferiore di casi di test (se possibile) o qualcosa di molto vicino a il limite inferiore. (nt)/s
wookie919,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.