Создайте наборы минимальной мощности из набора пар

У меня есть набор пар идентификаторов, таких как

(123;1765)
(1212;8977)...

Мне нужно разделить эти пары на n групп с индивидуальным размером (количеством пар) в каждой. Эти наборы должны иметь минимальное количество элементов (= в каждой группе должно быть как можно меньше разных идентификаторов). Существуют ли какие-либо существующие алгоритмы, решающие эту проблему? Не знаю где/как искать. Это необходимо, потому что в настоящее время я работаю над балансировкой нагрузки одного из своих проектов, и каждый узел должен загружать как можно меньше идентификаторов из-за ограниченного объема оперативной памяти (каждый идентификатор подключен к большему набору данных).

Изменить:
Немного предыстории: разные узлы в кластере должны сравнивать наборы данных, идентифицированные идентификаторами. Каждое сравнение представляет собой пару идентификаторов (сравните набор данных ID1 с ID2). Каждый узел получает набор пар, чтобы узнать, какие идентификаторы он должен сравнивать, и загружает соответствующие наборы данных в ОЗУ. Главный узел делит большую группу пар на более мелкие группы и распределяет их по подчиненным узлам. Поскольку каждый узел может хранить только ограниченное количество наборов данных, эти меньшие группы должны содержать как можно меньше разных идентификаторов. Но узлы имеют разный объем оперативной памяти, поэтому группы с минимальной кардинальностью должны иметь разный размер. Сравнение является симметричным, поэтому сравнение (ID1, ID2) совпадает с сравнением (ID2, ID1), поэтому каждая пара уникальна. Какие наборы данных необходимо сравнивать, определяет клиент, который отправляет эти задания мастеру в виде набора пар идентификаторов.

Пример: клиент хочет сравнить набор данных (1;2), (7;9), (9;105), (7;105), (2;4), (4;1) (обычно здесь должно быть намного больше сравнений, поэтому обычно миллионы) Клиент отправляет эти пары мастеру, у которого есть два зарегистрированных ведомых. Теперь мастеру нужно разделить этот стек работы на две группы, но чем больше разных идентификаторов входит в каждую группу, тем больше наборов данных нужно загрузить подчиненным (ID соответствует конкретному набору данных, помните?).

Таким образом, в идеале мастер должен создать группу вроде ((1;2), (2;4), (4;1)) (содержит только 3 разных идентификатора, поэтому подчиненному устройству нужно загрузить только 3 набора данных) и ((7;9), (9;105), (7; 105)) (опять же только три идентификатора) вместо: ((1;2), (9;105)...) и ((2;4), (7;105)...). Здесь обоим подчиненным необходимо загрузить 4 идентификатора и более, и, например. обоим ведомым устройствам необходимо загрузить наборы данных нет. 2 и 105. Это надо как-то оптимизировать..


person dvs23    schedule 22.06.2017    source источник
comment
Можете ли вы предоставить больше информации о вашей конкретной проблеме? Вам нужен алгоритм, который избавляется от повторяющихся идентификаторов, или алгоритм, который группирует похожие идентификаторы, или что-то еще?   -  person Jayson Boubin    schedule 23.06.2017
comment
@JaysonBoubin Добавлена ​​справочная информация для публикации :)   -  person dvs23    schedule 24.06.2017
comment
какие наборы данных нужно сравнивать? те, у кого одинаковые идентификаторы?   -  person Andriy Tylychko    schedule 24.06.2017
comment
Нет, один и тот же идентификатор соответствует одному и тому же набору данных, поэтому сравнивать набор данных с самим собой было бы как-то бесполезно. Какие наборы данных необходимо сравнить, клиент отправит мастеру в виде задания (одно задание — это пара идентификаторов)   -  person dvs23    schedule 24.06.2017
comment
@Gruffalo добавил пример   -  person dvs23    schedule 24.06.2017


Ответы (1)


Мой первый инстинкт — сказать, что, возможно, это можно решить с помощью специального кластерного анализа, где вы настраиваете функции агрегации и расстояния.

  • Члены кластера будут парами.
  • Совокупность кластера будет теоретико-множественным объединением всех пар в кластере (это вместо среднего или медианы в стандартном подходе).
  • Функция расстояния любой пары по сравнению с кластером будет представлять собой количество элементов в паре, которые не найдены в агрегате кластера (то есть кардинальность установленной разницы; это заменяет евклидово расстояние в стандартном подходе).
  • В некоторых кластерных алгоритмах вы заранее устанавливаете количество желаемых кластеров, поэтому вы должны установить его равным двум.
  • И, наконец, потому что вам нужно сбалансировать вещи, чтобы агрегаты кластера имели одинаковое количество элементов, дальнейшую настройку, но все же выполнимую.

Но вы говорите, что у вас будут миллионы точек для сравнения. Обработка, необходимая для кластерного анализа, увеличивается в геометрической прогрессии по мере того, как вы вводите больше входных данных. В этой ситуации стоит выяснить, является ли ваша проблема NP или NP-полной. Я не очень хорошо в этом разбираюсь, но подозреваю, что да, и в этом случае истинный оптимум всегда ускользнет от вас.

Но если вы обнаружите, что ваша задача на самом деле является NP-полной, то вы все равно можете оптимизировать, просто вы не сможете гарантировать достижение глобального оптимума за разумное время. Так, например, вы можете разбить свой набор пар на подмножества и запустить алгоритм, подобный приведенному выше, на подмножествах. Это все еще может быть улучшением.

person pwilcox    schedule 28.06.2017