Проблема в NP Hard, но это только для оптимального решения. Я думаю, что вы действительно хотите, это решение, которое просто выглядит хорошо.
Поэтому я предлагаю поискать алгоритмы, которые делают данные хорошо выглядящими. Однажды мне захотелось создать макеты картинок для DeepZoom Composer, и я попытался переработать алгоритм, основанный на силовом взаимодействии при рисовании графика. http://en.wikipedia.org/wiki/Force-based_algorithms
Он работал очень хорошо даже для 600 сотен прямоугольников, вам просто нужно поиграть с деталями симуляции.
- Как рассчитывается расстояние?
- Какие функции вы используете для сил притяжения и отталкивания?
- Как много совпадений вы собираетесь принять?
Единственная проблема, которую я не смог полностью решить, заключалась в том, что прямоугольники образовывали форму круга, а не большую форму прямоугольника, что естественно, когда вы моделируете физику. Но вы можете обойти это с помощью тщательно расположенных вспомогательных источников силы.