Это проблема оптимизации. У нас есть Java-библиотека с открытым исходным кодом, которая решает эту проблему (кластеризация, где количество на кластер должно быть между заданными диапазонами). Вам нужно, чтобы ваше общее количество очков было не более нескольких тысяч, но не более 5000 или, может быть, 10000.
Библиотека находится здесь:
https://github.com/PGWelch/territorium/tree/master/territorium.core
Сама библиотека настроена на проблемы географического / ГИС-типа - поэтому вы увидите ссылки на X и Y, широты и долготы, клиентов, расстояние и время и т. Д. Вы можете просто игнорировать «географические» элементы и использовать их как чистый кластеризатор.
Вы предоставляете набор изначально пустых входных кластеров, каждый из которых имеет минимальное и максимальное целевое количество. Кластерер назначит точки вашим входным кластерам, используя эвристический алгоритм оптимизации (свопы, ходы и т. Д.). При оптимизации он, во-первых, устанавливает приоритеты для каждого кластера в пределах своего минимального и максимального количественного диапазона, а затем, во-вторых, минимизирует расстояния между всеми точками в кластере и центральной точкой кластера, поэтому кластер является пространственно связным.
Вы предоставляете решателю метрическую функцию (то есть функцию расстояния) между точками, используя этот интерфейс:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java
Метрика на самом деле структурирована так, чтобы возвращать как расстояние, так и «время», потому что она предназначена для географических задач, основанных на путешествиях, но для произвольных проблем кластеризации просто установите «время» равным нулю, а расстояние - как фактическую метрику, которую вы используете между точки.
Вы бы настроили свою проблему в этом классе:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java
Ваши баллы будут «Клиенты», а их количество будет 1. В классе клиентов убедитесь, что вы установили costPerUnitTime = 0 и costPerUnitDistance = 1, предполагая, что вы возвращаете метрическое расстояние в поле «расстояние», возвращаемое TravelMatrix.
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java
Смотрите здесь пример запуска решателя:
https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java