Пружины 2-х видов. Имеют 2 параметра: высота в свободном состоянии (мм), прогиб (мм). В один набор собирается комплект из 8 штук каждого вида, при том условии, что пружины в свободном состоянии и по прогибу не должны отличаться более чем на 2 мм.
Изначально есть 2 массива по виду пружин (индекс, параметр1, параметр2) с любым количеством элементов, нужно оптимально собрать 4 набора. Наборы могут быть неполными, то есть нужно максимально эффективно использовать имеющиеся пружины, недостаток закупить, поэтому простой перебор по усредненному модулю дельты параметров видится неэффективным.
(1)
1) Берём первый вид пружин и сортируем всё, что есть (для красоты)
2) для каждой пружины создаем список пружин, которые её подходят, по критериям.
(одна пружина может подходить, например двум другим пружинам, поэтому она будет фигурировать в двух наборах)
3) смотря на пункт 2, отбираем пружины, где эти кучки схожести самые большие.
4) Второй набор пружин. Делаем тоже самое, пункт 1-3
Бегая по пунктам 1-3 мы вычисляем почти готовые или готовые наборы, для каждого вида пружин.
5) Теперь берем за основу наборы Первого вида, и смотрим, что из этого подходи из Второго вида пружин.
Алгоритм можно бесконечно усложнять.
Добавить рейтинг пружин, которые долго лежат на складе, и при сортировке их отбирать в первую очередь.
Можно заниматься сортировкой и перестановкой, если это не будет слишком затратно по ресурсам, подбирая самую удобную комбинацию.
Нужно придумать веса (важность), чтобы понять сейчас лучше, чем было или хуже: собранный комплект и то, что осталось. Критерий, как сильно не хватает пар для оставшихся наборов.
Бегая по пунктам 1-3 мы вычисляем почти готовые или готовые наборы, для каждого вида пружин
Ок, идея понятна, кучки отобрали, но как уйти от полного заполнения очередного набора. Даже если маркировать элемент как уже использованный, я все равно приду к тому, что есть 3 набора полных, а 4 не хватило, хотя при переброске части и частичном наполнении набора будет задействовано больше пружин, т.е. их максимальное использование.
По сути можно упростить задачу до применения для одного вида, просто повторить алгоритм для второго и внести в тот же набор. Требования по связи 2 видов нет.
Я бы сделал такой алгоритм:
Есть пул пружин с параметрами X и Y. Находим "центр" множества точек [X, Y]. Находим ближайшую к центру точку (пружину). Это будет первая пружина первого набора. Далее из оставшегося пула ищем ближайшую точку (пружину) к нашему набору, удовлетворяющую ограничению. И так далее.
После того как подбор в первый набор окончен, переходим ко второму: снова высчитываем "центр" в оставшемся пуле и собираем следующий набор.
После того как подбор в первый набор окончен, переходим ко второму: снова высчитываем "центр" в оставшемся пуле и собираем следующий набор.
Примерно так и хотел, но проблема в том что полностью 4 набора на практике не собрать, нет такого количества пружин (именно с подходящими параметрами), наборы собираются частично. Но вы правы, задача очень похожа на кластеризацию по метод K-средних.
(отредактировал)
Как вариант находим среднее между свободным состоянием и прогибом (СС + Пр)/2, либо не среднее, а сумма параметров , сортируем по первому параметру параметру и выбираем по средней.
Если я правильно понял, то свободное состояние это высота (парамет не сильно гуляющий), а прогиб это как далеко от цента пружина может изогнуться (параметр по показателям в количестве не пересекающийся с предыдущим).