Вы не хотите дважды считать любой сегмент, поэтому ваш алгоритм должен быть двойным для цикла. Внешний цикл переходит от A к M (вам не нужно проверять N, потому что для него ничего не останется подключиться), каждый раз переходя от curPoint к N, вычисляя каждое расстояние. Вы добавляете все расстояния и делите их на количество точек (n-1) ^ 2/2. Должно быть довольно просто.
Не существует каких-либо стандартных алгоритмов для улучшения этого, о которых я знаю, и это не является широко изученной проблемой. Я предполагаю, что вы могли бы получить довольно разумную оценку (если оценка полезна) путем выборки расстояний от каждой точки до нескольких других. Но это предположение.
(После просмотра вашего кода) Вот еще одна попытка:
public double avgDistanceInCluster() {
double totDistance = 0.0;
for (int i = 0; i < bigCluster.length - 1; i++) {
for (int j = i+1; j < bigCluster.length; j++) {
totDistance += distance(bigCluster[i], bigCluster[j]);
}
}
return totDistance / (bigCluster.length * (bigCluster.length - 1)) / 2;
}
Обратите внимание, что предел для первого цикла отличается.
Расстояние между двумя точками, вероятно, sqrt((x1 - x2)^2 + (y1 -y2)^2)
.