Saat menguji n item, bagaimana cara menutupi semua t-subset dengan sesedikit mungkin s-subset?


10

Masalah ini muncul dari pengujian perangkat lunak. Masalahnya agak sulit dijelaskan. Pertama saya akan memberikan contoh, kemudian mencoba untuk menggeneralisasi masalah.

Ada 10 item yang akan diuji, katakan A ke J, dan alat pengujian yang dapat menguji 3 item sekaligus. Urutan item dalam alat pengujian tidak masalah. Tentu saja, untuk pengujian menyeluruh, kami membutuhkan kombinasi item.10C3

Masalahnya lebih kompleks. Ada kondisi tambahan bahwa sekali sepasang barang telah diuji bersama, maka pasangan yang sama tidak perlu diuji lagi.

Misalnya, setelah kami melakukan tiga tes berikut:

ABC

ADE

BDF

kita tidak harus mengeksekusi:

ABD

karena pasangan A, B ditutupi oleh kasus uji pertama, A, D ditutupi oleh yang kedua, dan B, D ditutupi oleh yang ketiga.

Jadi masalahnya adalah, berapa jumlah minimum kasus uji yang perlu kita pastikan bahwa semua pasangan diuji?

Untuk menggeneralisasi, jika kita memiliki n item, s dapat diuji pada saat yang sama, dan kita perlu memastikan bahwa semua t tupel yang mungkin diuji (seperti s> t), berapa jumlah minimum kasus uji yang kita butuhkan dalam syarat n, s dan t?

Dan akhirnya, apa algoritma yang baik untuk menghasilkan kasus uji yang diperlukan?


1
Kasing yang pengujiannya "optimal" (setiap tuple diuji tepat satu kali) dicakup oleh gagasan Block Design . Ada beberapa kemungkinan tes sempurna ini, jadi kita perlu heuristik tambahan, kurasa. t
Hendrik Jan

Paradigma tes Anda salah; mungkin tidak cukup hanya menguji pasangan. Beberapa kesalahan hanya dapat terjadi jika tiga (atau lebih) komponen bekerja bersama dalam kombinasi tertentu.
Raphael

4
@ Raphael, terima kasih untuk judul yang jauh lebih baik, tetapi saya benar-benar gagal memahami bagaimana Anda dapat mengklaim "paradigma pengujian Anda salah" dengan tidak memiliki pemahaman tentang masalah aktual atau konteksnya.
wookie919

@ wookie919 Itu karena Anda tidak memberikan konteks apa pun tetapi menimbulkan masalah umum . Saya hanya mengamati bahwa, secara umum, Anda mungkin perlu menguji semua kombinasi yang dapat terjadi (beraksi).
Raphael

Jawaban:


11

Desain blok yang Anda inginkan (untuk menguji 3 hal sekaligus, dan mencakup semua pasangan) disebut sistem triple Steiner . Ada sistem triple Steiner dengan tiga kali lipat setiap kali mod , dan algoritma dikenal untuk membangun ini. Lihat, misalnya, pertanyaan MathOverflow ini (dengan tautan ke kode Sage yang berfungsi!). Untuk lain , Anda dapat membulatkan ke mod , dan menggunakan modifikasi sistem triple ini untuk untuk mencakup semua pasangan untuk .13(n2)n1 or 36nn1 or 36nn

Jika Anda menginginkan konstruksi terbaik untuk lain , jumlah tiga kali lipat yang diperlukan adalah yang mencakup nomor , dan diberikan oleh entri ini dalam ensiklopedia online urutan bilangan bulat. Tautan ini ke La Jolla Covering Repository yang memiliki repositori yang bagus. Ensiklopedia online urutan bilangan bulat memberikan rumus dugaan untuk ; jika rumus ini berlaku, secara intuitif itu berarti mungkin ada cara algoritmik yang baik untuk membangun penutup ini, tetapi karena rumus ini terkira, jelas bahwa tidak ada yang tahu saat ini.n C(n,3,2)C(n,3,2)

Untuk angka penutup yang tinggi, penutup yang baik lebih sulit ditemukan daripada untuk , dan repositori akan memberikan solusi yang lebih baik daripada algoritma efisien yang dikenal.C(n,3,2)


5

Bentuk grafik tidak berarah di mana setiap simpul adalah sepasang item, dan di mana ada tepi antara dua simpul jika mereka berbagi item yang sama. Dengan kata lain, mana dan . Grafik memiliki simpul , dan setiap simpul memiliki insiden tepi .GG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1}(n2)2n4

Maka salah satu pendekatan akan menemukan matching maksimum di . Algoritma Edmonds dapat digunakan untuk menemukan pencocokan maksimum dalam waktu polinomial. Jika Anda beruntung, ini akan memberi Anda pencocokan sempurna, dan kemudian Anda baik. Setiap tepi dalam pencocokan berhubungan dengan kasus uji . Karena setiap titik adalah kejadian dengan satu sisi dalam pencocokan sempurna, Anda telah mencakup semua pasangan, menggunakan test case, yang berada dalam faktor optimal. Jika Anda tidak mendapatkan kecocokan yang sempurna, tambahkan beberapa test case lagi sesuai kebutuhan untuk mencapai cakupan penuh.G({A,B},{B,C})EABC(n2)/21.5


4

Dalam kasus dan Anda harus melakukan setidaknya tes, karena ada pasangan dan setiap tes mencakup 3 pasang. Itu berarti bahwa Anda dapat melakukan hal-hal sepele dan melakukan tes , dan hanya menjadi faktor 3 lebih buruk daripada yang optimal.s=3t=2(n2)/3(n2)(n2)

Jika Anda benar-benar memprogram ini, maka cara untuk mengoptimalkan ini bisa dengan terlebih dahulu memilih beberapa tes angka secara acak, dan kemudian lakukan brute force pada pasangan yang tidak tercakup oleh tes sejauh ini.


Untuk umum dan , ada batas yang lebih rendah dari tes . Untuk batas atas, saya mengklaim sudah cukup untuk membuat menguji.st(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

Mari kita lihat apa yang terjadi, kita memilih tes secara acak. Jika Anda memilih -tuple secara acak, maka untuk tetap -tuple , kita memiliki . Karenanya, jika kita memilih tes secara acak, makasS[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).

Oleh karena itu, dengan ikatan terikat, setelah tes acak semua -tupel akan dibahas.O(t(ntst)tlog(n))t


Terima kasih banyak untuk jawaban yang sangat mendalam, tetapi saya sedang mencari algoritma yang tepat yang akan menghasilkan jumlah kasus uji yang lebih rendah (jika itu mungkin), atau sesuatu yang sangat dekat dengan batas bawah. (nt)/s
wookie919
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.