有很多问题与我的类似,但我还没有找到我想要的东西。 我正在开展一个项目来优化类(class)中的团队合作,但不确定如何生成所有可能的团队组合。
假设我有一个向量,其中包含编号的人员列表,例如
<1,2,3,4,5....,n>
我想用 k
生成所有可能的团队组合每个团队的人数,其中 k
小于 n
。
输出应该是矩阵,其中行是团队。每个矩阵都有 k
列,和n/k
行(对应于团队数量)。
例如,假设我的向量是 <1,2,3,4>
。我想要 2 人团队的所有组合。我可能的输出矩阵将是 [1,2;3,4]
, [1,3;2,4]
,和[1,4;2,3]
。我想知道如何将其扩展到任何 n
和k
值。
最佳答案
我只做了一些不完整的测试,但这似乎有效。
代码:
%// 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,...,n},告诉哪些人属于该团队。在每一行中,这些标签始终在增加。Line
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
...
关于Matlab 生成所有可能的团队组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26411869/