Цікава проблема!
Я робив подібну річ з неправильними багатокутниками (у цьому випадку будівлі були упаковані, щоб не перекриватися)

Використовуються postgresql і postgis, і python. Приблизний алгоритм був
- Знайти випадкову точку в обмежувальному полі полігону (ST_Envelope)
- Якщо вказуєте поза полігоном, поверніться на один крок назад
- Складіть геометрію для дерева з центром цієї випадкової точки
- Якщо це перекриває будь-яке існуюче розміщене дерево (ST_Overlaps), поверніться до початку
- Додайте дерево в точку
- Поверніться до початку
Я не можу гарантувати, що це дасть глобальний оптимум, для цього вам знадобиться алгоритм "упаковки в коло" (як уже згадували інші).
Він триватиме назавжди, тому вам потрібно буде ввести якийсь код, щоб вирішити, коли його вийти, наприклад
- при суміщеній площі розміщених дерев - це певний відсоток площі багатокутника
- коли для пошуку дерева, що не перекривається, потрібно більше N ітерацій.
За даними Circle Packing у Вікіпедії, найкраща щільність упаковки досягається шестикутною сіткою. Можливо, можливо створити таку сітку за допомогою MMQGIS, інтервал якої базується на розмірі ваших дерев, які я вважаю однаковими. Потім розміщуємо дерево на кожній вершині. Але тоді у вас виникає проблема знати, де розмістити сітку, щоб максимально збільшити кількість дерев.