Matlab 生成所有可能的团队组合

Posted

技术标签:

【中文标题】Matlab 生成所有可能的团队组合【英文标题】:Matlab generate all possible team combinations 【发布时间】:2014-12-12 06:15:40 【问题描述】:

有很多问题与我的相似,但我还没有找到我正在寻找的东西。 我正在开展一个项目以优化班级中的团队合作,但不确定如何生成所有可能的团队组合。

假设我有一个向量,它是一个编号的人的列表,比如

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

我想生成所有可能的团队组合,每个团队有k 人,其中k 小于n。 输出应该是行是团队的矩阵。每个矩阵将有k 列和n/k 行(对应于团队的数量)。

例如,假设我的向量是&lt;1,2,3,4&gt;。我想要 2 人的所有组合。我可能的输出矩阵是 [1,2;3,4][1,3;2,4][1,4;2,3]。我想知道如何将其扩展到任何 nk 值。

【问题讨论】:

你有神经网络工具箱吗? n能被k整除吗? 是的 n 需要被 k 整除。我的错。 我不相信我有工具箱,我在其他可能的解决方案中找到了一些对它的引用。 【参考方案1】:

我只做了一些不完整的测试,但这似乎有效。

代码

%// 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 循环:这会将上述表示转换为您想要的矩阵格式:每个团队由包含来自集合 1,2,...,n/k 标签的行描述n,告诉哪些人属于该团队。在每一行中,这些标签总是在增加。

Line result = result(:,:,all(diff(result(:,1,:))&gt;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
...

【讨论】:

【参考方案2】:

这有点矫枉过正,但它似乎工作:

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(:);
    cellCombinationsii = candidate;
end

[~,idx] = unique(selCombinations, 'rows');
cellCombinationsidx

我创建n 元素的所有可能组合,然后选择符合您条件的唯一组合。

【讨论】:

不错。但我认为对于较大的情况,例如 n=6 和 k=2,还需要删除团队顺序不同的情况。 同意,矩阵中团队的顺序无关紧要。

以上是关于Matlab 生成所有可能的团队组合的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中条件选择所有可能的参数组合

matlab中1和0等概率的所有组合的二进制矩阵

在MATLAB中条件选择所有可能的参数组合

在Matlab中找到具有约束的变量的“可能”组合的算法?

生成所有可能的真/假组合

生成所有可能的组合 - Java [重复]