Problema interesante!
He hecho algo similar con los polígonos irregulares (en este caso, los edificios se empacaron para no superponerse)

Postgresql y postgis usados, y python. El algoritmo aproximado fue
- Encuentre un punto aleatorio en el cuadro delimitador del polígono (sobre_ ST)
- Si apunta fuera del polígono, retroceda un paso
- Haz una geometría para el árbol centrado en este punto aleatorio
- Si eso se superpone a cualquier árbol colocado existente (ST_Overlaps), regrese para comenzar
- Agregar árbol en el punto
- Volver a empezar
No puedo garantizar que esto dará el óptimo global, necesitaría un algoritmo de 'empaquetamiento circular' para eso (como otros han mencionado).
Continuará para siempre, por lo que deberá poner algo de código para decidir cuándo dejar de fumar, p. Ej.
- cuando el área combinada de los árboles colocados es un cierto porcentaje del área del polígono
- cuando se necesitan más de N iteraciones para encontrar un árbol no superpuesto.
Según Circle Packing en Wikipedia, la mejor densidad de empaque se logra con una cuadrícula hexagonal. Es posible crear una cuadrícula de este tipo utilizando MMQGIS, cuyo espacio se basa en el tamaño de sus árboles, que supongo que son idénticos. Luego coloca un árbol en cada vértice. Pero entonces, tiene el problema de saber dónde colocar la cuadrícula para maximizar la cantidad de árboles.