n個の項目をテストするとき、すべてのtサブセットを可能な限り少数のsサブセットでカバーするにはどうすればよいですか?


10

この問題は、ソフトウェアのテストから発生しました。問題を説明するのは少し難しいです。最初に例を示し、次に問題を一般化してみます。

AからJまでの10項目のテストがあり、同時に3項目をテストできるテストツールがあります。テストツール内のアイテムの順序は関係ありません。もちろん、徹底的なテストを行うには、アイテムの組み合わせが必要です。10C3

問題はより複雑です。追加の条件として、1組のアイテムを一緒にテストすると、同じペアを再度テストする必要がなくなるという条件があります。

たとえば、次の3つのテストを実行するとします。

ABC

ADE

BDF

実行する必要はありません:

ABD

ペアA、Bは最初のテストケースでカバーされ、A、Dは2番目のテストケースでカバーされ、B、Dは3番目のテストケースでカバーされたためです。

それで問題は、すべてのペアがテストされることを保証するために必要なテストケースの最小数は何ですか?

一般化するために、n個のアイテムがある場合、sを同時にテストでき、可能なすべてのtタプル(s> tなど)をテストする必要があります。これは、必要なテストケースの最小数です。 n、s、tの項?

そして最後に、必要なテストケースを生成するための良いアルゴリズムは何でしょうか?


1
テストが "最適"である(すべてのタプルが1回だけテストされる)場合は、ブロック設計の概念でカバーされます。これらの完璧なテストの可能性は比較的少ないため、追加のヒューリスティックが必要になると思います。t
Hendrik Jan

テストのパラダイムに欠陥があります。ペアのみをテストするだけでは不十分な場合があります。一部のエラーは、3つ(またはそれ以上)のコンポーネントが特定の組み合わせで一緒に動作する場合にのみ発生することがあります。
ラファエル

4
@Raphael、より良いタイトルに感謝しますが、実際の問題やコンテキストをまったく理解せずに、「テストパラダイムに欠陥がある」と主張する方法を完全に理解することはできません。
wookie919 2013

@ wookie919それはあなたがどんなコンテキストも与えないが一般的な問題を提起するからです。私は単に、一般的に、(実際に)発生する可能性のあるすべての組み合わせをテストする必要があるかもしれないことを観察しました。
ラファエル

回答:


11

必要なブロック設計(一度に3つのものをテストし、すべてのペアをカバーするため)は、Steiner triple systemsと呼ばれます。 mod場合は常にトリプルを持つSteinerトリプルシステムが存在し、アルゴリズムがこれらを構築することが知られています。たとえば、このMathOverflowの質問(動作中のSageコードへのリンクを含む)を参照してください。他のためは、次に切り上げることができ MOD、及びこのトリプルシステムの変形例を使用のすべての対を覆うように。13(n2)6 N 、N '1 O 、R 3 6 N '、Nn1 or 36nn1 or 36nn

他の最適な構成が必要な場合、必要なトリプルの数はカバーする数であり、整数シーケンスのオンラインエンサイクロペディアのこのエントリで指定されます。これは、適切な被覆のリポジトリがあるLa Jolla Covering Repositoryにリンクしています。整数シーケンスのオンライン百科事典は、推測式を提供します。この式が成り立つ場合、直感的には、これらのカバーを構築するためのアルゴリズム的な方法がおそらく適切であることを意味しますが、式は推測されるので、誰も現在それらを知らないことは明らかです。n C nは3 2 C(n,3,2)C(n,3,2)

カバリング数が多い場合、よりも適切なカバリングを見つけるのは難しく、リポジトリは既知の効率的なアルゴリズムよりも優れたソリューションを提供します。C(n,3,2)


5

無向グラフ形成します。ここで、各頂点はアイテムのペアであり、2つの頂点がアイテムを共有している場合は、それらの頂点間にエッジがあります。つまり、 whereおよび。グラフには個の頂点があり、すべての頂点にはエッジがあります。GG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1}(n2)2n4

次に、最大の一致を見つける方法があります。エドモンズのアルゴリズムは、多項式時間でこのような最大の一致を見つけるために使用できます。運が良ければ、これで完璧なマッチングが得られます。マッチングの各エッジは、テストケース対応します。すべての頂点が完全な一致で1つのエッジで発生するため、テストケースを使用してすべてのペアをカバーしました。これは倍の最適係数内です。完全に一致しない場合は、必要に応じてテストケースをいくつか追加して、完全なカバレッジを達成します。G({A,B},{B,C})EABC(n2)/21.5


4

以下の場合には及び、あなたは、少なくとも実行する必要があるがあるので、テストをペアとすべてのテストカバー3対。つまり、ささいなことを実行してテストを実行、最適値よりも3倍悪いだけです。s=3t=2(n2)/3(n2)(n2)

これを実際にプログラミングしている場合、これを最適化する方法は、最初にいくつかの数のテストをランダムに選択してから、これまでテストでカバーされていなかったペアにブルートフォースを実行することです。


一般的なおよび場合、テストの下限があり。上限については、にするのに十分であることを主張していテスト。st(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

我々は、我々はあなたが選ぶrandom.Ifで均一にテストを選択し、何が起こるか見てみましょうタプルランダムに、その後、固定用のタプル、我々が持っている。したがって、テストをランダムにと、sS[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).

したがって、ユニオンバウンドにより、ランダムテストの後、すべてのタプルがカバーされます。O(t(ntst)tlog(n))t


非常に洞察に満ちた回答をありがとうございましたが、下限のテストケースを正確に生成できる正確なアルゴリズム(それが可能な場合でも)または非常に近いものを探していました下限。(nt)/s
wookie919 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.