Це проблема оптимізації. У нас є бібліотека Java з відкритим кодом, яка вирішує цю проблему (кластеризація, коли кількість на кластер має бути між встановленими діапазонами). Потрібно, щоб ваша загальна кількість балів була не більше кількох тисяч, але не більше 5000, а може і 10000.
Бібліотека тут:
https://github.com/PGWelch/territorium/tree/master/territorium.core
Сама бібліотека налаштована на проблеми географічного типу / ГІС - тому ви побачите посилання на X і Ys, широти і довготи, клієнтів, відстань і час тощо. Ви можете просто проігнорувати "географічні" елементи, хоча і використовувати їх як чистий кластер.
Ви надаєте набір спочатку порожніх вхідних кластерів, кожний з мінімальною та максимальною цільовою кількістю. Кластерист присвоює точки вхідним кластерам, використовуючи евристичний алгоритм оптимізації (підміни, переміщення тощо). При оптимізації він, по-перше, визначає пріоритетність утримання кожного кластеру в межах його мінімального та максимального діапазону, а потім, по-друге, мінімізує відстані між усіма точками кластеру та центральною точкою кластера, тому кластер є просторово згуртованим.
Ви надаєте розв'язувачу метричну функцію (тобто функцію відстані) між точками за допомогою цього інтерфейсу:
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