Я думаю, будет трудно найти оптимальный алгоритм.Я не удивлюсь, если это окажется NP-трудной проблемой.Однако, если вы заинтересованы в практическом алгоритме, который дает достойные решения, я рекомендую взглянуть на алгоритмы рисования графов на основе силы .
Вот общая идея (немного выше математика. будет появляться).Он обобщает на любое количество измерений.
Создайте функцию f
, которая присваивает значение каждому разметке узла - значение, которое вы хотите минимизировать.В вашем случае функция могла бы вычислить площадь выпуклой оболочки для данного макета + большой штраф за каждое несоблюдение ограничения.Или это может быть более простая функция g
, которая разумно приближается к предыдущей: короче говоря, мы хотим, чтобы g
уменьшался всякий раз, когда f
уменьшается, и наоборот.Хорошо выбрать относительно простую функцию, потому что вам нужно будет вычислить ее частные производные (по координатам узлов).
Теперь предположим, что у вас есть 100 узлов, и вы хотите их разложитьв 3D.Это означает, что у вас есть 300 неизвестных чисел (100 узлов на 3 координаты для каждого узла).Функция f
является функцией от R 300 до R , и в идеале мы хотим найти ее глобальный минимум.Более реалистично будет достаточно глубокого локального минимума.
Хорошо известны численные алгоритмы для нахождения такого минимума, например: Сопряженный градиент , BFGS .Хорошо, что вам не нужно разбираться в них подробно, эти алгоритмы реализованы на многих языках.Все, что вам нужно сделать, это предоставить метод вычисления f(x)
и f'(x)
для любого x
, запрошенного алгоритмом, и начальную компоновку x₀
.