私は現在、いくつかのセットから置き換えることなくサンプリングする必要がある最適化アルゴリズムを実装しています。私はMATLABでコーディングしていますが、これは本質的にCSの質問です。
状況は次のとおりです。
有限数のセット(A、B、C)があり、それぞれに有限ですが、おそらく異なる数の要素(a1、a2 ... a8、b1、b2 ... b10、c1、c2 ... c25)があります。また、各セットの確率のベクトルがあり、そのセット内の各要素の確率がリストされています(つまり、セットAの場合、P_A = [p_a1 p_a2 ... p_a8]ここで、sum(P_A)= 1)。私は通常、これらを使用して各セットの確率母関数を作成します。これは、0から1までの均一な数が与えられると、そのセットから要素の1つを吐き出すことができます(つまり、u = 0.25が与えられる関数P_A(u)はa2を選択します)。
セットA、B、 Cから交換せずにサンプリングしたいと思っています。各「完全なサンプル」は、異なるセット(a1、b3、c2)のそれぞれからの要素のシーケンスです。完全なサンプルのスペースは、 A、B、およびCの要素のすべての順列のセットであることに注意してください。上記の例では、このスペースは(a1、a2 ... a8)x(b1、b2 ... b10)x(c1、c2 ... c25)であり、8 * 10 * 25=2000の一意の「フル」があります。私のスペースのサンプル」。
この設定で置き換えずにサンプリングすることの厄介な部分は、最初のサンプルが(a1、b3、c2)の場合、要素a1を再度サンプリングできないことを意味するのではなく、完全なシーケンス(a1、 b3、c2)再び。もう1つの厄介な部分は、私が使用しているアルゴリズムでは、サンプリングしていない要素のすべての順列に対して関数評価を行う必要があることです。
私が今自由に使える最善の方法は、サンプリングされたケースを追跡することです。私のサンプラーは以前にサンプリングされたすべてのケースを拒否することを余儀なくされているため、これは少し非効率的です(私は交換なしでサンプリングしているため)。次に、ネストされたforループを使用して各順列(ax、by、cz )を調べ、( ax、by、cz)の組み合わせがサンプリングに含まれていない場合にのみ関数評価を行うことにより、サンプリングされていないケースの関数評価を行います。ケース。繰り返しますが、各順列( ax、by、cz)がすでにサンプリングされているかどうかを「チェック」する必要があるため、これは少し非効率的です。
この問題に関して何かアドバイスをいただければ幸いです。特に、置換せずにサンプリングし、完全なサンプル空間を明示的にリストしない非サンプリングのケースを追跡する方法を探しています(私は通常、それぞれ10個の要素を持つ10セットで作業するため、完全なサンプル空間をリストするには10が必要です^ 10 x 10マトリックス)。これは不可能かもしれませんが、効率的な方法を見つけることで、アルゴリズムの真の限界を示すことができます。