Вот версия, основанная на ветвях и связях, с некоторыми расцветами.
1) Разбейте сетку на дерево квадрантов, с аннотациями в узлах, необходимыми для остальных.
2) Найдите самый низкий узел в четырехугольном дереве, который имеет один из каждого типа узла. Это дает вам стартовое решение, которое должно быть как минимум достаточно хорошим, чтобы ускорить оставшуюся часть поиска.
3) Выполните рекурсивный поиск, который охватывает все возможные ветви, где я говорю «угадай», сначала выбирая наиболее перспективных кандидатов, где это применимо:
3a) Угадайте вершину наименее общего типа.
3b) Используя относительное расположение точек в четырехугольном дереве, чтобы упорядочить свои догадки, угадать вершину следующего наименее распространенного типа, чтобы угадать их в порядке возрастания расстояния от исходной точки ...
3z) у вас есть полный набор вершин.
На каждом шаге 3? у вас есть частичный набор вершин, который, как я полагаю, дает вам нижнюю границу для области любого полного решения, включая эти вершины (это область внутри выпуклой оболочки вершин?). Вы можете отказаться от любых частичных решений, которые уже по крайней мере столь же велики, как самые крупные решения на данный момент. Если вы можете согласиться с неправильным ответом на X%, вы можете отказаться от любых частичных решений, которые находятся в пределах X% от самого большого решения на данный момент. Надеемся, что это удалит дерево вариантов, по которым вы перемещаетесь (3), достаточно далеко, чтобы сделать его доступным.