Matlab сгенерирует все возможные комбинации команд

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

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

<1,2,3,4,5....,n>

Я хочу создать все возможные комбинации команд с k людьми в команде, где k меньше n. На выходе должны быть матрицы, в которых строки - это команды. Каждая матрица будет иметь k столбцов и n/k строк (соответствующих количеству команд).

Например, скажем, мой вектор is<1,2,3,4>. Мне нужны все комбинации команд по 2 человека. Мои возможные выходные матрицы: _8 _, _ 9_ и [1,4;2,3]. Я хотел бы знать, как масштабировать это до любого значения n и k.


person fina    schedule 16.10.2014    source источник
comment
У вас есть набор инструментов нейронных сетей?   -  person tashuhka    schedule 17.10.2014
comment
Делится ли n на k?   -  person bdecaf    schedule 17.10.2014
comment
Да, n должно делиться на k. Виноват.   -  person fina    schedule 17.10.2014
comment
И я не верю, что у меня есть Toolbox, я нашел некоторые ссылки на него в других возможных решениях.   -  person fina    schedule 17.10.2014


Ответы (2)


Я провел лишь неполное тестирование, но, похоже, это сработало.

Код:

%// Data:
n = 6; %// number of people
k = 2; %// team size. Assumed to divide p

%// Let's go:
M = unique(perms(ceil((1:n)/k)), 'rows').'; %'// the transpose is for convenience
result = NaN(n/k, k, size(M,2)); %// preallocate
for t = 1:n/k
    [ii, ~] = find(M==t);
    result(t,:,:) = reshape(ii, k, []);
end
result = result(:,:,all(diff(result(:,1,:))>0, 1));

Матрицы результатов представлены как result(:,:,1), result(:,:,2) и т. Д.

Объяснение:

Ключевые шаги:

  • Строка M = unique(perms(ceil((1:n)/k)), 'rows').': присваивает k разные номера команд, по одному каждой группе из n/k человек, и создает все различные перестановки этих номеров. Это включает в себя все возможные группировки команд.

  • for loop: это переводит приведенное выше представление в желаемый формат матрицы: каждая команда описывается строкой, содержащей n/k меток из набора {1,2, ..., n}, указывающих, какие люди принадлежат к этой команде. В каждой строке эти метки всегда увеличиваются.

  • Строка result = result(:,:,all(diff(result(:,1,:))>0, 1)): удаляет матрицы, которые являются перестановками строк других. Это достигается за счет сохранения только матриц, первый столбец которых увеличивается.

Примеры:

Для n=4; k=2,

>> result
result(:,:,1) =
     1     2
     3     4
result(:,:,2) =
     1     3
     2     4
result(:,:,3) =
     1     4
     2     3

Для n=6; k=2,

>> result
result(:,:,1) =
     1     2
     3     4
     5     6
result(:,:,2) =
     1     2
     3     5
     4     6
result(:,:,3) =
     1     2
     3     6
     4     5
result(:,:,4) =
     1     3
     2     4
     5     6
...
person Luis Mendo    schedule 16.10.2014

Это довольно сложно, но, похоже, работает:

n = 4;
k = 2;

allCombinations = perms(1:n);

numComb = size(allCombinations,1);
selCombinations = zeros(size(allCombinations));
cellCombinations = cell(numComb,1);
for ii = 1:numComb
    candidate = sortrows(sort(reshape(allCombinations(ii,:),[],k),2));
    selCombinations(ii,:) = candidate(:);
    cellCombinations{ii} = candidate;
end

[~,idx] = unique(selCombinations, 'rows');
cellCombinations{idx}

Я создаю все возможные комбинации n элементов, а затем выбираю уникальные комбинации, соответствующие вашим критериям.

person tashuhka    schedule 16.10.2014
comment
Хороший. Но я думаю, что для более крупных случаев, таких как n = 6 и k = 2, также нужно будет удалить случаи, когда команды находятся в разном порядке. - person bdecaf; 17.10.2014
comment
Согласны, порядок команд в матрице не имеет значения. - person fina; 17.10.2014