В настоящее время я реализую алгоритм оптимизации, который требует от меня выборки без замены из нескольких наборов. Хотя я кодирую в 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, который может выплевывать один из элементов этого набора (то есть функция P_A (u), которая при u = 0,25, будет выберите 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 ). Еще одна досадная деталь заключается в том, что алгоритм, с которым я работаю, требует от меня выполнения оценки функций для всех перестановок элементов, которые я не выбрал.
Лучший метод в моем распоряжении прямо сейчас - отслеживать отобранные случаи. Это немного неэффективно, так как мой сэмплер вынужден отклонить любой случай, который был отобран ранее (так как я беру выборку без замены). Затем я выполняю оценку функции для несэмплированных случаев, просматривая каждую перестановку ( ax, by, cz ), используя вложенные циклы for, и выполняя оценку функции, только если эта комбинация ( ax, by , cz ) в выборочные случаи не входит. Опять же, это немного неэффективно, так как я должен «проверить», была ли каждая перестановка ( ax, by, cz ) уже выбрана.
Буду признателен за любые советы относительно этой проблемы. В частности, я ищу способ выборки без замены и , чтобы отслеживать случаи несэмплирования, которые не раскрывают подробно все пространство выборки (обычно я работаю с 10 комплектами по 10 элементов в каждом, поэтому перечисляю полный набор пробное пространство потребовало бы матрицы 10 ^ 10 x 10). Я понимаю, что это может быть невозможно, хотя, найдя эффективный способ сделать это, я смогу продемонстрировать истинные ограничения алгоритма.