Генерування випадкових векторів з обмеженнями


10

Мені потрібно створити випадкові вектори дійсних чисел 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.

Який би був типовий алгоритм для ефективного генерування такого типу вектора?


1
Що ви маєте на увазі під четвертим обмеженням: "Величина а .."
М. Тиббіт

Моя помилка. Готовий опис. Дякуємо за відгук.
LouisChiffre

Як це a_iвипливає з розподілу, p_iа також менше цього c? Це тому, що розподіл p_iтакож менший, ніж c? В якому розподілі ви думаєте?
deps_stats

@deps_stats. Дуже хороші бали. Псевдо-код був не дуже зрозумілий. Я маю на увазі розподіл пуассона. Кожен елемент має розподіл пуассона з різною лямбда. Зважаючи на це, я думаю, що перша умова (a_i <c) не є необхідною, оскільки я можу просто змінити масштаб a_i в кінці покоління, щоб його задовольнити.
LouisChiffre

Дозвольте мені запитати що - то ще ... Є c, A, Bі лямбда фіксованою?
deps_stats

Відповіді:


4

Якщо я вас правильно зрозумів, лише точки в невеликому обсязі n-мірного простору відповідають вашим обмеженням.

Ваше перше обмеження обмежує його внутрішність гіперсфери, що нагадує мені comp.graphics.algorithms FAQ "Уніфіковані випадкові точки на сфері" та Як генерувати рівномірно розподілені точки в 3-денному кулі одиниці? Друге обмеження зрізається трохи від гіперсфери, а інші обмеження ще більше зменшують обсяг, який відповідає вашим обмеженням.

Я думаю, що найпростіше зробити один із підходів, запропонованих FAQ:

  • вибрати деяку довільну обмежувальну рамку, вирівняну за вісь яке, напевне, містить весь обсяг. У цьому випадку -c <a_1 <c, -c <a_2 <c, ... -c <a_n <c містить весь обмежений об'єм, оскільки він містить гіперсферу, описану першим обмеженням, а інші обмеження не збиваються. від цього обсягу.
  • Алгоритм рівномірно набирає точки по всьому цьому обмежувальному вікні. У цьому випадку алгоритм незалежно встановлює кожну координату вектора-кандидата на якесь незалежне рівномірно розподілене випадкове число від -c до + c. (Я припускаю, що ви хочете, щоб точки, розподілені з однаковою щільністю по всьому цьому обсягу. Я вважаю, що ви могли б змусити алгоритм вибрати деякі або всі координати за допомогою розподілу Пуассона чи іншого нерівномірного розподілу, якщо у вас були якісь причини для цього).
  • Отримавши вектор кандидата, перевірте кожне обмеження. Якщо це не вдалося жодному з них, поверніться та виберіть іншу точку.
  • Коли у вас є кандидат-вектор, зберігайте його десь для подальшого використання.
  • Якщо у вас недостатньо збережених векторів, поверніться назад і спробуйте створити ще один.

З достатньо якісним генератором випадкових чисел це дає набір збережених координат, які відповідають вашим критеріям з (очікуваною) рівномірною щільністю.

На жаль, якщо у вас порівняно велика розмірність n (тобто, якщо ви побудуєте кожен вектор із відносно довгого списку координат), вписана сфера (набагато менший ваш збитий вниз обсяг) має напрочуд невелику частину загального обсягу повне обмежувальне поле, тому може знадобитися виконати багато ітерацій, більшість з яких генерує відхилені точки за межами обмеженої області, перш ніж знайти точку у вашій обмеженій області. Оскільки комп'ютери сьогодні досить швидкі, чи буде це досить швидко?


Тож, що ви пропонуєте, - це ефективно відібрати простір. У мене є аналогічна проблема, за винятком того, що пошук обмежувального поля не може бути зроблено статично (IE, не може бути жорстко закодований). З досвіду це виходить з ладу, якщо ваші обмеження мають форму f1(x1) + f2(x2) == CБудь-які пропозиції тут?
Гроостав

Так, метод вибірки не працює, якщо у вас є обмеження рівності ("=="). Обмеження, такі як точки, що знаходяться на поверхні кулі або на поверхні циліндра тощо (радіус == R), а не всередині сфери (радіус <= R). Рівномірний вибір точок на весь об'єм "ніколи" (ймовірність близька до 0) не потрапить на бажану поверхню. Тож вам потрібно якось лише вибрати точки, які знаходяться на цій поверхні - тобто знайти точки [x1, x2, x3] такі, що f1 (x1) + f2 (x2) == C, ви можете випадковим чином вибрати x1, а потім примусити x2 = обернено_f2 (C - f1 (x1)).
Девід Кері

Про особливий випадок рівномірно розподілених точок на поверхні кулі див. "Уніфіковані випадкові точки на кулі" .
Девід Кері

@Groostav: Можливо, ваше запитання досить відрізняється від оригінального питання, щоб ви могли поставити його як нове запитання верхнього рівня? "Мені щойно сказали, що я повинен написати наступне питання, чому і як?"
Девід Кері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.