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

标签 matlab combinations discrete-mathematics

有很多问题与我的类似,但我还没有找到我想要的东西。 我正在开展一个项目来优化类(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] 。我想知道如何将其扩展到任何 nk值。

最佳答案

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

代码:

%// 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/

相关文章:

matlab - Matlab中的函数实现

image - Matlab 中的运动历史图像 (MHI)

python - 如何从允许重复的python列表中获取所有可能的组合

Java:成对组合数组中的元素

python - 符合条件的所有可能组合

python - 如何找到以某种方式更改字符串的递归函数的基本情况

visual-studio-2010 - 设置 mex 以使用 Visual Studio 2010 编译器

c++ - OpenCV如何在matlab中共享库?

javascript - 反向排列指数

algorithm - 变量 m 更新了多少次