2014-10-16 4 views
2

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

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

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

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

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

+0

У вас есть Neural Networks Toolbox? – tashuhka

+0

Является ли n делимым на k? – bdecaf

+0

Да, n нужно делиться на k. Виноват. – GriffinT

ответ

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 цикл: это переводит выше представление в формат матрицы вы хотите: каждая команда описываются строками, содержащей n/k метки из множества {1,2, ..., п }, красноречивая которой люди принадлежат этой команде. В каждой строке эти метки всегда увеличиваются.

  • Линия 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 
... 
+0

Казалось, это сработало! – GriffinT

1

Это довольно overkilling, но это, кажется, работает:

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 элементов, а затем я выбираю уникальные комбинации, которые следуют по вашим критериям.

+0

Nice. Но я думаю, что для более крупных случаев, таких как n = 6 и k = 2, также необходимо удалить случаи, когда команды находятся в другом порядке. – bdecaf

+0

Согласен, порядок команд в матрице не имеет значения. – GriffinT

+0

Хорошая точка! Я думаю, что 'sortrows()' решит проблему. – tashuhka

Смежные вопросы