Чем конкретнее задача, тем лучше ее можно оптимизировать.
Например, если заранее известно, что точки равномерно разбросаны на плоскости (ограничены прямоугольником), и при этом точек очень много (иначе проще перебором), то первое, что приходит в голову, — разбить плоскость на зоны. Например, точек около 10.000, и мы делим прямоугольник на шахматную доску 10х10 клеток. В каждой клетке окажется примерно 100 точек. Далее обсчитываем не полный набор вариантов, а лишь соседние клетки. Т.е. получается уже не (10.000*9999*9998)/2 вариантов, а всего лишь (10.000*900*899)/2. Это грубый пример, но на нем видно, что эта оптимизация не универсальна, — здесь использовались два уточнения, т.е. задача более узкая.
В общем, нужно больше конкретики.