Мне нужно создать случайные векторы действительных чисел a_i, удовлетворяющие следующим ограничениям:
abs(a_i) < c_i;
sum(a_i)< A; # sum of elements smaller than A
sum(b_i * a_i) < B; # weighted sum is smaller than B
aT*A*a < D # quadratic multiplication with A smaller than D
where c_i, b_i, A, B, D are constants.
Какой будет типичный алгоритм для эффективной генерации такого вектора?
random-generation
LouisChiffre
источник
источник
a_i
следует за распределениемp_i
и также меньшеc
? Это потому что раздачаp_i
тоже меньше тогоc
? В каком дистрибутиве вы думаете?c
,A
,B
и лямбды фиксированной?Ответы:
Если я вас правильно понимаю, только точки в небольшом объеме n-мерного пространства соответствуют вашим ограничениям.
Ваше первое ограничение ограничивает его внутреннюю часть гиперсферы, что напоминает мне часто задаваемые вопросы о comp.graphics.algorithms «Однородные случайные точки на сфере» и Как генерировать равномерно распределенные точки в 3-мерном единичном шаре? Второе ограничение немного выделяется из гиперсферы, а другие ограничения еще больше сокращают объем, соответствующий вашим ограничениям.
Я думаю, что самое простое, что можно сделать, это один из подходов, предложенных в FAQ:
С достаточно качественным генератором случайных чисел это дает вам набор сохраненных координат, которые соответствуют вашим критериям с (ожидаемой) равномерной плотностью.
Увы, если у вас относительно высокая размерность n (т. Е. Если вы строите каждый вектор из относительно длинного списка координат), вписанная сфера (а тем более уменьшенный объем) имеет удивительно небольшую часть общего объема общая ограничивающая рамка, поэтому может потребоваться выполнить много итераций, большинство из которых генерируют отклоненные точки за пределами вашей ограниченной области, прежде чем найти точку внутри вашей ограниченной области. Поскольку компьютеры в наши дни довольно быстрые, будет ли это достаточно быстро?
источник
f1(x1) + f2(x2) == C
Есть предложения?