Necesito crear vectores aleatorios de números reales a_i que satisfagan las siguientes restricciones:
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.
¿Cuál sería el algoritmo típico para generar eficientemente este tipo de vector?
random-generation
LouisChiffre
fuente
fuente
a_i
sigue la distribuciónp_i
y también es menos esoc
? ¿Eso es porque la distribuciónp_i
también es menorc
? ¿En qué distribución estás pensando?c
,A
,B
y lambdas fijos?Respuestas:
Si te entiendo correctamente, solo los puntos en un pequeño volumen de espacio n-dimensional cumplen tus limitaciones.
Su primera restricción lo limita al interior de una hiperesfera, lo que me recuerda las preguntas frecuentes de comp.graphics.algorithms "Puntos aleatorios uniformes en la esfera" y ¿Cómo generar puntos distribuidos uniformemente en la bola de la unidad tridimensional? La segunda restricción se separa un poco de la hiperesfera, y las otras restricciones reducen aún más el volumen que cumple con sus restricciones.
Creo que lo más sencillo es uno de los enfoques sugeridos por las preguntas frecuentes:
Con un generador de números aleatorios de calidad suficientemente alta, esto le proporciona un conjunto de coordenadas almacenadas que cumplen sus criterios con una densidad uniforme (esperada).
Por desgracia, si tiene una dimensionalidad relativamente alta n (es decir, si construye cada vector a partir de una lista relativamente larga de coordenadas), la esfera inscrita (mucho menos su volumen reducido) tiene una parte sorprendentemente pequeña del volumen total de el cuadro delimitador total, por lo que es posible que deba ejecutar muchas iteraciones, la mayoría de ellas generando puntos rechazados fuera de su área restringida, antes de encontrar un punto dentro de su área restringida. Dado que las computadoras en estos días son bastante rápidas, ¿será lo suficientemente rápido?
fuente
f1(x1) + f2(x2) == C
Alguna sugerencia aquí?