как группировать объекты, используя древовидную структуру (с Java) - PullRequest
1 голос
/ 04 мая 2011

Вот что я пытаюсь сделать:

Я работаю над программой, и часть того, что она должна делать, состоит в том, чтобы взять большую группу людей и разделить их на несколько групп (учитывая определенное количество участников / групп). Однако каждый человек должен проходить через каждую группу ровно один раз (порядок не имеет значения), и я хочу минимизировать количество людей, которые путешествуют вместе через разные группы.

До сих пор мне удавалось создать древовидную структуру, у которой корневой узел разветвляется на узел для каждой группы, каждый из которых разветвляется на узлы для всех других групп (кроме родительской группы), каждая ветвь в узлы для оставшихся групп (кроме родителя или родителя родителя и т. д.).

Это может быть визуализировано ниже (дано 5 групп - A, B, C, D, E):

Level 1:    A         B         C           D          E  
Level 2: B C D E   A C D E   A B D E     A B C E    A B C D  
Level 3 (for node E only) :                     BCD ACD ABD ABC  
etc. (with n levels for n groups)

Каждый уровень представляет одну группу всех участников, и на каждом уровне каждый участник должен быть в группе.

В моей программе каждый человек в настоящее время представлен как целое число, хранящееся в ArrayList. Весь ArrayList начинается с корня, затем делится (случайным образом) на четные группы в каждом узле (в приведенном выше примере 5 групп на первом уровне, 4 на втором и т. Д.) До конца дерева (когда каждый участник прошел через каждую группу один раз). В настоящее время я реализую это рекурсивно.

У меня возникли проблемы с выяснением, как убедиться, что количество участников в каждой группе на каждом уровне эквивалентно (или равно одному). Это легко, когда количество участников равно общему количеству узлов на последнем уровне (или нескольким из них), но становится сложнее, когда это не так (и на каждом узле участники не делятся равномерно на количество дочерних узлов).

Я не ищу конкретный код для решения этой проблемы, просто идеи о том, как я мог бы обеспечить группы одинакового размера на каждом уровне (особенно решение, которое будет работать с широким диапазоном предполагаемого количества участников и групп).

Заранее спасибо и дайте мне знать, если я не совсем уверен (поскольку мне было довольно сложно описать мою проблему)!

1 Ответ

1 голос
/ 04 мая 2011

Я думаю, что ваше описание было довольно хорошим.Если я правильно понимаю, это может относиться к семинару или к чему-то, где на разных станциях проводится несколько групповых занятий, и каждый должен делать каждую станцию ​​(но в идеале с разными группами людей).

IЯ думаю, что вы слишком усложняете свою архитектуру деревом.Почему бы не начать с деления людей на количество групп, чтобы получить соответствующее количество людей в группе (случайным образом решить, кто в какой группе стартует), а затем просто попросить каждую группу сохранить состояние о том, кто был там, а затем для каждого «движения», случайно выбрать из оставшихся людей?У вас всегда будет правильное число на группу, и у вас не будет никакого совпадения, а случайность обеспечит, чтобы люди не просто переходили из группы в группу вместе.

Если ваши люди не делятсяравномерно по количеству групп, вы всегда можете просто иметь одну группу, которая поддерживает другое число, или применять некоторую дополнительную логику, чтобы перемещать нечетное количество людей в случайную группу при каждом движении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...