首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3组组合的完整组合集

3组组合的完整组合集
EN

Stack Overflow用户
提问于 2014-06-17 08:30:39
回答 2查看 287关注 0票数 1

我需要生成组合了三个不同子集的完整组合:

  • Set 1:从13个元素的向量中选择任意4个数字。
  • Set 2:从3个元素的向量中选择任意2个数字。
  • Set 3:从9个元素的向量中选择任意2个数字。

示例:样本3来自向量为4 (H=3和L=4)的集合A,H=2 L=3用于集合B,H=2 L=4用于集合B:

代码语言:javascript
复制
           4    4   4
           3    4   4
           3    3   4
           3    3   3
           2    4   4
           2    3   4
           2    3   3
           2    2   4
Set A =    2    2   3
           2    2   2
           1    4   4
           1    3   4
           1    3   3
           1    2   4
           1    2   3
           1    2   2
           1    1   4
           1    1   3
           1    1   2
           1    1   1

           3    3
           2    3
Set B =    2    2
           1    3
           1    2
           1    1

           4    4
           3    4
           3    3
           2    4
Set C =    2    3
           2    2
           1    4
           1    3
           1    2
           1    1

[Set A] = [20 x 3][Set B] = [6 x 2][Set C] = [10 x 2]。然后我需要从这三个集合中获得所有可能的组合:AllComb = [Set A] x [Set B] x [Set C] = [1200 x 8]AllComb矩阵将如下所示:

代码语言:javascript
复制
4   4   4   |   3   3   |   4   4
4   4   4   |   3   3   |   3   4
4   4   4   |   3   3   |   3   3
4   4   4   |   3   3   |   2   4
4   4   4   |   3   3   |   2   3
4   4   4   |   3   3   |   2   2
4   4   4   |   3   3   |   1   4
4   4   4   |   3   3   |   1   3
4   4   4   |   3   3   |   1   2
4   4   4   |   3   3   |   1   1
4   4   4   |   2   3   |   4   4
4   4   4   |   2   3   |   3   4
4   4   4   |   2   3   |   3   3
4   4   4   |   2   3   |   2   4
4   4   4   |   2   3   |   2   3
                 .
                 .
                 .
1   1   1   |   1   1   |   1   1

不幸的是,我不能用相同的数字来表示集合,因为我需要替换这样的数字:

  • 对于Set A:1= 10,2= 25,3= 30,4= 45
  • 对于Set B:1= 5,2= 20和3= 35
  • 对于Set C:1= 10,2= 20,3= 30,4= 50

有什么想法吗?实际案例集往往会导致AllComb矩阵~491400x8,因此向量化解将被欣然接受。

注意:每一组都有以下代码:

代码语言:javascript
复制
a = combnk(1:H+L-1, H);
b = cumsum([a(:,1)  diff(a,[],2) - 1],2);

什么是HL

H是MultiheadWeigher (MHW)机器的漏斗。我有一个带有H=8的MHW,我需要在每个料斗中交付一些材料。如果我只需要交付一种类型的材料,那么所有可能的组合都是(L+H-1)!/(H!(L-1)!),我用上面编写的代码(ab)来计算它们。现在,假设有3个不同的乘积,那么我们有4个料斗用于产品A,2个用于B,2个用于C。产品A可以假定值为10:10:130,product,10:10:30和c 10:10:90。然后是A L=13,B L=3和C L=9的步骤数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 10:43:03

你基本上需要找到

  1. 每组重复组合
  2. 第一阶段结果的“多变体”(我不知道正确的名称)。

这两个阶段都可以用大致相同的逻辑来解决,这些逻辑取自这里

代码语言:javascript
复制
%// Stage 1, set A
LA = 4;
HA = 3;
SetA = cell(1,HA);
[SetA{:}] = ndgrid(1:LA);
SetA = cat(HA+1, SetA{:});
SetA = reshape(SetA,[],HA);
SetA = unique(sort(SetA(:,1:HA),2),'rows');

%// Stage 1, set B
LB = 3;
HB = 2;
SetB = cell(1,HB);
[SetB{:}] = ndgrid(1:LB);
SetB = cat(HB+1, SetB{:});
SetB = reshape(SetB,[],HB);
SetB = unique(sort(SetB(:,1:HB),2),'rows');

%// Stage 1, set C
LC = 4;
HC = 2;
SetC = cell(1,HC);
[SetC{:}] = ndgrid(1:LC);
SetC = cat(HC+1, SetC{:});
SetC = reshape(SetC,[],HC);
SetC = unique(sort(SetC(:,1:HC),2),'rows');

%// Stage 2
L = 3; %// number of sets
result = cell(1,L);
[result{:}] = ndgrid(1:size(SetA,1),1:size(SetB,1),1:size(SetC,1));
result = cat(L+1, result{:});
result = reshape(result,[],L);
result = [ SetA(result(:,1),:) SetB(result(:,2),:) SetC(result(:,3),:) ];
result = flipud(sortrows(result)); %// put into desired order

这给了我们

代码语言:javascript
复制
result =
     4     4     4     3     3     4     4
     4     4     4     3     3     3     4
     4     4     4     3     3     3     3
     4     4     4     3     3     2     4
     4     4     4     3     3     2     3
     4     4     4     3     3     2     2
     4     4     4     3     3     1     4
     4     4     4     3     3     1     3
     4     4     4     3     3     1     2
     4     4     4     3     3     1     1
     4     4     4     2     3     4     4
     4     4     4     2     3     3     4
     4     4     4     2     3     3     3
     4     4     4     2     3     2     4
     4     4     4     2     3     2     3
     4     4     4     2     3     2     2
     4     4     4     2     3     1     4
     4     4     4     2     3     1     3
     4     4     4     2     3     1     2
     ...        
票数 1
EN

Stack Overflow用户

发布于 2014-06-17 09:54:51

我想这可能会进一步优化,但是这会生成AllComb

代码语言:javascript
复制
H=3;
L=4;
a = combnk(1:H+L-1, H);
b = cumsum([a(:,1)  diff(a,[],2) - 1],2);
H=2;
L=3;
c = combnk(1:H+L-1, H);
d = cumsum([c(:,1)  diff(c,[],2) - 1],2);
H=2;
L=4;
e = combnk(1:H+L-1, H);
f = cumsum([e(:,1)  diff(e,[],2) - 1],2);
u=[];
for k=1:10
u=vertcat(u,d);
end
u=sortrows(u,[1 2]);
v=[];
for k=1:6
v= vertcat(v,f);
end
w= [u,v];
v=[];
for k=1:20
 v= vertcat(v,w);
end
u=[];
for k=1:60
 u = vertcat(u,b);
end
u=sortrows(u,[1 2 3]);
AllComb= [u,v];

这里,b,df是你的3套。然后,我循环计算df中的置换数,并对它们进行复制,从而构造出所有的可能性。其中一个被排序,然后我将它们写进一个新的矩阵w中。THis过程是用集A (b)和这个新构造的矩阵来重复的。导致在AllComb中结束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24259125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档