Durante el desarrollo de mi simulación de N-body con visualización en WebGL, ideé una optimización, y me pregunto si tiene un nombre. Me parece poco probable que nunca se haya hecho antes.
Funciona así: durante el primer paso de tiempo, haga una iteración de todos los pares. Durante esa iteración, para cada partícula:
- Almacene todas las interacciones cercanas en una lista, que representa todas las partículas cercanas a esta. Estas interacciones se evaluarán a partir de ese momento en cada paso. Esta lista normalmente contendría un puñado de entradas.
- Itere en todas las otras partículas y calcule una fuerza lejana neta que almacena con la partícula. Por lo tanto, esta fuerza neta se recuerda entre pasos de tiempo y se aplica continuamente a la partícula.
Luego, a medida que la simulación continúa más allá de su primer paso de tiempo, en una forma de turno redondo, cada paso de tiempo actualiza una pequeña cantidad de listas de interacciones cercanas y fuerzas lejanas netas de las partículas . De modo que durante un cierto número de pasos de tiempo, digamos 1000, todas las interacciones cercanas de las partículas y las fuerzas netas lejanas se habrán actualizado. Los que no actualices solo verificarán sus interacciones cercanas y aplicarán la fuerza lejana neta. En este ejemplo, la complejidad computacional de cada paso de tiempo es algo así como en lugar de N 2 .
Un truco para hacer que esto sea razonablemente preciso es identificar mejor las "interacciones cercanas". A veces, la proximidad no es el mejor indicador: también puede considerar la masa y la velocidad relativa, etc. "Interacciones más significativas" podría ser una mejor palabra. O "es muy probable que cambie las interacciones pronto".
Esta optimización permite muchas más partículas interactivas que el método de todos los pares, pero no estoy seguro de cómo describirlo en términos O (), ya que no hace una solución completa cada paso de tiempo, pero reutiliza (ligeramente incorrecto) viejo información y extiende el esfuerzo computacional a lo largo del tiempo.
( Descargo de responsabilidad: mi simulación webgl también tiene partículas "vfx" que solo se ven afectadas por la gravedad y no corresponden al efecto, por lo que no es tan increíblemente rápido como podría parecer )
Entonces, ¿esta técnica de optimización tiene un nombre?