У меня есть набор из n действительных чисел. У меня также есть набор функций,
f_1, f_2, ..., f_m.
Каждая из этих функций принимает список чисел в качестве аргумента. У меня также есть набор м диапазонов,
[l_1, u_1], [l_2, u_2], ..., [l_m, u_m].
Я хочу несколько раз выбрать подмножество {r_1, r_2, ..., r_k} из k элементов так, чтобы
l_i <= f_i({r_1, r_2, ..., r_k}) <= u_i for 1 <= i <= m.
Обратите внимание, что функции гладкие. Изменение одного элемента в {r_1, r_2, ..., r_k} не сильно изменит f_i ({r_1, r_2, ..., r_k}). среднее и дисперсия - это два f_i, которые обычно используются.
Это те ограничения, которые мне нужно выполнить.
Более того, я хочу сделать это так, чтобы выбранный мной набор подмножеств равномерно распределялся по набору всех подмножеств размера k, которые удовлетворяют этим m ограничениям. Не только это, но я хочу сделать это эффективно. Как быстро он будет выполняться, будет зависеть от плотности решений в пространстве всех возможных решений (если это 0,0, то алгоритм может работать вечно). (Предположим, что f_i (для любого i) может быть вычислено за постоянное количество времени.)
Обратите внимание, что n достаточно велико, чтобы я не смог решить проблему. То есть я не могу просто перебрать все подмножества k-элементов и найти, какие из них удовлетворяют ограничениям m.
Есть ли способ сделать это?
Какие методы обычно используются для CSP, подобного этому? Может ли кто-нибудь указать мне направление на хорошие книги или статьи, в которых говорится о подобных проблемах (не только о CSP в целом, но и о CSP с непрерывным, а не дискретным значением)?