Что я хотел бы сделать, так это разделить группу из (n) элементов на группы одинакового размера (группы размера m, и для простоты Предположим, что остатков нет, т.е. n делится на m). Выполняя это несколько раз, я хотел бы гарантировать, что ни одна пара элементов не окажется в одной и той же группе дважды.
Чтобы сделать это немного более конкретным, для создания групп из двух из шести элементов A..F
раз можно разделить набор пять раз по-разному:
(A, B)
,(C, D)
,(E, F)
(A, C)
,(B, E)
,(D, F)
(A, D)
,(B, F)
,(C, E)
(A, E)
,(B, D)
,(C, F)
(A, F)
,(B, C)
,(D, E)
Один и тот же набор элементов можно разбить только один раз на группы по три без перекрывающихся пар:
(A, B, C)
,(D, E, F)
(Как указывает @DavidHammen ниже, в этом примере есть разные способы создания раздела. Однако, сделав раздел один раз, никогда не будет другого, второго разделения, которое разделяет все пары элементов. Это нормально -- моему приложению не нужно генерировать все возможные способы глобального разделения набора, достаточно одного решения, удовлетворяющего ограничениям)
Мой вопрос сейчас таков: есть ли способ сделать это эффективно? Есть ли способы ускорить создание этих наборов?
До сих пор я рассматривал это как проблему с точное покрытие и решал ее с помощью алгоритм поиска с возвратом (вариант DLX). Это очень хорошо работает для пар, но по мере того, как группы становятся больше, количество возможностей, которые алгоритм должен учитывать, увеличивается, и обработка становится очень громоздкой.
Я ищу приемы для ускорения работы. Приветствуются любые идеи, в частности (но не ограничиваясь ими):
- Оптимизации и эвристики для уменьшения количества возможностей, которые необходимо рассмотреть перед решением (например, из приведенных выше примеров видно, что первое разбиение может быть сделано просто произвольно, а первый набор каждый раздел [первый столбец выше] может быть сгенерирован автоматически).
- Существуют ли варианты возврата, способные справиться с огромным количеством кандидатов? (т.е. не нужно заранее генерировать все возможности)
- Другие алгоритмы, подходы или математические концепции, которые мне следует рассмотреть?
Любые идеи и предложения очень приветствуются. Большое спасибо за внимание!
Обновить
Итак, это было давно, но я потратил на это гораздо больше времени и хотел вернуться к вам. @david-eisenstat поставил меня на правильный путь, предоставив мне правильный поисковый запрос (большое спасибо!) — с тех пор я довольно много читал о проблеме социального игрока в гольф.
Один из лучших ресурсов, который я нашел и которым я хотел бы поделиться здесь, — это работа Markus Triska, который обсуждает несколько подходов (а затем представляет очень хороший алгоритм) в своей диссертации. Это настоятельно рекомендуется, если кто-то сталкивается с подобной проблемой!
((A B D), (C E F))
и((A B E) (C D F))
и еще как минимум с шестью? В заявленном вопросе не указывается, почему вы исключили эти комбинации. - person David Hammen   schedule 27.09.2015