Algoritmo para calcular las posiciones de los círculos al azar para que no se superpongan

Tengo el siguiente problema.

Tengo una gran región poblada con un número aleatorio de círculos de diferentes tamaños. Si se inserta un nuevo círculo de radio aleatorio en una ubicación aleatoria, me gustaría encontrar una posición cercana para que no se superponga con ninguna de las otras. Es óptimo si los círculos se mantienen cerca.

El número de círculos y su tamaño son limitados, pero aleatorios. La región será bastante grande, (2500x2500, tal vez), por lo que una matriz de píxeles como se proponeaquí está fuera de cuestión Una persona que respondió la misma pregunta propuso una cuadrícula, en la cual las celdas son del tamaño de los círculos. Eso solucionaría mi problema, usando celdas del tamaño del círculo más grande posible, pero me gustaría que los círculos se mantuvieran lo más cerca posible, para que no satisficiera completamente mis necesidades.

Un enfoque muy básico consiste en detectar colisiones en la ubicación del nuevo círculo y alejarlo del círculo con el que colisiona. Después de eso, revisa las colisiones y repite el proceso. Esto obviamente no es muy elegante y es propenso a bucles infinitos (más a menudo de lo que piensas).

El objetivo es encontrar la posición más cercana posible para el círculo recién insertado para que no se superponga con nadie más.

P.D.
Una cosa muy bonita, pero un asunto diferente, y no mi objetivo principal, sería reorganizar tantos círculos como sea necesario, en lugar de reubicar solo uno, como si estuvieran "presionando" entre sí. Yo preferiría la distancia sobre el número de círculos movidos. Es decir, preferiría que muchos círculos se muevan un poco más que un círculo para alejarse mucho de su posición original.

Respuestas a la pregunta(3)

Su respuesta a la pregunta